[libgda: 2/7] db-index: Changing API definition



commit d22a2eb4e6f636102ad7ce5fe672acd406e8cfe9
Author: Pavlo Solntsev <p sun fun gmail com>
Date:   Fri Feb 14 15:38:26 2020 -0600

    db-index: Changing API definition
    
     * We need more flexible API to handle "collate" in
    CREATE TABLE queries.
     * Code cleaning
     * Formatting

 .gitlab-ci.yml                           |  2 +-
 libgda/gda-db-index-field.c              | 37 +++++++++++++++-----------------
 libgda/gda-db-index-field.h              | 18 ++--------------
 libgda/gda-db-index.c                    |  4 ++--
 libgda/gda-db-table.c                    |  5 ++---
 tests/test-server-operation-postgresql.c | 20 ++++++++++++-----
 tests/test-server-operation-sqlite.c     |  2 +-
 7 files changed, 40 insertions(+), 48 deletions(-)
---
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c4ab96632..257e7ec1c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -56,7 +56,7 @@ variables:
   SQLITE_DBCREATE_PARAMS: "DB_DIR=."
   SQLITE_CNC_PARAMS: "DB_DIR=."
   POSTGRESQL_DBCREATE_PARAMS: "HOST=$POSTGRES_HOST;ADM_LOGIN=$POSTGRES_USER;ADM_PASSWORD=$POSTGRES_PASSWORD"
-  POSTGRESQL_CNC_PARAMS: "HOST=$POSTGRES_HOST;USERNAME=$POSTGRES_USER;PASSWORD=$POSTGRES_PASSWORD"
+  POSTGRESQL_CNC_PARAMS: 
"HOST=$POSTGRES_HOST;USERNAME=$POSTGRES_USER;PASSWORD=$POSTGRES_PASSWORD;DB_NAME=$POSTGRES_DB"
   POSTGRESQL_META_CNC: 
"DB_NAME=$POSTGRES_DB;HOST=$POSTGRES_HOST;USERNAME=$POSTGRES_USER;PASSWORD=$POSTGRES_PASSWORD"
   MYSQL_CNC_PARAMS: 
"DB_NAME=$MYSQL_DATABASE;HOST=$MYSQL_HOST;USERNAME=$MYSQL_USER;PASSWORD=$MYSQL_ROOT_PASSWORD"
   MYSQL_META_CNC: 
"DB_NAME=$MYSQL_DATABASE;HOST=$MYSQL_HOST;USERNAME=$MYSQL_USER;PASSWORD=$MYSQL_ROOT_PASSWORD"
diff --git a/libgda/gda-db-index-field.c b/libgda/gda-db-index-field.c
index 8c7314acd..d8e0931cd 100644
--- a/libgda/gda-db-index-field.c
+++ b/libgda/gda-db-index-field.c
@@ -23,7 +23,7 @@
 typedef struct
 {
   GdaDbColumn *mColumn;
-  GdaDbIndexCollate mCollate;
+  gchar *mCollate;
   GdaDbIndexSortOrder mSortOrder;
 } GdaDbIndexFieldPrivate;
 
@@ -64,6 +64,9 @@ gda_db_index_field_dispose (GObject *object)
 
   g_object_unref (priv->mColumn);
 
+  if (priv->mCollate)
+    g_free (priv->mCollate);
+
   G_OBJECT_CLASS (gda_db_index_field_parent_class)->dispose (object);
 }
 
@@ -81,7 +84,7 @@ gda_db_index_field_init (GdaDbIndexField *self)
   GdaDbIndexFieldPrivate *priv = gda_db_index_field_get_instance_private (self);
 
   priv->mColumn = NULL;
-  priv->mCollate = GDA_DB_INDEX_COLLATE_BINARY;
+  priv->mCollate = NULL;
   priv->mSortOrder = GDA_DB_INDEX_SORT_ORDER_ASC;
 }
 
@@ -128,14 +131,23 @@ gda_db_index_field_get_column (GdaDbIndexField *self)
  * @self: instance of #GdaDbIndexField
  * @collate: collate to set
  *
+ * Unfortunately, collate can vary from provider to provider. This method accepts collate name as a
+ * string but user should provide valid values. For instance, SQLite3 accepts only "BINARY",
+ * "NOCASE", and "RTRIM" values. PostgreSQL, on the other hand expects a name of a callable object,
+ * e.g. function.
+ *
  * Since: 6.0
  */
 void
 gda_db_index_field_set_collate (GdaDbIndexField *self,
-                                GdaDbIndexCollate collate)
+                                const gchar *collate)
 {
   GdaDbIndexFieldPrivate *priv = gda_db_index_field_get_instance_private (self);
-  priv->mCollate = collate;
+
+  if (priv->mCollate)
+    g_free (priv->mCollate);
+
+  priv->mCollate = g_strdup (collate);
 }
 
 /**
@@ -146,7 +158,7 @@ gda_db_index_field_set_collate (GdaDbIndexField *self,
  *
  * Since: 6.0
  */
