On Wed, 2009-07-22 at 21:14 +1000, Bas Driessen wrote: > On Wed, 2009-07-22 at 10:10 +1000, Bas Driessen wrote: > > > On Tue, 2009-07-21 at 21:34 +0200, Vivien Malerba wrote: > > > > > > > > > > > 2009/7/20 Bas Driessen <[email protected]> > > > > > > > > > On Mon, 2009-07-20 at 13:49 +0200, Vivien Malerba wrote: > > > > > > > > > > > > > > > 2009/7/20 Bas Driessen <[email protected]> > > > > > > > > > > > > On Mon, 2009-07-20 at 10:52 +0200, Vivien > > > > Malerba wrote: > > > > > > > > > > > > > > > > > > > 2009/7/20 Bas Driessen > > > > > <[email protected]> > > > > > > > > > > On Sun, 2009-07-19 at 13:31 +0200, > > > > > Vivien Malerba wrote: > > > > > > > > > > > > > > > > > > > > > > > 2009/7/19 Bas Driessen > > > > > > <[email protected]> > > > > > > > > > > > > Hello, > > > > > > > > > > > > Question regarding partial > > > > > > meta store update. I found > > > > > > that the following to update > > > > > > a single table does not > > > > > > appear to work: > > > > > > > > > > > > g_print ("\nPartial > > > > > > metastore update for table > > > > > > '%s'...\n", TABLE_NAME); > > > > > > GdaMetaContext > > > > > > mcontext = {"_tables", 1, > > > > > > NULL, NULL}; > > > > > > > > > > > > mcontext.column_names = > > > > > > g_new (gchar *, 1); > > > > > > > > > > > > mcontext.column_names[0] = > > > > > > "table_name"; > > > > > > > > > > > > mcontext.column_values = > > > > > > g_new (GValue *, 1); > > > > > > g_value_set_string > > > > > > ((mcontext.column_values[0] > > > > > > = gda_value_new > > > > > > (G_TYPE_STRING)), > > > > > > TABLE_NAME); > > > > > > if (! > > > > > > gda_connection_update_meta_store > > > (connection, &mcontext, &error)) > > > > > > return -1; > > > > > > > > > > > > After this, my meta store is > > > > > > NOT updated. > > > > > > > > > > > > > > > > > > This may depend on the actual value > > > > > > of TABLE_NAME, specifically if it is > > > > > > a mix of upper and lower case, or if > > > > > > it's a reserved keyword. The proper > > > > > > way is: > > > > > > tmp = gda_sql_identifier_quote > > > > > > (TABLE_NAME, cnc, NULL, TRUE, > > > > > > FALSE); // or with the last argument > > > > > > being TRUE, see the doc > > > > > > g_value_set_string > > > > > > ((mcontext.column_values[0] = > > > > > > gda_value_new (G_TYPE_STRING)), > > > > > > tmp); > > > > > > g_free (tmp); > > > > > > > > > > > > Note that this is brand new (just > > > > > > been sorted out) and will require > > > > > > the master or LIBGDA_4.0 branches up > > > > > > to date. > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks Vivien, but this unfortunately > > > > > is not still not working. Let me > > > > > explain my testing scenario and if I > > > > > understand this the correct way. > > > > > > > > > > -1 I have a database with a table > > > > > called "groups" > > > > > -2 I run the > > > > > gda_connection_update_meta_store to > > > > > update the meta store. > > > > > -3 I look into the meta store with > > > > > sqlite3 and execute "select * from > > > > > _tables". I can see the "groups" table > > > > > in that list. > > > > > > > > > > > > > > > So far so good:) > > > > > > > > > > > > > > > > > > > > -4 I add a table called "parts" > > > > > -5 I run the code above (with your > > > > > modification) where the TABLE_NAME is > > > > > set to "parts" (without quotes). > > > > > -6 I execute "select * from _tables" > > > > > and I expect to see the "parts" entry, > > > > > but it is not there. > > > > > > > > > > > > > > > It should be there... > > > > > > > > > > > > > > > > > > > > -7 I execute the > > > > > gda_connection_update_meta_store to do > > > > > the full update. > > > > > -8 I execute "select * from _tables" > > > > > and I expect to see the "parts" entry > > > > > and now it is there. > > > > > > > > > > My questions: > > > > > > > > > > -1 Is my understanding of how this > > > > > mechanism should work correct? > > > > > > > > > > > > > > > Ye, it is. > > > > > > > > > > > > > > > > > > > > -2 Anything (obvious) that is not in > > > > > the code above? > > > > > -3 I use > > > > > "gda_meta_store_new_with_file" to open > > > > > my (sqlite3) meta store database. Is > > > > > it possible that somehow it is mixing > > > > > up the internal (memory) database with > > > > > the external one? > > > > > > > > > > > > > > > I don't think so, but I'd prefer to have some > > > > > actual code to look at before I can say... > > > > > > > > > > If you send me a standlone program which shows > > > > > the bug, I'll make the necessary corrections > > > > > (either to Libgda or to your code). > > > > > > > > > > > > > > > > > > > > Attached a small application that demonstrates the > > > single table problem. Set up as follows: > > > > > > > > > > > > (postgresql) database with 1 more tables > > > > data source called "stocksql" (or change the > > > > connection name in the source). > > > > > > > > The program performs the following steps: > > > > > > > > -1 Open the connection > > > > -2 Open the meta store > > > > -3 Drop table "xparts" (if exists) > > > > -4 Build complete meta store > > > > -5 Create table "xparts" > > > > -6 Update SINGLE table meta store. > > > > > > > > > > > > After this open: sqlite3 /tmp/single.db > > > > > > > > select * from _tables > > > > > > > > There should be an entry for "xparts", but it is > > > > not there. > > > > > > > > Is this enough input? > > > > > > > > As a comment, I quickly put this together, so > > > > the error handling and program style is not the > > > > nicest :) Also I did not use DDL calls for drop > > > > table etc as that is not the focus anyway. > > > > > > > > > > > > > > > > > > > > It works for me (I've had to modify "gchar tableName;" > > > > to "gchar *tableName;" but it's the only modification > > > > I've done): > > > > > > > > c0> select * from _tables where table_name = 'xparts'; > > > > table_catalog | table_schema | table_name | table_type | > > > > is_insertable_into | table_comments | table_short_name | > > > > table_full_name | table_owner > > > > > > > --------------+--------------+------------+------------+--------------------+----------------+------------------+-----------------+------------ > > > > stocksql | public | xparts | BASE TABLE | > > > > TRUE | | xparts | > > > > public.xparts | vivien > > > > (1 row) > > > > > > > > > > > > > > > You are right about the *tableName of course. Not sure why > > > that * got dropped. > > > > > > > > > > > > > Which version of PostgreSQL and libgda are you using? > > > > > > > > > > > > > > > > I am on the latest LIBGDA_4.0 git branch. (so I am NOT on > > > master, perhaps that may be the issue?) > > > > > > I am using postgresql 8.3.7 (default with Fedora 11) > > > > > > $ rpm -qa | grep postgresql > > > postgresql-devel-8.3.7-1.fc11.x86_64 > > > postgresql-python-8.3.7-1.fc11.x86_64 > > > postgresql-libs-8.3.7-1.fc11.x86_64 > > > postgresql-server-8.3.7-1.fc11.x86_64 > > > postgresql-8.3.7-1.fc11.x86_64 > > > > > > What additional permissions (grants) do I need in > > > Postgresql to be able to retrieve the data that is used > > > the build the meta store? For testing now I have assigned > > > an administrator role, but that is probably not a good > > > idea in production? > > > > > > > > > No specific permission is required, except that the pg_catalog and > > > information_schema schemas need to be readable (but I think it's > > > the case all the time). Moreover, the meta data retreival works > > > when updating all (calling gda_connection_update_meta_store() with > > > a NULL context). > > > > > > I don't see why it does not work... > > > > > > What you can do is uncomment the line 2248 of gda-meta-store.c to > > > define DEBUG_STORE_MODIFY, recompile and run your code again. > > > You'll then have a lot of information about the update process of > > > the GdaMetaStore, and maybe you'll see what's wrong. Be aware that > > > when running gda_connection_update_meta_store(), the whole process > > > takes place in a transaction so if something fails, then the meta > > > store is reverted to what it was before the call. > > > > > > If you want you can send me the output it produces so I can have a > > > look. > > > > > > Output as follows: > > > > CURRENT: > > catalog_name > > ------------ > > stock > > (1 row) > > ------- BEGIN > > FIND row 0(/0) returned row 0 (unchanged) > > Suggest update data into table '_schemata': [catalog_name => stock] > > CURRENT: > > catalog_name | schema_name | schema_owner | schema_internal > > -------------+-------------+--------------+---------------- > > (0 rows) > > NEW for table _schemata: > > catalog_name | schema_name | schema_owner | case > > -------------+-------------+--------------+----- > > (0 rows) > > wrapped as: > > catalog_name | schema_name | schema_owner | case > > -------------+-------------+--------------+----- > > (0 rows) > > ------- COMMIT > > > > > > This does not look healthy as all is empty. Should this list > > something from the current Meta Store? > > > OK, found the issue. It appears to be a permission problem in > Postgresql. If I configure the data source (cnc) to connect as user > "postgres" (administrator account), then the partial update works OK. > If I do it as the "normal" user, it does not work. This is strange as > the FULL update does work for that user. What additional permission is > required for the 'normal' user? This may be a little bit out of the > libgda scope, but half kind of overlapping as libgda should either > fail for all cases if it can not reach the system tables or work in > all cases.
Further to this. Tried to work it out from Postgres, but the only way the libgda partial meta store updates work is if I set the normal user as superuser: ALTER USER bas with SUPERUSER then all works OK, however it is not a good idea to have superuser rights to a normal user for the obvious reasons. When I switch back to normal user mode: ALTER USER bas with NOSUPERUSER then all fails again with the empty debug table output above. I need to work out which Postgresql system tables libgda tries to access when doing a partial update. Any pointers of how to get this done quickly/which area to look? Any other postgresql users on this list who has come across this? Thanks, Bas.
_______________________________________________ gnome-db-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gnome-db-list
