[Gambas-user] Postgres : Connection.Tables
Benoît Minisini
g4mba5 at gmail.com
Sat Oct 31 23:17:45 CET 2020
Le 31/10/2020 à 21:56, Bruce a écrit :
> On 31/10/20 10:37 pm, Benoît Minisini wrote:
>> Le 31/10/2020 à 05:05, Bruce a écrit :
>>> The Connection.Tables property returns a "a virtual collection used
>>> for managing the tables of the database". However this collection
>>> includes tables, views and materialised views. The
>>> .Connection.Tables["name"].Type property is always empty ("") so
>>> is there any way to tell if a Table is a real table or a view?
>>>
>>> tia
>>> bruce
>>>
>>> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----
>>
>> Not at the moment.
>>
>
> OK, well here is what I've developed. (Also attached as a text file)
> ---------------------------
> /*****************************************************************************
>
>
> table_type()
>
> Returns or sets the table type.
>
> <db> is the database handle.
> <table> is the table name.
> <newtype> is the new type
>
> This function returns the table type.
>
> NOTE: Postgresql does not allow setting the table type under normal
> circumstances.
>
> *****************************************************************************/
>
>
> static char *table_type(DB_DATABASE *db, const char *table, const char
> *newtype)
> {
> if (newtype)
> {
> GB.Error("PostgreSQL does not allow setting the table types");
>
> return NULL;
> }
>
> const char *query ="SELECT c.relname, n.nspname, CASE c.relkind
> WHEN 'r' THEN 'BASE TABLE' WHEN 'v' THEN 'VIEW' WHEN 'm' THEN
> 'MATERIALIZED VIEW' END FROM pg_catalog.pg_class c LEFT JOIN
> pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN
> ('r', 'v', 'm') AND n.nspname <> 'information_schema' AND n.nspname !~
> 'pg_toast' AND c.relname = '&1' AND n.nspname = '&2';";
>
> PGresult *res;
> char *schema;
>
> get_table_schema(&table, &schema);
> //fprintf(stderr, "get_table_schema: %s %s\n", schema, table);
>
> if (do_query(db, "Unable to check table: &1", &res, query, 2,
> table, schema))
> return NULL;
>
> if (PQntuples(res) > 1)
> {
> GB.Error("Non-existant or ambiguous table name - &1", table);
> return NULL;
> }
>
> char *type = GB.NewZeroString(PQgetvalue(res, 0, 2));
> //fprintf(stderr, "get_table_type: %s\n", type);
>
> PQclear(res);
> ;
> return type;
>
> }
> ---------------------------------
>
> Hope you like it
>
> cheers
> bruce
>
>
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----
>
The "table type" has actually nothing to do with whether the table is a
view or not, but is related to the storing engine used. It's a MySQL
thing, and afaik PostgreSQL stores all tables the same way.
The concept of table view must be introduced in another way that does
not exist at the moment.
Regards,
--
Benoît Minisini
More information about the User
mailing list