-GdaDbIndexCollate
+const gchar *
 gda_db_index_field_get_collate (GdaDbIndexField *self)
 {
   GdaDbIndexFieldPrivate *priv = gda_db_index_field_get_instance_private (self);
@@ -183,21 +195,6 @@ gda_db_index_field_get_sort_order (GdaDbIndexField *self)
   return priv->mSortOrder;
 }
 
-const gchar *
-gda_db_index_field_get_collate_str (GdaDbIndexField *field)
-{
-  g_return_val_if_fail (GDA_IS_DB_INDEX_FIELD(field), NULL);
-
-  GdaDbIndexCollate collate = gda_db_index_field_get_collate(field);
-
-  if (collate == GDA_DB_INDEX_COLLATE_BINARY)
-    return "BINARY";
-  else if (collate == GDA_DB_INDEX_COLLATE_NOCASE)
-    return "NOCASE";
-  else
-    return NULL;
-}
-
 const gchar *
 gda_db_index_field_get_sort_order_str (GdaDbIndexField *field)
 {
diff --git a/libgda/gda-db-index-field.h b/libgda/gda-db-index-field.h
index 59ffeb75c..381d6503e 100644
--- a/libgda/gda-db-index-field.h
+++ b/libgda/gda-db-index-field.h
@@ -36,19 +36,6 @@ struct _GdaDbIndexFieldClass
   GObjectClass parent_class;
 };
 
