sql_value to_value(const shared_ptr<sqlite3_stmt> &stmt, int column) { if (stmt == nullptr || column < 0 || column >= sqlite3_column_count(stmt.get())) { return sql_value(); } switch (sqlite3_column_type(stmt.get(), column)) { case SQLITE_INTEGER: return sql_number(sqlite3_column_int64(stmt.get(), column)); case SQLITE3_TEXT: default: { const unsigned char *textValue = sqlite3_column_text(stmt.get(), column); if (textValue != NULL) { return sql_string(reinterpret_cast<const char *>(textValue)); } return sql_value(); } case SQLITE_FLOAT: return sql_number(sqlite3_column_double(stmt.get(), column)); case SQLITE_BLOB: { const unsigned char *blob = reinterpret_cast<const unsigned char *>(sqlite3_column_blob(stmt.get(), column)); return sql_blob(blob, blob + sqlite3_column_bytes(stmt.get(), column)); } } }
sql_value::operator sql_number() const { try { return as<sql_number>(); } catch (const value_conversion_error &e) { return sql_number(); } }
sql_number operator()(const sql_null_type &value) const { return sql_number(value); }
sql_number operator()(const sql_wstring &value) const { return sql_number(value); }
sql_value::sql_value(const long double &value) : value_(sql_number(value)) { }
sql_value::sql_value(const float &value) : value_(sql_number(value)) { }
sql_value::sql_value(const unsigned long long &value) : value_(sql_number(value)) { }
sql_value::sql_value(const long long &value) : value_(sql_number(value)) { }
sql_value::sql_value(const unsigned int &value) : value_(sql_number(value)) { }
sql_value::sql_value(const int &value) : value_(sql_number(value)) { }
sql_value::sql_value(const short &value) : value_(sql_number(value)) { }
sql_value::sql_value(const wchar_t &value) : value_(sql_number(value)) { }
sql_value::sql_value(const char &value) : value_(sql_number(value)) { }
sql_value::sql_value(const bool &value) : value_(sql_number(value)) { }