Changeset: b02f100b474a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b02f100b474a
Modified Files:
        dump.sql
Branch: monetdbe-proxy
Log Message:

Dump UNIQUE & PRIMARY KEY table contraints.


diffs (213 lines):

diff --git a/dump.sql b/dump.sql
--- a/dump.sql
+++ b/dump.sql
@@ -32,7 +32,7 @@ CREATE FUNCTION dump_type(type STRING, d
                        WHEN digits = 10 THEN 'INTERVAL HOUR TO SECOND'
                        WHEN digits = 11 THEN 'INTERVAL MINUTE'
                        WHEN digits = 12 THEN 'INTERVAL MINUTE TO SECOND'
-                       ELSE  'INTERVAL SECOND' --ASSUMES digits = 13 
+                       ELSE  'INTERVAL SECOND' --ASSUMES digits = 13
                        END
                WHEN type = 'varchar' OR type = 'clob' THEN  CASE
                        WHEN digits = 0 THEN 'CHARACTER LARGE OBJECT'
@@ -71,112 +71,108 @@ END;
 CREATE FUNCTION dump_column_definition(tid INT) RETURNS STRING BEGIN
        RETURN
                SELECT 
+                       ' (' ||
                        GROUP_CONCAT(
                                DQ(c.name) || ' ' ||
                                dump_type(c.type, c.type_digits, c.type_scale) 
||
-                               ifthenelse(c."null" = 'false', ' NOT NULL ', 
'') ||
+                               ifthenelse(c."null" = 'false', ' NOT NULL', '') 
||
                                ifthenelse(c."default" IS NOT NULL, ' DEFAULT ' 
|| c."default", '')
-                       , '')
-                       --c.number
+                       , ', ') || ')'
                FROM sys._columns c 
                WHERE c.table_id = tid;
-       END;
+END;
+
+CREATE FUNCTION dump_contraint_type_name(id INT) RETURNS STRING BEGIN
+       RETURN
+               CASE
+               WHEN id = 0 THEN 'PRIMARY KEY'
+               WHEN id = 1 THEN 'UNIQUE'
+               END;
+END;
 
-CREATE FUNCTION dump_database(describe BOOLEAN)
-RETURNS STRING
+CREATE FUNCTION describe_constraints() RETURNS TABLE("table" STRING, nr INT, 
col STRING, con STRING, type STRING) BEGIN
+       RETURN
+               SELECT t.name, kc.nr, kc.name, k.name, 
dump_contraint_type_name(k.type)
+               FROM sys._tables t, sys.objects kc, sys.keys k
+               WHERE kc.id = k.id
+                       AND k.table_id = t.id
+                       AND t.system = FALSE
+                       AND k.type in (0, 1)
+                       AND t.type IN (0, 6);
+END;
+
+CREATE FUNCTION dump_table_constraint_type() RETURNS TABLE(stm STRING) BEGIN
+       RETURN
+               SELECT 
+                       'ALTER TABLE ' || DQ("table") ||
+                       ifthenelse(con IS NOT NULL, ' ADD CONTRAINT ' || 
DQ(con), '') || ' '||
+                       type || ' (' || GROUP_CONCAT(DQ(col), ', ') || ');'
+               FROM describe_constraints() GROUP BY "table", con, type;
+END;
+
+CREATE TEMPORARY TABLE dump_statements(o INT AUTO_INCREMENT, s STRING, PRIMARY 
KEY (o));
+
+CREATE PROCEDURE dump_database(describe BOOLEAN)
 BEGIN
 
     set schema sys;
 
-    DECLARE create_roles STRING;
-    SET create_roles = (
-        SELECT GROUP_CONCAT('CREATE ROLE ' || name || ';')  FROM auths
-        WHERE name NOT IN (SELECT name FROM db_user_info) 
-        AND grantor <> 0
-    );
+       INSERT INTO dump_statements(s) VALUES ('START TRANSACTION;');
 
-    IF create_roles IS NULL THEN
-        SET create_roles = '';
-    END IF;
+       INSERT INTO dump_statements(s) --dump_create_roles
+               SELECT 'CREATE ROLE ' || DQ(name) || ';' FROM auths
+        WHERE name NOT IN (SELECT name FROM db_user_info) 
+        AND grantor <> 0;
 
-    declare create_users STRING;
-    SET create_users = (SELECT
-        GROUP_CONCAT(
-        'CREATE USER ' ||  ui.name ||  ' WITH ENCRYPTED PASSWORD\n' ||
+       INSERT INTO dump_statements(s) --dump_create_users
+               SELECT
+        'CREATE USER ' ||  DQ(ui.name) ||  ' WITH ENCRYPTED PASSWORD\n' ||
             ENI(password_hash(ui.name)) ||
-        'NAME ' || ui.fullname ||  ' SCHEMA sys;', '\n')
+        'NAME ' || ui.fullname ||  ' SCHEMA sys;'
         FROM db_user_info ui, schemas s
         WHERE ui.default_schema = s.id
             AND ui.name <> 'monetdb'
-            AND ui.name <> '.snapshot');
+            AND ui.name <> '.snapshot';
 