-/**
- * GdaDbIndexCollate:
- * @GDA_DB_INDEX_COLLATE_BINARY: BINARY collate
- * @GDA_DB_INDEX_COLLATE_NOCASE: NOCASE collate
- *
- * Enum values to specify the collate value for the column
- */
-typedef enum
-{
-  GDA_DB_INDEX_COLLATE_BINARY = 0,
-  GDA_DB_INDEX_COLLATE_NOCASE
-} GdaDbIndexCollate;
-
 /**
  * GdaDbIndexSortOrder:
  * @GDA_DB_INDEX_SORT_ORDER_ASC: ascending sorting
@@ -70,16 +57,15 @@ void                 gda_db_index_field_set_column     (GdaDbIndexField *self,
 GdaDbColumn         *gda_db_index_field_get_column     (GdaDbIndexField *self);
 
 void                 gda_db_index_field_set_collate    (GdaDbIndexField *self,
-                                                        GdaDbIndexCollate collate);
+                                                        const gchar *collate);
 
-GdaDbIndexCollate    gda_db_index_field_get_collate    (GdaDbIndexField *self);
+const gchar *        gda_db_index_field_get_collate    (GdaDbIndexField *self);
 
 void                 gda_db_index_field_set_sort_order (GdaDbIndexField *self,
                                                         GdaDbIndexSortOrder sorder);
 
 GdaDbIndexSortOrder  gda_db_index_field_get_sort_order (GdaDbIndexField *self);
 
-const gchar *        gda_db_index_field_get_collate_str (GdaDbIndexField *field);
 const gchar *        gda_db_index_field_get_sort_order_str (GdaDbIndexField *field);
 
 G_END_DECLS
diff --git a/libgda/gda-db-index.c b/libgda/gda-db-index.c
index 46ca576a4..38e5356ea 100644
--- a/libgda/gda-db-index.c
+++ b/libgda/gda-db-index.c
@@ -151,8 +151,8 @@ gda_db_index_append_field  (GdaDbIndex *self,
             priv->mFieldList = g_slist_append (priv->mFieldList, g_object_ref (field));
           else
             {
-              gda_db_index_field_set_collate (GDA_DB_INDEX_FIELD (it->data),
-                                              gda_db_index_field_get_collate (field));
+             gda_db_index_field_set_collate (GDA_DB_INDEX_FIELD (it->data),
+                                             gda_db_index_field_get_collate (field));
               gda_db_index_field_set_sort_order(GDA_DB_INDEX_FIELD (it->data),
                                                 gda_db_index_field_get_sort_order (field));
             }
diff --git a/libgda/gda-db-table.c b/libgda/gda-db-table.c
index 2093d1f58..20d6ea8b0 100644
--- a/libgda/gda-db-table.c
+++ b/libgda/gda-db-table.c
@@ -1081,7 +1081,6 @@ gda_db_table_add_index  (GdaDbTable *self,
   g_return_val_if_fail(GDA_IS_DB_TABLE (self), FALSE);
   g_return_val_if_fail(GDA_IS_CONNECTION (cnc), FALSE);
   g_return_val_if_fail(GDA_IS_DB_INDEX(index), FALSE);
-  g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
 
   if (!gda_connection_is_opened (cnc))
     {
@@ -1120,7 +1119,7 @@ gda_db_table_add_index  (GdaDbTable *self,
     goto on_error;
 
   if (!gda_server_operation_set_value_at (op, GDA_BOOL_TO_STR (ifnotexists),
-                                          error, "/INDEX_DEF_P/INDEX_IFNOTEXISTS"))
+                                         error, "/INDEX_DEF_P/INDEX_IFNOTEXISTS"))
     goto on_error;
 
   GSList *it = gda_db_index_get_fields (index);
@@ -1138,7 +1137,7 @@ gda_db_table_add_index  (GdaDbTable *self,
         goto on_error;
 
       if (!gda_server_operation_set_value_at (op,
-                                              gda_db_index_field_get_collate_str (it->data),
+                                              gda_db_index_field_get_collate (it->data),
                                               error,
                                               "/INDEX_FIELDS_S/%d/INDEX_COLLATE",
                                               i))
diff --git a/tests/test-server-operation-postgresql.c b/tests/test-server-operation-postgresql.c
index b5c23cecd..3134edd08 100644
--- a/tests/test-server-operation-postgresql.c
+++ b/tests/test-server-operation-postgresql.c
@@ -41,6 +41,8 @@
 
 #define PROVIDER_NAME "PostgreSQL"
 
+#define GDA_PGSQL_ERROR_HANDLE(e) (g_print("Error: %s: %s\n", G_STRLOC, e && e->message ? e->message : "No 
default"));
+
 typedef struct
 {
   GdaConnection *cnc;
@@ -58,17 +60,22 @@ test_server_operation_start (TestObjectFixture *fixture,
 
   if (!db_string)
     {
-      g_print ("Please set POSTGRESQL_DBCREATE_PARAMS variable"
-               "with host,user and port (usually 5432)");
+      g_print ("Please set POSTGRESQL_CNC_PARAMS variable"
+               "with dbname, host, user and port (usually 5432)\n");
       g_print ("Test will not be performed\n");
       return;
     }
 
+  GError *error = NULL;
+
   fixture->cnc = gda_connection_open_from_string (PROVIDER_NAME,
                                                   db_string,
                                                   NULL,
                                                   GDA_CONNECTION_OPTIONS_NONE,
-                                                  NULL);
+                                                  &error);
+
+  if (!fixture->cnc)
+    GDA_PGSQL_ERROR_HANDLE(error);
 
   g_assert_nonnull (fixture->cnc);
 
@@ -91,6 +98,7 @@ test_server_operation_operations (TestObjectFixture *fixture,
                                   G_GNUC_UNUSED gconstpointer user_data)
 {
   GdaServerOperation *op = NULL;
+  GError *error = NULL;
 
 /* CREATE_TABLE operation */
   op = gda_server_provider_create_operation (fixture->provider,
@@ -248,7 +256,10 @@ test_server_operation_operations (TestObjectFixture *fixture,
   res = gda_server_provider_perform_operation (fixture->provider,
                                                fixture->cnc,
                                                op,
-                                               NULL);
+                                               &error);
+
+  if (!res)
+    GDA_PGSQL_ERROR_HANDLE(error);
 
   g_assert_true (res);
 
@@ -958,7 +969,6 @@ test_server_operation_operations_db (TestObjectFixture *fixture,
   gda_db_column_set_name (fcol, "name");
 
   gda_db_index_field_set_column (field, fcol);
-  gda_db_index_field_set_collate (field, GDA_DB_INDEX_COLLATE_BINARY);
   gda_db_index_field_set_sort_order (field, GDA_DB_INDEX_SORT_ORDER_ASC);
 
   gda_db_index_append_field (index, field);
diff --git a/tests/test-server-operation-sqlite.c b/tests/test-server-operation-sqlite.c
index 60d89e795..5fcc80ac4 100644
--- a/tests/test-server-operation-sqlite.c
+++ b/tests/test-server-operation-sqlite.c
@@ -954,7 +954,7 @@ test_server_operation_operations_db (TestObjectFixture *fixture,
   gda_db_column_set_name (fcol, "name");
 
   gda_db_index_field_set_column (field, fcol);
-  gda_db_index_field_set_collate (field, GDA_DB_INDEX_COLLATE_BINARY);
+  gda_db_index_field_set_collate (field, "BINARY");
   gda_db_index_field_set_sort_order (field, GDA_DB_INDEX_SORT_ORDER_ASC);
 
   gda_db_index_append_field (index, field);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]