Selaa lähdekoodia

Also sort views internally (only sort views, don't sort between categories). Fix for view column variables output missing in some cases.

Reinier Olislagers 11 vuotta sitten
vanhempi
commit
19f5e8a3ba
4 muutettua tiedostoa jossa 27 lisäystä ja 18 poistoa
  1. 6 1
      TurboBird.lpi
  2. 19 16
      main.pas
  3. 2 0
      scriptdb.pas
  4. 0 1
      systables.pas

+ 6 - 1
TurboBird.lpi

@@ -100,7 +100,7 @@
         <PackageName Value="LCL"/>
       </Item6>
     </RequiredPackages>
-    <Units Count="37">
+    <Units Count="38">
       <Unit0>
         <Filename Value="TurboBird.lpr"/>
         <IsPartOfProject Value="True"/>
@@ -384,6 +384,11 @@
         <ResourceBaseClass Value="Form"/>
         <UnitName Value="Update"/>
       </Unit36>
+      <Unit37>
+        <Filename Value="topologicalsort.pas"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="topologicalsort"/>
+      </Unit37>
     </Units>
   </ProjectOptions>
   <CompilerOptions>

+ 19 - 16
main.pas

@@ -247,6 +247,8 @@ type
     // Get body of a stored procedure (without SET TERM... clauses)
     // Fills SQLQuery1 with details
     function GetStoredProcBody(DatabaseIndex: Integer; AProcName: string; var SPOwner: string): string;
+    // Get body and output parameters of a view
+    // Does *not* fill SQLQuery1 with details
     function GetViewInfo(DatabaseIndex: Integer; AViewName: string; var Columns, Body: string): Boolean;
     function ChangeTriggerActivity(DatabaseIndex: Integer; ATriggerName: string; ActiveState: Boolean): Boolean;
     function GetIndices(ATableName: string; AQuery: TSQLQuery): Boolean;
@@ -2629,6 +2631,20 @@ end;
 (******************  Get View Info (SQL Source) ***************)
 
 function TfmMain.GetViewInfo(DatabaseIndex: Integer; AViewName: string; var Columns, Body: string): Boolean;
+const
+  BodyTemplate= 'SELECT RDB$VIEW_SOURCE ' +
+    ' FROM RDB$RELATIONS ' +
+    ' WHERE RDB$VIEW_SOURCE IS NOT NULL ' +
+    ' AND UPPER(RDB$RELATION_NAME) = ''%s'';';
+  ColumnsTemplate= 'select r.rdb$field_name '+
+    ' from rdb$relation_fields r ' +
+    ' inner join rdb$fields f on ' +
+    ' r.rdb$field_source=f.rdb$field_name ' +
+    ' inner join rdb$types t on ' +
+    ' f.rdb$field_type=t.rdb$type ' +
+    ' where upper(r.rdb$relation_name)=''%s'' and ' +
+    ' t.rdb$field_name=''RDB$FIELD_TYPE'' ' +
+    ' order by r.RDB$FIELD_POSITION ';
 var
   Rec: TDatabaseRec;
 begin
@@ -2637,32 +2653,19 @@ begin
 
   // View Body
   SQLQuery1.Close;
-  SQLQuery1.SQL.Text:= 'SELECT RDB$VIEW_SOURCE ' +
-    'FROM RDB$RELATIONS ' +
-    'WHERE RDB$VIEW_SOURCE IS NOT NULL ' +
-    'AND UPPER(RDB$RELATION_NAME) = ''' + UpperCase(AViewName) + ''';';
+  SQLQuery1.SQL.Text:= format(BodyTemplate, [UpperCase(AViewName)]);
 
   SQLQuery1.Open;
   Body:= SQLQuery1.Fields[0].AsString;
 
   // View Columns
   SQLQuery1.Close;
-  SQLQuery1.SQL.Text:= 'SELECT d.RDB$DEPENDENT_NAME AS view_name, '+
-    'r.RDB$FIELD_NAME AS field_name, '+
-    'd.RDB$DEPENDED_ON_NAME AS depended_on_table, '+
-    'd.RDB$FIELD_NAME AS depended_on_field '+
-    'FROM RDB$DEPENDENCIES d '+
-    'LEFT JOIN RDB$RELATION_FIELDS r ON d.RDB$DEPENDENT_NAME = r.RDB$RELATION_NAME '+
-    '     AND d.RDB$FIELD_NAME = r.RDB$BASE_FIELD '+
-    'WHERE UPPER(d.RDB$DEPENDENT_NAME)=''' + UpperCase(AViewName) + ''' '+
-    '  AND r.RDB$SYSTEM_FLAG = 0 '+
-    '  AND d.RDB$DEPENDENT_TYPE = 1 '+
-    'ORDER BY r.RDB$FIELD_POSITION ';
+  SQLQuery1.SQL.Text:= format(ColumnsTemplate, [UpperCase(AViewName)]);
   Columns:= '';
   SQLQuery1.Open;
   while not SQLQuery1.EOF do
   begin
-    Columns:= Columns + Trim(SQLQuery1.FieldByName('Field_Name').AsString);
+    Columns:= Columns + Trim(SQLQuery1.FieldByName('rdb$field_name').AsString);
     SQLQuery1.Next;
     if not SQLQuery1.EOF then
       Columns:= Columns + ', ';

+ 2 - 0
scriptdb.pas

@@ -321,6 +321,8 @@ begin
   ViewsBodyList:= TStringList.Create;
   try
     ViewsList.CommaText:= dmSysTables.GetDBObjectNames(dbIndex, 4, Count);
+    // Get procedures in dependency order:
+    dmSysTables.SortDependencies(ViewsList);
     List.Clear;
     for i:= 0 to ViewsList.Count - 1 do
     begin

+ 0 - 1
systables.pas

@@ -937,7 +937,6 @@ begin
     ServerTime:= sqQuery.Fields[0].AsString;
     sqQuery.Close;
     Result:= True;
-
   except
     on e: exception do
     begin