[gnome-db] GDA_CONNECTION_OPTIONS_THREAD_SAFE issue.



Hi Vivien,

You recently introduced the GDA_CONNECTION_OPTIONS_THREAD_SAFE option. There is a problem with this that if set and a partial meta store update is performed, the meta store is not updated. If using any of the other GDA_CONNECTION_OPTIONS all works fine.

I have attached 2 small c programs to re-produce this issue. The database provider is MySQL, my (test) database is called  'stock' and the DSN is 'mystock'

-1 rm /tmp/mysql_meta.db
-2 in MySQL: drop table xPartsUC;
-3 Run mysql_full (source attached)
-4 in MySQL: CREATE TABLE xPartsUC (Part_ID varchar(5) PRIMARY KEY, Description varchar(30));
-5 Run mysql_partial (source attached)
-6 sqlite3 /tmp/mysql_meta.db  then run: select * from _tables where table_name = '"xPartsUC"';
-7 nothing there. Run mysql_full and the entry is there.

On a side note, how do I pass 2 or more GDA_CONNECTION_OPTIONS to gda_connection_open_from_dsn() ?

ie, if I want to set GDA_CONNECTION_OPTIONS_THREAD_SAFE and the GDA_CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE option?


The following appears to work, but there must be a better way.

GdaConnectionOptions options = GDA_CONNECTION_OPTIONS_THREADSAFE;
options = (GdaConnectionOptions)(options + GDA_CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE);
gda_connection_open_from_dsn(dsn, NULL, options, NULL);

Thanks,
Bas.

CFLAGS = -Wall -g -DGDA_DISABLE_DEPRECATED `pkg-config --cflags libgda-4.0`
LDFLAGS = `pkg-config --libs libgda-4.0`

all: mysql_full mysql_partial

mysql_full: mysql_full.c
	$(CC) -o mysql_full mysql_full.c $(CFLAGS) $(LDFLAGS)

mysql_partial: mysql_partial.c
	$(CC) -o mysql_partial mysql_partial.c $(CFLAGS) $(LDFLAGS)

clean:
	rm -f *~
	rm -f *.o
	rm -f mysql_full
	rm -f mysql_partial
#include <libgda/libgda.h>

int
main (int argc, char *argv[])
{
        GdaConnection* connection;
        GError* error = NULL;
	GdaMetaStore *store;

        gda_init();
        error = NULL;


        /* open connection */
	printf("Start.\n");
	printf("Open connection.\n");
 //       connection = gda_connection_open_from_dsn ("mystock", NULL, GDA_CONNECTION_OPTIONS_NONE, &error);
        connection = gda_connection_open_from_dsn ("mystock", NULL, GDA_CONNECTION_OPTIONS_THREAD_SAFE, &error);
  //      connection = gda_connection_open_from_dsn ("mystock", NULL, GDA_CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE, &error);
        if (!connection) 
	{
                fprintf (stderr, "%s\n", error->message);
                return -1;
        }

	/* Open Meta Store */
	printf("Open Meta Store.\n");
	store = gda_meta_store_new_with_file("/tmp/mysql_meta.db");
	g_object_set(G_OBJECT(connection), "meta-store", store, NULL);
	if (!store)
	{
		printf("Can not open store.\n");
		return -1;
	}

	/* Build Complete store */
	printf("Build complete store.\n");
	if (!gda_connection_update_meta_store(connection, NULL, &error))
	{
                fprintf (stderr, "%s\n", error->message);
		return -1;
	}

	/* The End */
	printf("End.\n");
	return 0;
}
#include <libgda/libgda.h>

int
main (int argc, char *argv[])
{
        GdaConnection* connection;
        GError* error = NULL;
	GdaMetaStore *store;
	gchar *tableName;
	GdaMetaContext mcontext = {"_tables", 1, NULL, NULL};

        gda_init();
        error = NULL;


        /* open connection */
	printf("Start.\n");
	printf("Open connection.\n");
        connection = gda_connection_open_from_dsn ("mystock", NULL, GDA_CONNECTION_OPTIONS_THREAD_SAFE, &error);
//        connection = gda_connection_open_from_dsn ("mystock", NULL, GDA_CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE, &error);
//        connection = gda_connection_open_from_dsn ("mystock", NULL, GDA_CONNECTION_OPTIONS_NONE, &error);
        if (!connection) 
	{
                fprintf (stderr, "%s\n", error->message);
                return -1;
        }

	/* Open Meta Store */
	printf("Open Meta Store.\n");
	store = gda_meta_store_new_with_file("/tmp/mysql_meta.db");
	g_object_set(G_OBJECT(connection), "meta-store", store, NULL);
	if (!store)
	{
		printf("Can not open store.\n");
		return -1;
	}

	/* Update store for just a SINGLE table */
	printf("Update Meta Store with SINGLE table.\n");
	mcontext.column_names = g_new (gchar *, 1);
	mcontext.column_names[0] = "table_name";
	mcontext.column_values = g_new (GValue *, 1);
	tableName = gda_sql_identifier_quote("xPartsUC", connection, NULL, TRUE, FALSE);
	g_value_set_string ((mcontext.column_values[0] = gda_value_new(G_TYPE_STRING)), tableName);
	g_free(tableName);
	if (!gda_connection_update_meta_store(connection, &mcontext, &error))
	{
                fprintf (stderr, "%s\n", error->message);
                return -1;
	}
	
	/* Clean up */	
	gda_value_free (mcontext.column_values[0]);
	
	/* The End */
	printf("End.\n");
	return 0;
}


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