gnatcoll-db中dborm.py例程解析及Ada重写问题咨询
gnatcoll-db dborm模块Ada重写相关问题
背景
使用gnatcoll-db时受现有功能限制,需要用Ada语言重写dborm.py模块。目前对该Python文件内两个例程的逻辑理解存在障碍,分别是compute_table_aliases和fields_count_array,欢迎开发者提供相关帮助,重写完成后的修改内容将面向所有开发者开放共享。
基础信息
- 个人修改的项目fork版本已托管在公开代码平台,因许可和规则限制此处不放置外部跳转链接
- 因不确定ACS许可条款要求,此处不直接粘贴
dborm.py完整例程代码,该文件可从gnatcoll-db官方仓库的gnatcoll_db2ada目录下获取 - 待翻译为Ada语言的核心例程共两组:
compute_table_aliases:对应源文件2407至2448行,目前完全不理解该算法的实现逻辑fields_count_array与fields_count:对应源文件2372至2397行,已完成这两个例程的Ada版本翻译,但测试时仅部分场景返回结果正确,仍存在异常
已编写的Ada版本实现代码
以下代码中所有自定义类型定义均来自gnatcoll-sql库:
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; -- 每次调用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;
交流相关咨询
仅靠上述信息较难完整跟进定位问题,如有需要可提供完整修改说明,以及可替代dborm.py的全新Ada实现包,想了解提交这些内容的合适渠道,方便开展技术交流。
内容的提问来源于stack exchange,提问作者fdesp87
相关产品推荐
相关产品推荐

