interfaces.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package databases
  2. import (
  3. "context"
  4. _ "dbview/service/internal/common/databases/drivers/mysql"
  5. "dbview/service/internal/common/databases/meta"
  6. )
  7. // Connection 基础连接接口
  8. type Connection interface {
  9. Close() error
  10. }
  11. // MetadataReader 新一代元数据读取接口
  12. //
  13. // 说明:
  14. // MetadataReader 使用“基于路径的通用导航模型”(ObjectPath)来定位数据库对象,
  15. // 将对象标识从不透明字符串 id 替换为结构化路径,便于驱动实现与前端 UI 的统一。
  16. //
  17. // 设计要点与约定:
  18. // - ListNodes 用于轻量级的树/列表分页查询(尽量快、传输小);GetNodeDetails 用于获取指定节点的重量级详情(例如表的列/索引)。
  19. // - 所有方法接收 context.Context,用于超时与取消控制;实现方应尊重上下文取消。
  20. // - 返回值中的 meta.Node / meta.NodeDetails 应尽量只包含前端需要的字段,避免携带大量未压缩数据。
  21. // - 错误处理:实现方应返回可读的 error(用于上层日志/提示),但不要泄露敏感信息(如密码)。
  22. //
  23. // 方法说明:
  24. // GetStructureDefinition(ctx):
  25. //
  26. // 返回数据库类型的层级定义(NodeTypeDefinition 列表),用于前端在构建树时决定每个层级的显示和可展开的子类型。
  27. // 实现该方法时应避免做重量级 IO,可以返回静态或缓存的描述信息。
  28. //
  29. // ListNodes(ctx, path, req):
  30. //
  31. // 列出指定父路径下的子节点(轻量级),返回节点数组和满足条件的总数(用于分页)。
  32. // - path: 结构化父路径,空路径表示根(例如列出数据库)。
  33. // - req: 支持分页、类型过滤和名称过滤等。实现应在 DB 层尽量做过滤/分页以节省网络带宽。
  34. //
  35. // GetNodeDetails(ctx, path):
  36. //
  37. // 获取指定节点的完整详情,Driver 可在 NodeDetails.RawMetadata 中附加任意驱动特有信息(例如列定义、DDL、权限等)。
  38. //
  39. // SearchNodes(ctx, keyword, scope):
  40. //
  41. // 在给定作用域内搜索节点(全局搜索时 scope 为空)。实现应限制返回结果数量并尽量使用索引以提高性能。
  42. type MetadataReader interface {
  43. GetStructureDefinition(ctx context.Context) ([]meta.NodeTypeDefinition, error)
  44. ListNodes(ctx context.Context, path meta.ObjectPath, req meta.ListNodesRequest) ([]meta.Node, int64, error)
  45. GetNodeDetails(ctx context.Context, path meta.ObjectPath) (meta.NodeDetails, error)
  46. SearchNodes(ctx context.Context, keyword string, scope meta.ObjectPath) ([]meta.Node, error)
  47. }
  48. // ObjectManager 统一管理对象的生命周期(创建、修改、删除)
  49. //
  50. // 设计理念:采用“意图驱动 + 预览优先”的工作流。
  51. // 前端通过 GetObjectProperties 获取要渲染的属性定义和当前值,生成表单;用户提交后通过 ApplyChanges
  52. // 提交变更(支持 DryRun 预览与实际执行)。
  53. //
  54. // 约定与语义:
  55. // - GetObjectProperties:当 path 的最后一段没有 Name 时,表示创建场景(返回创建模板/字段);当有 Name 时,表示修改场景(返回字段定义+当前值)。
  56. // - PropertyDefinitions 描述每个字段的 label/type/required/options 等,PropertyValues 为 key->value 的当前值映射。
  57. // - ApplyChanges:通过 action 指定 create/update/delete。options.DryRun=true 表示仅生成预览(返回生成 SQL/脚本等),不进行实际变更。
  58. // - ApplyResult 应包含生成的脚本、受影响行数及可供前端显示的简短消息。
  59. // - 实现方在执行真实修改时应注意事务一致性(并在无法回滚的 DDL 场景下明确告知前端)。
  60. //
  61. // 错误处理:驱动实现应返回明确的 error 用于上层展示或日志,验证类错误(参数缺失/格式错误)建议返回易于前端处理的错误信息。
  62. type ObjectManager interface {
  63. GetObjectProperties(ctx context.Context, path meta.ObjectPath) (meta.PropertyDefinitions, meta.PropertyValues, error)
  64. ApplyChanges(ctx context.Context, action meta.ObjectAction, path meta.ObjectPath, changes meta.PropertyValues, options meta.ApplyOptions) (meta.ApplyResult, error)
  65. }
  66. // MetadataRefresher 提供按对象刷新元数据的能力(例如在驱动层重新加载某对象缓存)
  67. //
  68. // 使用场景:当外部操作(如通过 SQL 执行变更)导致驱动内部缓存失效时,可调用该方法通知驱动刷新指定对象的元数据。
  69. // objectID 的语义由上层约定(通常为连接/对象唯一标识),实现方需记录其预期格式并在文档中说明。
  70. type MetadataRefresher interface {
  71. RefreshObject(ctx context.Context, objectID string) error
  72. }
  73. // MetadataInfo 提供数据库级别的额外元信息查询
  74. //
  75. // 返回值用于驱动能力探测(如支持的数据类型、关键字、函数等),前端或管理组件可以据此调整 UI/校验逻辑。
  76. type MetadataInfo interface {
  77. GetMetadataInfo(ctx context.Context) (meta.MetadataCapabilities, error)
  78. }
  79. // DataReader 数据读取接口:对路径指向的对象(通常为 table / view)执行数据查询
  80. //
  81. // 说明:该接口用于实现表数据的分页/过滤/排序查询。path 应指向包含表信息的 ObjectPath。
  82. // 实现时请注意 SQL 注入风险,优先使用参数化查询。返回的 meta.QueryResult 包含列元信息与行数据。
  83. type DataReader interface {
  84. // QueryData 执行数据查询。
  85. // 新增参数 includeLarge:当为 true 时,驱动应尽量返回大型字段(BLOB/CLOB)的完整内容;
  86. // 当为 false 时,驱动可按策略省略大型字段并在返回的 meta.QueryResult 的 DataMeta 中设置 `omitted:true`。
  87. QueryData(ctx context.Context, path meta.ObjectPath, req meta.DataQueryRequest, includeLarge bool) (meta.QueryResult, error)
  88. }
  89. // DataExecutor 统一的执行接口
  90. //
  91. // 说明:用于执行任意 SQL(包括 DDL/DML)。path 提供可选的上下文(例如当前数据库/表)。
  92. // 实现应尽量返回结构化的 meta.ExecuteResult,包含执行成功与否、受影响行数和错误信息。
  93. type DataExecutor interface {
  94. // ExecuteSQL 执行任意SQL并返回执行结果。
  95. // 新增参数 includeLarge:当为 true 时,驱动应尽量返回大对象字段的完整值;
  96. // 当为 false 时,驱动可按策略省略大型 LOB 字段并在 meta.ExecuteResult.Data 中标记为 Omitted。
  97. ExecuteSQL(ctx context.Context, path meta.ObjectPath, sql string, params []interface{}, includeLarge bool) (meta.ExecuteResult, error)
  98. }
  99. // 以下为向后兼容的旧接口定义(保留,便于逐步迁移)
  100. type MetadataDeleter interface {
  101. DescribeDeleteTemplate(ctx context.Context, path meta.ObjectPath) (meta.ObjectTemplate, error)
  102. DeleteRootObjects(ctx context.Context, req meta.ObjectOperationRequest) (meta.ObjectOperationResponse, error)
  103. DeleteChildObjects(ctx context.Context, req meta.ObjectOperationRequest) (meta.ObjectOperationResponse, error)
  104. }
  105. type MetadataCreater interface {
  106. DescribeCreateTemplate(ctx context.Context, path meta.ObjectPath) (meta.ObjectTemplate, error)
  107. CreateObject(ctx context.Context, req meta.CreateObjectRequest) (meta.CreateObjectResponse, error)
  108. }
  109. type MetadataUpdater interface {
  110. DescribeUpdateTemplate(ctx context.Context, path meta.ObjectPath) (meta.ObjectTemplate, error)
  111. UpdateObject(ctx context.Context, req meta.UpdateObjectRequest) (meta.UpdateObjectResponse, error)
  112. }