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