Răsfoiți Sursa

Script database: add rudimentary support for array datatypes: only 1 dimension, lower bound ignored. Complements commit fb50acf47452577ab9ba2325bd5859c2414f1459

Reinier Olislagers 11 ani în urmă
părinte
comite
8fdd1f8bc1
4 a modificat fișierele cu 13 adăugiri și 7 ștergeri
  1. 3 1
      main.pas
  2. 1 1
      querywindow.pas
  3. 8 4
      scriptdb.pas
  4. 1 1
      systables.pas

+ 3 - 1
main.pas

@@ -234,6 +234,8 @@ type
     function GetFBTypeName(Index: Integer): string;
     function GetPrimaryKeyIndexName(DatabaseIndex: Integer; ATableName: string; var ConstraintName: string): string;
     function GetConstraintFields(ATableName, AIndexName: string; var List: TStringList): Boolean;
+    // Get fields information for specified table
+    // Fills SQLQuery1 with details
     procedure GetFields(DatabaseIndex: Integer; ATableName: string; FieldsList: TStringList);
     function GetStoredProcBody(DatabaseIndex: Integer; AProcName: string; var SPOwner: string): string;
     function GetViewInfo(DatabaseIndex: Integer; AViewName: string; var Columns, Body: string): Boolean;
@@ -2486,6 +2488,7 @@ begin
   Rec:= RegisteredDatabases[DatabaseIndex];
   SetConnection(DatabaseIndex);
   sqlTransaction.Commit;
+  //todo: add Firebird 3.0 beta BOOLEAN datatype number
   SQLQuery1.SQL.Text:= 'SELECT r.RDB$FIELD_NAME AS field_name, ' +
       '  r.RDB$DESCRIPTION AS field_description, ' +
       '  r.RDB$DEFAULT_SOURCE AS field_default_value, ' +
@@ -2524,7 +2527,6 @@ begin
       ' LEFT JOIN RDB$FIELD_DIMENSIONS dim ON f.RDB$FIELD_NAME = dim.RDB$FIELD_NAME ' +
       ' WHERE r.RDB$RELATION_NAME=''' + ATableName + '''  ' +
       ' ORDER BY r.RDB$FIELD_POSITION;';
-
   SQLQuery1.Open;
   // Fill field list if needed
   if FieldsList <> nil then

+ 1 - 1
querywindow.pas

@@ -424,7 +424,7 @@ begin
                 FieldsSQL += ',';
               FieldsSQL += RecordSet.Fields[x].FieldName + '=';
 
-              // Typecast field values according to thier main type
+              // Typecast field values according to their main type
               case RecordSet.Fields[x].DataType of
                 ftInteger, ftSmallint: FieldsSQL += IntToStr(RecordSet.Fields[x].NewValue);
                 ftFloat: FieldsSQL += FloatToStr(RecordSet.Fields[x].NewValue);

+ 8 - 4
scriptdb.pas

@@ -12,6 +12,7 @@ function ScriptAllRoles(dbIndex: Integer; var List: TStringList): Boolean;
 function ScriptAllFunctions(dbIndex: Integer; var List: TStringList): Boolean;
 function ScriptAllDomains(dbIndex: Integer; var List: TStringList): Boolean;
 function ScriptAllGenerators(dbIndex: Integer; var List: TStringList): Boolean;
+// Scripts a single table as CREATE TABLE DDL
 procedure ScriptTableAsCreate(dbIndex: Integer; ATableName: string; ScriptList: TStringList);
 function ScriptAllTables(dbIndex: Integer; var List: TStringList): Boolean;
 function ScriptAllProcedureTemplates(dbIndex: Integer; var List: TStringList): Boolean;
@@ -146,7 +147,7 @@ var
   FieldLine: string;
   Skipped: Boolean;
   ConstraintName: string;
-  CalculatedList: TStringList;
+  CalculatedList: TStringList; // for calculated fields
   DefaultValue: string;
 begin
   fmMain.GetFields(dbIndex, ATableName, nil);
@@ -178,23 +179,27 @@ begin
         if Pos('char', LowerCase(FieldByName('Field_Type_Str').AsString)) > 0 then
           FieldLine:= FieldLine + '(' + FieldByName('Character_Leng').AsString + ') ';
 
+        // Rudimentary support for array datatypes (only covers 0 dimension types):
+        if not(FieldByName('Array_Upper_Bound').IsNull) then
+          FieldLine:= FieldLine + ' [' + FieldByName('Array_Upper_Bound').AsString + '] ';
+
         // Default value
         DefaultValue:= Trim(FieldByName('Field_Default_Value').AsString);
         if DefaultValue <> '' then
         begin
           if pos('default', DefaultValue) <> 1 then
             DefaultValue:= ' default ''' + DefaultValue + '''';
-
           FieldLine:= FieldLine + ' ' + DefaultValue;
         end;
 
         // Null/Not null
         if FieldByName('field_not_null_constraint').AsString = '1' then
            FieldLine:= FieldLine + ' not null ';
-
       end
       else
+      begin
         Skipped:= True;
+      end;
 
       // Computed Fields
       if FieldByName('Computed_Source').AsString <> '' then
@@ -399,7 +404,6 @@ begin
           fmMain.GetIndexFields(TablesList[i], Trim(FieldByName('RDB$Index_Name').AsString), fmMain.SQLQuery1, FieldsList);
           Line:= Line + ' (' + FieldsList.CommaText + ') ;';
           List.Add(Line);
-
         end;
         Next;
       end;

+ 1 - 1
systables.pas

@@ -836,7 +836,7 @@ begin
     with sqQuery do
     begin
       FieldType:= Trim(FieldByName('Field_Type_Str').AsString);
-      // Array should really be [lowerbound:upperbound] if dimension is 0
+      // Array should really be [lowerbound:upperbound] (if dimension is 0)
       // but for now don't bother as arrays are not supported anyway
       // Assume 0 dimension, 1 lower bound; just fill in upper bound
       if not(FieldByName('Array_Upper_Bound').IsNull) then