-    IF create_users IS NULL THEN
-        SET create_users = '';
-    END IF;
-
-    declare create_schemas STRING;
-    SET create_schemas = (
+       INSERT INTO dump_statements(s) --dump_create_schemas
         SELECT
-            GROUP_CONCAT('CREATE SCHEMA ' ||  s.name || ifthenelse(a.name <> 
'sysadmin', ' AUTHORIZATION ' || a.name, ' ') || ';' || 
-            comment_on('SCHEMA', s.name, rem.remark), '\n')
+            'CREATE SCHEMA ' ||  DQ(s.name) || ifthenelse(a.name <> 
'sysadmin', ' AUTHORIZATION ' || a.name, ' ') || ';' ||
+            comment_on('SCHEMA', DQ(s.name), rem.remark)
         FROM schemas s LEFT OUTER JOIN comments rem ON s.id = rem.id,auths a
-        WHERE s.authorization = a.id AND s.system = FALSE);
+        WHERE s.authorization = a.id AND s.system = FALSE;
 
-    IF create_schemas IS NULL THEN
-        SET create_schemas = '';
-    END IF;
-
-    declare alter_users STRING;
-    SET alter_users = (
-        SELECT
-            GROUP_CONCAT('ALTER USER ' || ui.name || ' SET SCHEMA ' || s.name 
|| ';', '\n')
+    INSERT INTO dump_statements(s) --dump_add_schemas_to_users
+           SELECT
+            'ALTER USER ' || DQ(ui.name) || ' SET SCHEMA ' || DQ(s.name) || ';'
         FROM db_user_info ui, schemas s
         WHERE ui.default_schema = s.id
             AND ui.name <> 'monetdb'
             AND ui.name <> '.snapshot'
-            AND s.name <> 'sys');
+            AND s.name <> 'sys';
 
-    IF alter_users IS NULL THEN
-        SET alter_users = '';
-    END IF;
-
-    declare grant_user_priviledges STRING;
-    SET grant_user_priviledges = (
+    INSERT INTO dump_statements(s) --dump_grant_user_priviledges
         SELECT
-            GROUP_CONCAT('GRANT ' || DQ(a2.name) || ' ' || ifthenelse(a1.name 
= 'public', 'PUBLIC', DQ(a1.name)) || ';', '\n')
+            'GRANT ' || DQ(a2.name) || ' ' || ifthenelse(a1.name = 'public', 
'PUBLIC', DQ(a1.name)) || ';'
                FROM sys.auths a1, sys.auths a2, sys.user_role ur
-               WHERE a1.id = ur.login_id AND a2.id = ur.role_id);
-
-    IF grant_user_priviledges IS NULL THEN
-        SET grant_user_priviledges = '';
-    END IF;
+               WHERE a1.id = ur.login_id AND a2.id = ur.role_id;
 
-
-       declare create_sequences STRING;
-       SET create_sequences  = (
-               SELECT GROUP_CONCAT('CREATE SEQUENCE ' || DQ(sch.name) || '.' 
|| DQ(seq.name) || ' AS INTEGER;' || 
-               comment_on('SEQUENCE', DQ(sch.name) || '.' || DQ(seq.name), 
rem.remark), '\n')
+       INSERT INTO dump_statements(s) --dump_create_sequences
+               SELECT 'CREATE SEQUENCE ' || DQ(sch.name) || '.' || 
DQ(seq.name) || ' AS INTEGER;' ||
+               comment_on('SEQUENCE', DQ(sch.name) || '.' || DQ(seq.name), 
rem.remark)
                FROM sys.schemas sch,
                        sys.sequences seq LEFT OUTER JOIN sys.comments rem ON 
seq.id = rem.id
-               WHERE sch.id = seq.schema_id);
+               WHERE sch.id = seq.schema_id;
 
-    IF create_sequences IS NULL THEN
-        SET create_sequences = '';
-    END IF;
-
-       declare create_tables STRING;
-    set create_tables = (
-               SELECT GROUP_CONCAT('CREATE ' || ts.table_type_name || ' ' || 
DQ(s.name) || '.' || DQ(t.name) || dump_column_definition(t.id) || ';', '\n')
+       INSERT INTO dump_statements(s) --dump_create_tables
+               SELECT 'CREATE ' || ts.table_type_name || ' ' || DQ(s.name) || 
'.' || DQ(t.name) || dump_column_definition(t.id) || ';'
                FROM sys.schemas s, table_types ts, sys._tables t LEFT OUTER 
JOIN sys.comments rem ON t.id = rem.id
                WHERE t.type IN (0, 6)
                        AND t.system = FALSE
                        AND s.id = t.schema_id
                        AND ts.table_type_id = t.type
-                       AND s.name <> 'tmp');
+                       AND s.name <> 'tmp';
 
-    IF create_tables IS NULL THEN
-        SET create_tables = '';
-    END IF;
+       INSERT INTO dump_statements(s) SELECT * FROM 
dump_table_constraint_type();
 
        --TODO where are the parenthesis in the column definition.
        --TODO COLUMN DEFINITIONS
@@ -187,20 +183,12 @@ BEGIN
        --TODO CREATE INDEX + COMMENT
        --TODO User Defined Types?
 
-    RETURN 
-        'START TRANSACTION;\n' ||
-        create_roles || '\n' ||
-        create_users || '\n' ||
-        create_schemas || '\n' ||
-        alter_users || '\n' ||
-        grant_user_priviledges || '\n' ||
-        create_sequences || '\n' ||
-               create_tables || '\n' ||
-        'COMMIT;';
+    INSERT INTO dump_statements(s) VALUES ('COMMIT;');
 
 END;
 
-SELECT dump_database(TRUE);
+CALL dump_database(TRUE);
+SELECT * FROM dump_statements;
 
 ROLLBACK;
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to