Bläddra i källkod

Scripting : sort domains and tables in dependency order (internal sort within category only). Script exceptions as well.

Reinier Olislagers 11 år sedan
förälder
incheckning
a4cd124888
3 ändrade filer med 52 tillägg och 10 borttagningar
  1. 9 3
      main.pas
  2. 33 3
      scriptdb.pas
  3. 10 4
      systables.pas

+ 9 - 3
main.pas

@@ -1826,13 +1826,19 @@ begin
         Lines.Add('-- ' + tvMain.Selected.Text + ' database script. Generated on: ' + DateTimeToStr(Now) );
 
         Lines.Add('');
-        Lines.Add('--      Roles');
+        Lines.Add('--     Roles');
         Lines.Add('');
         ScriptAllRoles(dbIndex, List);
         Lines.AddStrings(List);
 
         Lines.Add('');
-        Lines.Add('--      Functions (UDF)');
+        Lines.Add('--     Exceptions');
+        Lines.Add('');
+        ScriptAllExceptions(dbIndex, List);
+        Lines.AddStrings(List);
+
+        Lines.Add('');
+        Lines.Add('--     Functions (UDF)');
         Lines.Add('');
         ScriptAllFunctions(dbIndex, List);
         List.Text:= StringReplace(List.Text, #10, #13#10, [rfReplaceAll]);
@@ -1845,7 +1851,7 @@ begin
         Lines.AddStrings(List);
 
         Lines.Add('');
-        Lines.Add('--      Generators');
+        Lines.Add('--      Generators/Sequences');
         Lines.Add('');
         ScriptAllGenerators(dbIndex, List);
         Lines.AddStrings(List);

+ 33 - 3
scriptdb.pas

@@ -9,8 +9,13 @@ uses
 
 
 function ScriptAllRoles(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all UDF functions in a database
 function ScriptAllFunctions(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all domains in a database
 function ScriptAllDomains(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all defined exceptions in a database
+function ScriptAllExceptions(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all sequences (old name: generators) in a database
 function ScriptAllGenerators(dbIndex: Integer; var List: TStringList): Boolean;
 // Scripts a single table as CREATE TABLE DDL
 procedure ScriptTableAsCreate(dbIndex: Integer; ATableName: string; ScriptList: TStringList);
@@ -18,9 +23,12 @@ procedure ScriptTableAsCreate(dbIndex: Integer; ATableName: string; ScriptList:
 function ScriptAllTables(dbIndex: Integer; var List: TStringList): Boolean;
 // Scripts all stored procedures
 function ScriptAllProcedureTemplates(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all views in a database
 function ScriptAllViews(dbIndex: Integer; var List: TStringList): Boolean;
 function ScriptAllTriggers(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all non-primary key indexes for a database
 function ScriptAllSecIndices(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts all constraints (e.g. foreign key constraints) for tables in a database
 function ScriptAllConstraints(dbIndex: Integer; var List: TStringList): Boolean;
 function ScriptObjectPermission(dbIndex: Integer; ObjName, UserName: string; var ObjType: Integer;
    List: TStrings; NewUser: string = ''): Boolean;
@@ -76,6 +84,8 @@ var
 begin
   FunctionsList:= TStringList.Create;
   FunctionsList.CommaText:= dmSysTables.GetDBObjectNames(dbIndex, 6, Count);
+  // Get functions in dependency order:
+  dmSysTables.SortDependencies(FunctionsList);
   List.Clear;
   for i:= 0 to FunctionsList.Count - 1 do
   begin
@@ -94,7 +104,25 @@ begin
 end;
 
 
-(********************  Script Generators   ***********************)
+(********************  Script Exceptions   ***********************)
+
+function ScriptAllExceptions(dbIndex: Integer; var List: TStringList): Boolean;
+var
+  Count: Integer;
+  CreateStatement: string;
+  Description,Message: string; {not actually used here}
+  i: Integer;
+begin
+  List.CommaText:= dmSysTables.GetDBObjectNames(dbIndex, 10, Count);
+  for i:= 0 to List.Count - 1 do
+  begin
+    dmSysTables.GetExceptionInfo(List[i],Message, Description, CreateStatement);
+    List[i]:= CreateStatement;
+  end;
+  Result:= List.Count > 0;
+end;
+
+(********************  Script Generators/Sequences   ***********************)
 
 function ScriptAllGenerators(dbIndex: Integer; var List: TStringList): Boolean;
 var
@@ -119,9 +147,10 @@ var
   DefaultValue: string;
 begin
   List.CommaText:= dmSysTables.GetDBObjectNames(dbIndex, 8, Count);
+  // Get domains in dependency order (if dependencies can exist between domains)
+  dmSysTables.SortDependencies(List);
   for i:= 0 to List.Count - 1 do
   begin
-    // todo: add support for numeric field types (e.g.
     dmSysTables.GetDomainInfo(dbIndex, List[i], DomainType, DomainSize, DefaultValue);
 
     List[i]:= 'Create Domain ' + List[i] + ' as ' + DomainType;
@@ -130,7 +159,6 @@ begin
     else
       List[i]:= List[i] ;
     List[i]:= List[i] + ' ' + DefaultValue + ';';
-
   end;
   Result:= List.Count > 0;
 end;
@@ -462,6 +490,8 @@ begin
   TablesList:= TStringList.Create;
   try
     TablesList.CommaText:= dmSysTables.GetDBObjectNames(dbIndex, 1, Count);
+    // Get tables in dependency order - probably won't matter much in this case:
+    dmSysTables.SortDependencies(TablesList);
     List.Clear;
     for TableCounter:= 0 to TablesList.Count - 1 do
     with dmSysTables do

+ 10 - 4
systables.pas

@@ -33,6 +33,8 @@ type
     procedure FillCompositeFKConstraints(const TableName: string;
       var ConstraintsArray: TConstraintCounts);
     procedure Init(dbIndex: Integer);
+    // Gets list of object names that have type specified by TVIndex
+    // Returns Count of objects in Count
     function GetDBObjectNames(DatabaseIndex, TVIndex: Integer; var Count: Integer): string;
     // Returns object list (list of object names, i.e. tables, views) sorted by dependency
     // Limits sorting within one category (e.g. views)
@@ -56,6 +58,8 @@ type
     function GetConstraintInfo(dbIndex: Integer; ATableName, ConstraintName: string; var KeyName,
         CurrentTableName, CurrentFieldName, OtherTableName, OtherFieldName, UpdateRule, DeleteRule: string): Boolean;
 
+    // Gets information about exception.
+    // Returns CREATE EXCEPTION statement in SQLQuery.
     function GetExceptionInfo(ExceptionName: string; var Msg, Description, SqlQuery: string): Boolean;
     procedure GetDomainInfo(dbIndex: Integer; DomainName: string; var DomainType: string;
       var DomainSize: Integer; var DefaultValue: string);
@@ -594,10 +598,12 @@ begin
     Msg:= sqQuery.FieldByName('RDB$MESSAGE').AsString;
     Description:= sqQuery.FieldByName('RDB$DESCRIPTION').AsString;
     SqlQuery:= 'CREATE EXCEPTION ' + ExceptionName + #10 +
-               '''' + Msg + ''';' + #10 +
-               'UPDATE RDB$EXCEPTIONS set ' + #10 +
-               'RDB$DESCRIPTION = ''' + Description + ''' ' + #10 +
-               'where RDB$EXCEPTION_NAME = ''' + ExceptionName + ''';';
+      '''' + Msg + ''';';
+    if Description<>'' then
+      SQLQuery:= SQLQuery + #10 +
+        'UPDATE RDB$EXCEPTIONS set ' + #10 +
+        'RDB$DESCRIPTION = ''' + Description + ''' ' + #10 +
+        'where RDB$EXCEPTION_NAME = ''' + ExceptionName + ''';';
   end;
   sqQuery.Close;
 end;