29
29
FieldTypes::FieldTypes(const Glib::RefPtr<Gnome::Gda::Connection>& gda_connection)
31
31
// These are documented here:
32
// http://www.gnome-db.org/docs/libgda/libgda-provider-class.html#LIBGDA-PROVIDER-GET-SCHEMA
32
// http://library.gnome.org/devel/libgda-4.0/3.99/connection.html#GdaConnectionMetaTypeHead
33
33
enum GlomGdaDataModelTypesColumns
35
35
DATAMODEL_FIELDS_COL_NAME = 0,
36
DATAMODEL_FIELDS_COL_OWNER = 1,
36
DATAMODEL_FIELDS_COL_GTYPE = 1,
37
37
DATAMODEL_FIELDS_COL_COMMENTS = 2,
38
DATAMODEL_FIELDS_COL_GDATYPE = 3
38
DATAMODEL_FIELDS_COL_SYNONYMS = 3
41
41
if(gda_connection && gda_connection->is_opened())
43
//Read the Types information, so that we can map the string representation of the type (returned by CONNECTION_SCHEMA_FIELDS) to
43
//Read the Types information, so that we can map the string representation of the type (returned by CONNECTION_META_FIELDS) to
44
44
//the Gda::ValueType used by Glib::RefPtr<Gnome::Gda::Column>.
45
//This first call to update_meta_store() is also necessary for other calls to get_meta_store_data() elsewhere to succeed.
46
Glib::RefPtr<Gnome::Gda::DataModel> data_model_tables;
45
47
#ifdef GLIBMM_EXCEPTIONS_ENABLED
46
Glib::RefPtr<Gnome::Gda::DataModel> data_model_tables = gda_connection->get_schema(Gnome::Gda::CONNECTION_SCHEMA_TYPES);
48
if(true) //Already done in ConnectionPool::connect(): gda_connection->update_meta_store())
49
data_model_tables = gda_connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_TYPES);
48
51
std::auto_ptr<Glib::Error> error;
49
Glib::RefPtr<Gnome::Gda::DataModel> data_model_tables = gda_connection->get_schema(Gnome::Gda::CONNECTION_SCHEMA_TYPES, error);
52
if(true) //Already done in ConnectionPool::connect(): gda_connection->update_meta_store(error))
53
data_model_tables = gda_connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_TYPES, error);
50
55
// Ignore error here, we do not process data_model_tables if it is NULL
52
57
#endif // GLIBMM_EXCEPTIONS_ENABLED
59
if(!data_model_tables)
60
std::cerr << "FieldTypes::FieldTypes(): Couldn't get datamodel" << std::endl;
53
62
if(data_model_tables && (data_model_tables->get_n_columns() == 0))
55
std::cerr << "FieldTypes::FieldTypes(): get_schema(Gnome::Gda::CONNECTION_SCHEMA_TYPES) failed." << std::endl;
64
std::cerr << "FieldTypes::FieldTypes(): get_meta_store_data(Gnome::Gda::CONNECTION_META_TYPES) failed." << std::endl;
57
66
else if(data_model_tables)
59
68
int rows = data_model_tables->get_n_rows();
70
std::cerr << "FieldTypes::FieldTypes(): no rows from CONNECTION_META_TYPES" << std::endl;
60
72
for(int i = 0; i < rows; ++i)
74
#ifdef GLIBMM_EXCEPTIONS_ENABLED
62
75
const Gnome::Gda::Value value_name = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_NAME, i);
77
const Gnome::Gda::Value value_name = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_NAME, i, error);
64
80
//Get the types's string representation:
65
81
Glib::ustring schema_type_string;
66
82
if(value_name.get_value_type() == G_TYPE_STRING)
67
83
schema_type_string = value_name.get_string();
69
85
if(!schema_type_string.empty())
71
Gnome::Gda::Value value_gdatype = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_GDATYPE, i);
72
if(value_gdatype.get_value_type() == G_TYPE_ULONG) // TODO: I think this might change to G_TYPE_GTYPE in a future libgda
87
#ifdef GLIBMM_EXCEPTIONS_ENABLED
88
Gnome::Gda::Value value_gdatype = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_GTYPE, i);
90
Gnome::Gda::Value value_gdatype = data_model_tables->get_value_at(DATAMODEL_FIELDS_COL_GTYPE, i, error);
92
if(value_gdatype.get_value_type() == G_TYPE_STRING)
74
const GType gdatype = static_cast<GType>(value_gdatype.get_ulong());
94
Glib::ustring type_string = value_gdatype.get_string();
95
const GType gdatype = gda_g_type_from_string(type_string.c_str());
97
//std::cout << "debug: schema_type_string=" << schema_type_string << ", gda type=" << gdatype << "(" << g_type_name(gdatype) << ")" << std::endl;
76
99
//Save it for later:
77
//std::cout << "debug: schema_type_string=" << schema_type_string << ", gda type=" << gdatype << "(" << g_type_name(gdatype) << ")" << std::endl;
79
100
m_mapSchemaStringsToGdaTypes[schema_type_string] = gdatype;
81
102
Glib::ustring gdatypestring = gda_g_type_to_string(gdatype); // TODO: What is this actually used for?
116
148
type_mapGdaTypesToSchemaStrings::const_iterator iterFind = m_mapGdaTypesToSchemaStrings.find(field_type);
117
149
if(iterFind == m_mapGdaTypesToSchemaStrings.end())
119
g_warning("FieldTypes::get_string_name_for_gdavaluetype(): returning unknowntype for field_type=%ld", static_cast<long>(field_type));
151
type_mapFallbackTypes::const_iterator iterFallback = m_mapFallbackTypes.find(field_type);
152
if(iterFallback != m_mapFallbackTypes.end())
153
return get_string_name_for_gdavaluetype(iterFallback->second);
155
g_warning("FieldTypes::get_string_name_for_gdavaluetype(): returning unknowntype for field_type=%ld (%s)", static_cast<long>(field_type), g_type_name(field_type));
121
157
g_warning(" possible types are: ");
122
158
for(type_mapGdaTypesToSchemaStrings::const_iterator iter = m_mapGdaTypesToSchemaStrings.begin(); iter != m_mapGdaTypesToSchemaStrings.end(); ++iter)
124
g_warning(" gdatype=%ld, sqltype=%s", static_cast<long>(iter->first), iter->second.c_str());
160
g_warning(" gdatype=%ld (%s), sqltype=%s", static_cast<long>(iter->first), g_type_name(iter->first), iter->second.c_str());
127
163
return "unknowntype";