From f14743ef28248ea8a8ad9bae1c7c3d6a354da257 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 14 Mar 2011 16:36:58 +0200 Subject: Add support for SQLite type system, adjust code generators --- odb/relational/sqlite/common.cxx | 246 +++------------------------------------ 1 file changed, 17 insertions(+), 229 deletions(-) (limited to 'odb/relational/sqlite/common.cxx') diff --git a/odb/relational/sqlite/common.cxx b/odb/relational/sqlite/common.cxx index 31f0aad..c8169a7 100644 --- a/odb/relational/sqlite/common.cxx +++ b/odb/relational/sqlite/common.cxx @@ -85,99 +85,24 @@ namespace relational { switch (mi.st->type) { - // Integral types. - // - case sql_type::TINYINT: - case sql_type::SMALLINT: - case sql_type::MEDIUMINT: - case sql_type::INT: - case sql_type::BIGINT: + case sql_type::INTEGER: { traverse_integer (mi); break; } - - // Float types. - // - case sql_type::FLOAT: - case sql_type::DOUBLE: - { - traverse_float (mi); - break; - } - case sql_type::DECIMAL: - { - traverse_decimal (mi); - break; - } - - // Data-time types. - // - case sql_type::DATE: - case sql_type::TIME: - case sql_type::DATETIME: - case sql_type::TIMESTAMP: - case sql_type::YEAR: + case sql_type::REAL: { - traverse_date_time (mi); + traverse_real (mi); break; } - - // String and binary types. - // - case sql_type::CHAR: - case sql_type::VARCHAR: - case sql_type::TINYTEXT: case sql_type::TEXT: - case sql_type::MEDIUMTEXT: - case sql_type::LONGTEXT: - { - // For string types the limit is in characters rather - // than in bytes. The fixed-length pre-allocated buffer - // optimization can only be used for 1-byte encodings. - // To support this we will need the character encoding - // in sql_type. - // - traverse_long_string (mi); - break; - } - case sql_type::BINARY: - case sql_type::TINYBLOB: { - // BINARY's range is always 255 or less from MySQL 5.0.3. - // TINYBLOB can only store up to 255 bytes. - // - traverse_short_string (mi); + traverse_text (mi); break; } - case sql_type::VARBINARY: case sql_type::BLOB: - case sql_type::MEDIUMBLOB: - case sql_type::LONGBLOB: - { - if (mi.st->range && mi.st->range_value <= 255) - traverse_short_string (mi); - else - traverse_long_string (mi); - - break; - } - - // Other types. - // - case sql_type::BIT: - { - traverse_bit (mi); - break; - } - case sql_type::ENUM: { - traverse_enum (mi); - break; - } - case sql_type::SET: - { - traverse_set (mi); + traverse_blob (mi); break; } case sql_type::invalid: @@ -192,24 +117,6 @@ namespace relational // member_image_type // - namespace - { - const char* integer_types[] = - { - "char", - "short", - "int", - "int", - "long long" - }; - - const char* float_types[] = - { - "float", - "double" - }; - } - member_image_type:: member_image_type (semantics::type* type, string const& fq_type, @@ -233,35 +140,15 @@ namespace relational } void member_image_type:: - traverse_integer (member_info& mi) - { - if (mi.st->unsign) - type_ = "unsigned "; - else if (mi.st->type == sql_type::TINYINT) - type_ = "signed "; - - type_ += integer_types[mi.st->type - sql_type::TINYINT]; - } - - void member_image_type:: - traverse_float (member_info& mi) - { - type_ = float_types[mi.st->type - sql_type::FLOAT]; - } - - void member_image_type:: - traverse_decimal (member_info&) + traverse_integer (member_info&) { - type_ = "details::buffer"; + type_ = "long long"; } void member_image_type:: - traverse_date_time (member_info& mi) + traverse_real (member_info&) { - if (mi.st->type == sql_type::YEAR) - type_ = "short"; - else - type_ = "MYSQL_TIME"; + type_ = "double"; } void member_image_type:: @@ -270,80 +157,10 @@ namespace relational type_ = "details::buffer"; } - void member_image_type:: - traverse_bit (member_info&) - { - type_ = "unsigned char*"; - } - - void member_image_type:: - traverse_enum (member_info&) - { - // Represented as string. - // - type_ = "details::buffer"; - } - - void member_image_type:: - traverse_set (member_info&) - { - // Represented as string. - // - type_ = "details::buffer"; - } - // // member_database_type // - namespace - { - const char* integer_database_id[] = - { - "id_tiny", - "id_utiny", - "id_short", - "id_ushort", - "id_long", // INT24 - "id_ulong", // INT24 UNSIGNED - "id_long", - "id_ulong", - "id_longlong", - "id_ulonglong" - }; - - const char* float_database_id[] = - { - "id_float", - "id_double" - }; - - const char* date_time_database_id[] = - { - "id_date", - "id_time", - "id_datetime", - "id_timestamp", - "id_year" - }; - - const char* char_bin_database_id[] = - { - "id_string", // CHAR - "id_blob", // BINARY, - "id_string", // VARCHAR - "id_blob", // VARBINARY - "id_string", // TINYTEXT - "id_blob", // TINYBLOB - "id_string", // TEXT - "id_blob", // BLOB - "id_string", // MEDIUMTEXT - "id_blob", // MEDIUMBLOB - "id_string", // LONGTEXT - "id_blob" // LONGBLOB - }; - } - member_database_type_id:: member_database_type_id (semantics::type* type, string const& fq_type, @@ -367,56 +184,27 @@ namespace relational } void member_database_type_id:: - traverse_integer (member_info& mi) - { - size_t i ( - (mi.st->type - sql_type::TINYINT) * 2 + (mi.st->unsign ? 1 : 0)); - type_id_ = string ("mysql::") + integer_database_id[i]; - } - - void member_database_type_id:: - traverse_float (member_info& mi) - { - type_id_ = string ("mysql::") + - float_database_id[mi.st->type - sql_type::FLOAT]; - } - - void member_database_type_id:: - traverse_decimal (member_info&) - { - type_id_ = "mysql::id_decimal"; - } - - void member_database_type_id:: - traverse_date_time (member_info& mi) - { - type_id_ = string ("mysql::") + - date_time_database_id[mi.st->type - sql_type::DATE]; - } - - void member_database_type_id:: - traverse_string (member_info& mi) + traverse_integer (member_info&) { - type_id_ = string ("mysql::") + - char_bin_database_id[mi.st->type - sql_type::CHAR]; + type_id_ = "sqlite::id_integer"; } void member_database_type_id:: - traverse_bit (member_info&) + traverse_real (member_info&) { - type_id_ = "mysql::id_bit"; + type_id_ = "sqlite::id_real"; } void member_database_type_id:: - traverse_enum (member_info&) + traverse_text (member_info&) { - type_id_ = "mysql::id_enum"; + type_id_ = "sqlite::id_text"; } void member_database_type_id:: - traverse_set (member_info&) + traverse_blob (member_info&) { - type_id_ = "mysql::id_set"; + type_id_ = "sqlite::id_blob"; } // -- cgit v1.1