glom r1891 - in trunk: . glom/libglom/connectionpool_backends
- From: arminb svn gnome org
- To: svn-commits-list gnome org
- Subject: glom r1891 - in trunk: . glom/libglom/connectionpool_backends
- Date: Tue, 10 Feb 2009 19:27:28 +0000 (UTC)
Author: arminb
Date: Tue Feb 10 19:27:27 2009
New Revision: 1891
URL: http://svn.gnome.org/viewvc/glom?rev=1891&view=rev
Log:
2009-02-10 Armin Burgmeier <armin openismus com>
* glom/libglom/connectionpool_backends/sqlite.h:
* glom/libglom/connectionpool_backends/sqlite.cc: Support dropping and
changing columns, though changing doesn't yet seem to work reliably
yet.
Modified:
trunk/ChangeLog
trunk/glom/libglom/connectionpool_backends/sqlite.cc
trunk/glom/libglom/connectionpool_backends/sqlite.h
Modified: trunk/glom/libglom/connectionpool_backends/sqlite.cc
==============================================================================
--- trunk/glom/libglom/connectionpool_backends/sqlite.cc (original)
+++ trunk/glom/libglom/connectionpool_backends/sqlite.cc Tue Feb 10 19:27:27 2009
@@ -121,66 +121,6 @@
#endif
#ifndef GLOM_ENABLE_CLIENT_ONLY
-namespace
-{
-#if 0
- enum
- {
- DATAMODEL_FIELDS_COL_NAME = 0,
- DATAMODEL_FIELDS_COL_TYPE = 1,
- DATAMODEL_FIELDS_COL_GTYPE = 2,
- DATAMODEL_FIELDS_COL_SIZE = 3,
- DATAMODEL_FIELDS_COL_SCALE = 4,
- DATAMODEL_FIELDS_COL_NOTNULL = 5,
- DATAMODEL_FIELDS_COL_DEFAULTVALUE = 6,
- DATAMODEL_FIELDS_COL_EXTRA = 7 // ?
- };
-
- Glib::RefPtr<Gnome::Gda::DataModel> get_meta_store_fields(const Glib::RefPtr<Gnome::Gda::Connection>& connection, Glib::ustring& table_name, std::auto_ptr<Glib::Error>& error)
- {
- Glib::RefPtr<Gnome::Gda::Holder> holder_table_name = Gnome::Gda::Holder::create(G_TYPE_STRING, "name");
- Gnome::Gda::Value table_name_value(table_name);
- holder_table_name->set_value(table_name_value);
- std::vector<Glib::RefPtr<Gnome::Gda::Holder> > holder_list;
- holder_list.push_back(holder_table_name);
-
- Glib::RefPtr<Gnome::Gda::DataModel> model;
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
- try
- {
- model = connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_FIELDS, holder_list);
- }
- catch(const Glib::Error& ex)
- {
- error.reset(new Glib::Error(ex));
- return model;
- }
-#else
- model = connection->get_meta_store_data(Gnome::Gda::CONNECTION_META_FIELDS, holder_list, error);
-#endif
-
- return model;
- }
-
- bool set_data_model_value(const Glib::RefPtr<Gnome::Gda::DataModel>& model, int col, int row, const Gnome::Gda::Value& value, std::auto_ptr<Glib::Error>& error)
- {
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
- try
- {
- model->set_value_at(col, row, value);
- return true;
- }
- catch(const Glib::Error& ex)
- {
- error.reset(new Glib::Error(ex));
- return false;
- }
-#else
- return model->set_value_at(col, row, value, error);
-#endif
- }
-#endif
-}
bool Sqlite::add_column_to_server_operation(const Glib::RefPtr<Gnome::Gda::ServerOperation>& operation, GdaMetaTableColumn* column, unsigned int i, std::auto_ptr<Glib::Error>& error)
{
@@ -221,7 +161,7 @@
return true;
}
-bool Sqlite::recreate_table(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const type_vecStrings& fields_removed, const type_vecFields& fields_added, std::auto_ptr<Glib::Error>& error)
+bool Sqlite::recreate_table(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const type_vecStrings& fields_removed, const type_vecConstFields& fields_added, const type_mapFieldChanges& fields_changed, std::auto_ptr<Glib::Error>& error)
{
static const gchar* TEMPORARY_TABLE_NAME = "GLOM_TEMP_TABLE"; // TODO: Make sure this is unique.
static const gchar* TRANSACTION_NAME = "GLOM_RECREATE_TABLE_TRANSACTION";
@@ -245,9 +185,11 @@
{
GdaMetaTableColumn* column = GDA_META_TABLE_COLUMN(item->data);
- // Don't add if field was removed
- sharedptr<const Field> added;
+ // Don't add if field was removed or changed.
+ const type_mapFieldChanges::const_iterator changed_iter = fields_changed.find(column->column_name);
if(std::find(fields_removed.begin(), fields_removed.end(), column->column_name) != fields_removed.end())
+ continue;
+#if 0
{
// If it was removed, and added again, then it has changed, so use the
// definition from the added_fields vector.
@@ -257,14 +199,15 @@
else
added = *iter;
}
+#endif
if(!trans_fields.empty())
trans_fields += ",";
trans_fields += column->column_name;
- if(added)
+ if(changed_iter != fields_changed.end())
{
- if(!add_column_to_server_operation(operation, added, i++, error))
+ if(!add_column_to_server_operation(operation, changed_iter->second, i++, error))
return false;
}
else
@@ -274,7 +217,7 @@
}
}
- for(type_vecFields::const_iterator iter = fields_added.begin(); iter != fields_added.end(); ++ iter)
+ for(type_vecConstFields::const_iterator iter = fields_added.begin(); iter != fields_added.end(); ++ iter)
{
// Add new fields to the table. Fields that have changed have already
// been handled above.
@@ -342,27 +285,32 @@
{
// Sqlite does not support adding primary key columns. So recreate the table
// in that case.
-/* if(!field->get_primary_key())
+ if(!field->get_primary_key())
{
- return ConnectionPoolBackend::add_column(connection, table, field, error);
+ return ConnectionPoolBackend::add_column(connection, table_name, field, error);
}
- else*/
+ else
{
-#if 0
- Glib::RefPtr<Gnome::Gda::DataModel> model = get_meta_store_fields(connection, table_name, error);
- if(!model) return false;
+ return recreate_table(connection, table_name, type_vecStrings(), type_vecConstFields(1, field), type_mapFieldChanges(), error);
+ }
+}
-/* guint new_row = model->append_row();
- if(!set_data_model_value(model, DATAMODEL_FIELDS_COL_NAME, new_row, Gnome::Gda::Value(field->get_name()), error)) return false;
- if(!set_data_model_value(model, DATAMODEL_FIELDS_COL_TYPE, new_row, Gnome::Gda::Value(field->get_sql_type()), error)) return false;
- if(!set_data_model_value(model, DATAMODEL_FIELDS_COL_GTYPE, new_row, Gnome::Gda::Value(g_type_name(field->get_field_info()->get_g_type())), error)) return false;*/
+bool Sqlite::drop_column(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const Glib::ustring& field_name, std::auto_ptr<Glib::Error>& error)
+{
+ return recreate_table(connection, table_name, type_vecStrings(1, field_name), type_vecConstFields(), type_mapFieldChanges(), error);
+}
-#endif
- if(!recreate_table(connection, table_name, type_vecStrings(), type_vecFields(1, field), error)) return false;
- return true;
- }
+bool Sqlite::change_columns(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const type_vecConstFields& old_fields, const type_vecConstFields& new_fields, std::auto_ptr<Glib::Error>& error)
+{
+ type_mapFieldChanges fields_changed;
+
+ for(type_vecConstFields::size_type i = 0; i < old_fields.size(); ++ i)
+ fields_changed[old_fields[i]->get_name()] = new_fields[i];
+
+ return recreate_table(connection, table_name, type_vecStrings(), type_vecConstFields(), fields_changed, error);
}
-#endif
+
+#endif // !GLOM_ENABLE_CLIENT_ONLY
} // namespace ConnectionPoolBackends
Modified: trunk/glom/libglom/connectionpool_backends/sqlite.h
==============================================================================
--- trunk/glom/libglom/connectionpool_backends/sqlite.h (original)
+++ trunk/glom/libglom/connectionpool_backends/sqlite.h Tue Feb 10 19:27:27 2009
@@ -49,11 +49,14 @@
bool add_column_to_server_operation(const Glib::RefPtr<Gnome::Gda::ServerOperation>& operation, const sharedptr<const Field>& column, unsigned int i, std::auto_ptr<Glib::Error>& error);
typedef std::vector<Glib::ustring> type_vecStrings;
- typedef std::vector<sharedptr<const Field> > type_vecFields;
+ //typedef std::vector<sharedptr<const Field> > type_vecFields;
+ typedef std::map<Glib::ustring, sharedptr<const Field> > type_mapFieldChanges;
- bool recreate_table(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const type_vecStrings& fields_removed, const type_vecFields& fields_added, std::auto_ptr<Glib::Error>& error);
+ bool recreate_table(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const type_vecStrings& fields_removed, const type_vecConstFields& fields_added, const type_mapFieldChanges& fields_changed, std::auto_ptr<Glib::Error>& error);
virtual bool add_column(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const sharedptr<const Field>& field, std::auto_ptr<Glib::Error>& error);
+ virtual bool drop_column(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const Glib::ustring& field_name, std::auto_ptr<Glib::Error>& error);
+ virtual bool change_columns(const Glib::RefPtr<Gnome::Gda::Connection>& connection, const Glib::ustring& table_name, const type_vecConstFields& old_fields, const type_vecConstFields& new_fields, std::auto_ptr<Glib::Error>& error);
#endif
virtual Glib::RefPtr<Gnome::Gda::Connection> connect(const Glib::ustring& database, const Glib::ustring& username, const Glib::ustring& password, std::auto_ptr<ExceptionConnection>& error);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]