I was using gnatcoll-db
, but the limitations made me to rewrite dborm.py
in Ada. There are two routines in dborm.py
(in python) that I don't understand, specifically compute_table_aliases
and fields_count_array
.
Any help will be welcome. Of course, the modifications can be shared between all of us.
Edited to complete information:
My project fork is here. I don't want to copy here the complete routines from dborm.py as I don't know exactly the license terms of ACS. dborm.py
can be downloaded from https://github.com/AdaCore/gnatcoll-db/tree/master/gnatcoll_db2ada.
The routines that I want to translate to Ada are:
- compute_table_aliases, lines 2407 to 2448. Really I don't understand the algorithm.
- fields_count_array and fields_count, lines 2372 to 2397. For these routines I have a translation to Ada but when testing, the result is OK except in a few cases.
Here is my translation to Ada:
Max_Depth : constant := 3; type Counts_Array is array (0 .. Max_Depth) of Integer;
function Fields_Count_Array (T : Table_Description;
Follow_LJ : Boolean;
DepthMax : Integer;
FKStop : Field := No_Field)
return Counts_Array is
FK_Stop : Boolean; -- to be reset before each call to fields_count_
Depth : Integer := 0;
Temp : Counts_Array;
function Fields_Count (T : Table_Description;
Depth : Integer;
Follow_LJ : Boolean;
FKStop : Field := No_Field) return Integer;
function Fields_Count (T : Table_Description;
Depth : Integer;
Follow_LJ : Boolean;
FKStop : Field := No_Field)
return Integer is
Result : Integer;
procedure Process_FK (FK : in out Field);
procedure Process_FK (FK : in out Field) is
begin
if FK = FKStop then
FK_Stop := True;
return;
end if;
if FK_Stop then
return;
end if;
if Follow_LJ or (not FK.Can_Be_Null) then
Result := Result +
Fields_Count (Pointed_Table (FK), Depth - 1, Follow_LJ);
end if;
end Process_FK;
begin
Result := Num_Fields (T);
if Depth > 0 then
For_Each_FK (T, Process_FK'Access);
end if;
return Result;
end Fields_Count;
begin
while Depth <= DepthMax loop
FK_Stop := False;
Temp (Depth) := Fields_Count (T, Depth, Follow_LJ, FKStop);
Depth := Depth + 1;
end loop;
return Temp;
end Fields_Count_Array;
Note that all type definitions come from gnatcoll-sql.
I understand that this is difficult to follow, perphaps may be better if I send a report on the modifications and the complete new Ada package replacing dborm.py. How?