void SQLiteStatement::getColumnBlobAsVector(int col, Vector<char>& result) { ASSERT(col >= 0); if (!m_statement && prepareAndStep() != SQLITE_ROW) { result.clear(); return; } if (columnCount() <= col) { result.clear(); return; } const void* blob = sqlite3_column_blob(m_statement, col); if (!blob) { result.clear(); return; } int size = sqlite3_column_bytes(m_statement, col); result.resize((size_t)size); for (int i = 0; i < size; ++i) result[i] = (static_cast<const unsigned char*>(blob))[i]; }
SQLValue SQLiteStatement::getColumnValue(int col) { ASSERT(col >= 0); if (!m_statement) if (prepareAndStep() != SQLITE_ROW) return SQLValue(); if (columnCount() <= col) return SQLValue(); // SQLite is typed per value. optional column types are // "(mostly) ignored" sqlite3_value* value = sqlite3_column_value(m_statement, col); switch (sqlite3_value_type(value)) { case SQLITE_INTEGER: // SQLValue and JS don't represent integers, so use FLOAT -case case SQLITE_FLOAT: return SQLValue(sqlite3_value_double(value)); case SQLITE_BLOB: // SQLValue and JS don't represent blobs, so use TEXT -case case SQLITE_TEXT: { const UChar* string = reinterpret_cast<const UChar*>(sqlite3_value_text16(value)); unsigned length = WTF::lengthOfNullTerminatedString(string); return SQLValue(StringImpl::create8BitIfPossible(string, length)); } case SQLITE_NULL: return SQLValue(); default: break; } ASSERT_NOT_REACHED(); return SQLValue(); }
int64_t SQLiteStatement::getColumnInt64(int col) { ASSERT(col >= 0); if (!m_statement) if (prepareAndStep() != SQLITE_ROW) return 0; if (columnCount() <= col) return 0; return sqlite3_column_int64(m_statement, col); }
double SQLiteStatement::getColumnDouble(int col) { ASSERT(col >= 0); if (!m_statement) if (prepareAndStep() != SQLITE_ROW) return 0.0; if (columnCount() <= col) return 0.0; return sqlite3_column_double(m_statement, col); }
String SQLiteStatement::getColumnName(int col) { ASSERT(col >= 0); if (!m_statement) if (prepareAndStep() != SQLITE_ROW) return String(); if (columnCount() <= col) return String(); return String(reinterpret_cast<const UChar*>(sqlite3_column_name16(m_statement, col))); }
String SQLiteStatement::getColumnText(int col) { ASSERT(col >= 0); if (!m_statement) if (prepareAndStep() != SQLITE_ROW) return String(); if (columnCount() <= col) return String(); return String(reinterpret_cast<const UChar*>(sqlite3_column_text16(m_statement, col)), sqlite3_column_bytes16(m_statement, col) / sizeof(UChar)); }
bool SQLiteStatement::isColumnNull(int col) { ASSERT(col >= 0); if (!m_statement) if (prepareAndStep() != SQLITE_ROW) return false; if (columnCount() <= col) return false; return sqlite3_column_type(m_statement, col) == SQLITE_NULL; }
String SQLiteStatement::getColumnBlobAsString(int col) { ASSERT(col >= 0); if (!m_statement && prepareAndStep() != SQLITE_ROW) return String(); if (columnCount() <= col) return String(); const void* blob = sqlite3_column_blob(m_statement, col); if (!blob) return String(); int size = sqlite3_column_bytes(m_statement, col); if (size < 0) return String(); ASSERT(!(size % sizeof(UChar))); return String(static_cast<const UChar*>(blob), size / sizeof(UChar)); }