biokoda/actordb

How to inspect database structure?

Closed this issue · 4 comments

Is there a way to query an actor for table names?
Is this a proper way to list tables under filesystem actor? :

actor filesystem(*);
SELECT name FROM sqlite_master WHERE type='table';

I get no results from this query, however, in init.sql i have a rows:

actor filesystem kv
CREATE TABLE actors (id TEXT PRIMARY KEY, hash INTEGER, size INTEGER)  WITHOUT ROWID
CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, fileid TEXT, uid INTEGER, FOREIGN KEY (fileid) REFERENCES actors(id) ON DELETE CASCADE)

And i expect to see those tables somehow.

How to use something like PRAGMA table_info([tablename]); if this works in actordb?

What are you using to connect to ActorDB?

actordb_console -u root

actordb> s
****************************************************************************************************************************************************************
sql                                                                                                                                                 type       |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$CREATE TABLE tab (id INTEGER PRIMARY KEY, txt TEXT);                                                                                               type1      |
$CREATE TABLE tab1 (id INTEGER PRIMARY KEY, txt TEXT);                                                                                              type1      |
$ALTER TABLE tab ADD i INTEGER;                                                                                                                     type1      |
$CREATE TABLE tabx (id INTEGER PRIMARY KEY CHECK (typeof(id) == 'integer'), txt TEXT CHECK (typeof(id) == 'text'));                                 type1      |
$CREATE TABLE asdf (id INTEGER PRIMARY KEY AUTOINCREMENT, txt BLOB);                                                                                type2      |
$CREATE TABLE actors (id TEXT PRIMARY KEY, hash INTEGER, val INTEGER) WITHOUT ROWID;                                                                counters   |
$CREATE TABLE actors (id TEXT PRIMARY KEY, hash INTEGER, size INTEGER)  WITHOUT ROWID;                                                              filesystem |
$CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, fileid TEXT, uid INTEGER, FOREIGN KEY (fileid) REFERENCES actors(id) ON DELETE CASCADE); filesystem |
----------------------------------------------------------------------------------------------------------------------------------------------------------------

PS
i've got this work:

actordb> actor type1(test) create;
actordb (1)> SELECT name FROM sqlite_master WHERE type='table';
actordb (2)> c
****************
name           |
----------------
__transactions |
__adb          |
tab            |
tab1           |
tabx           |
----------------

And this:

actordb> actor type1(test) create;
actordb (1)> PRAGMA table_info([tab]);
actordb (2)> c
****************************************
cid dflt_value name notnull pk type    |
----------------------------------------
0   null       id   0       1  INTEGER |
1   null       txt  0       0  TEXT    |
2   null       i    0       0  INTEGER |
----------------------------------------

The thrift interface has functions: actor_types, actor_tables, actor_columns

For the SQL interface, the correct query is:

actor filesystem(1);
SELECT name FROM sqlite_master WHERE type='table';

setting * for actor name means running query across all shards (multi actor query). Setting it to 1 (or any simple word) will mean sending query to a single shard.

Multi actor queries require {{RESULT}} variable. Running this:

actor filesystem(*);
{{RESULT}}SELECT name FROM sqlite_master WHERE type='table';

Will return a much bigger result and have an additional column "actor".

Thank you.