ソースを参照

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 年 前
コミット
19f5e8a3ba
4 ファイル変更27 行追加18 行削除
  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