2024-01-12 13:15:30 +08:00
|
|
|
|
package dbi
|
2022-10-15 17:38:34 +08:00
|
|
|
|
|
2023-05-24 12:32:17 +08:00
|
|
|
|
import (
|
2024-03-18 12:25:40 +08:00
|
|
|
|
"errors"
|
2024-11-01 17:27:22 +08:00
|
|
|
|
"io"
|
2024-10-16 17:24:50 +08:00
|
|
|
|
"mayfly-go/internal/db/dbm/sqlparser"
|
2024-11-01 17:27:22 +08:00
|
|
|
|
"mayfly-go/internal/db/dbm/sqlparser/pgsql"
|
2024-03-15 09:01:51 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2024-03-01 04:03:03 +00:00
|
|
|
|
const (
|
|
|
|
|
|
// -1. 无操作
|
|
|
|
|
|
DuplicateStrategyNone = -1
|
|
|
|
|
|
// 1. 忽略
|
|
|
|
|
|
DuplicateStrategyIgnore = 1
|
|
|
|
|
|
// 2. 更新
|
|
|
|
|
|
DuplicateStrategyUpdate = 2
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2024-01-23 04:08:02 +00:00
|
|
|
|
type DbCopyTable struct {
|
|
|
|
|
|
Id uint64 `json:"id"`
|
|
|
|
|
|
Db string `json:"db" `
|
|
|
|
|
|
TableName string `json:"tableName"`
|
|
|
|
|
|
CopyData bool `json:"copyData"` // 是否复制数据
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
// BaseDialect 基础dialect,在DefaultDialect 都有默认的实现方法
|
|
|
|
|
|
type BaseDialect interface {
|
|
|
|
|
|
|
2024-12-08 13:04:23 +08:00
|
|
|
|
// Quoter sql关键字引用处理,如 table -> `table`、table -> "table"
|
|
|
|
|
|
Quoter() Quoter
|
2024-01-24 08:29:16 +00:00
|
|
|
|
|
2024-01-05 08:55:34 +08:00
|
|
|
|
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
|
2024-02-06 07:16:56 +00:00
|
|
|
|
GetDbProgram() (DbProgram, error)
|
2024-01-05 05:31:32 +00:00
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
// GetDumpHeler
|
|
|
|
|
|
GetDumpHelper() DumpHelper
|
|
|
|
|
|
|
|
|
|
|
|
// GetSQLParser 获取sql解析器
|
|
|
|
|
|
GetSQLParser() sqlparser.SqlParser
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------元数据接口定义------------------------------------------
|
|
|
|
|
|
// Dialect 数据库方言 用于生成sql、批量插入等各个数据库方言不一致的实现方式
|
|
|
|
|
|
type Dialect interface {
|
|
|
|
|
|
BaseDialect
|
|
|
|
|
|
|
2024-07-05 13:14:31 +08:00
|
|
|
|
// CopyTable 拷贝表
|
2024-01-23 04:08:02 +00:00
|
|
|
|
CopyTable(copy *DbCopyTable) error
|
2024-03-15 09:01:51 +00:00
|
|
|
|
|
2024-12-08 13:04:23 +08:00
|
|
|
|
// GetSQLGenerator 获取sql生成器
|
|
|
|
|
|
GetSQLGenerator() SQLGenerator
|
2024-03-18 12:25:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
// DefaultDialect 默认实现,若需要覆盖,则由各个数据库dialect实现去覆盖重写
|
2024-03-18 12:25:40 +08:00
|
|
|
|
type DefaultDialect struct {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
var _ (BaseDialect) = (*DefaultDialect)(nil)
|
|
|
|
|
|
|
2024-12-08 13:04:23 +08:00
|
|
|
|
func (dx *DefaultDialect) Quoter() Quoter {
|
|
|
|
|
|
return DefaultQuoter
|
2024-11-01 17:27:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-18 12:25:40 +08:00
|
|
|
|
func (dd *DefaultDialect) GetDbProgram() (DbProgram, error) {
|
|
|
|
|
|
return nil, errors.New("not support db program")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
func (dd *DefaultDialect) GetDumpHelper() DumpHelper {
|
|
|
|
|
|
return new(DefaultDumpHelper)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (pd *DefaultDialect) GetSQLParser() sqlparser.SqlParser {
|
|
|
|
|
|
return new(pgsql.PgsqlParser)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DumpHelper 导出辅助方法
|
|
|
|
|
|
type DumpHelper interface {
|
|
|
|
|
|
BeforeInsert(writer io.Writer, tableName string)
|
|
|
|
|
|
|
|
|
|
|
|
BeforeInsertSql(quoteSchema string, quoteTableName string) string
|
|
|
|
|
|
|
|
|
|
|
|
AfterInsert(writer io.Writer, tableName string, columns []Column)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type DefaultDumpHelper struct {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (dd *DefaultDumpHelper) BeforeInsert(writer io.Writer, tableName string) {
|
|
|
|
|
|
writer.Write([]byte("BEGIN;\n"))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (dd *DefaultDumpHelper) BeforeInsertSql(quoteSchema string, quoteTableName string) string {
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
2024-10-16 17:24:50 +08:00
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
func (dd *DefaultDumpHelper) AfterInsert(writer io.Writer, tableName string, columns []Column) {
|
|
|
|
|
|
writer.Write([]byte("COMMIT;\n"))
|
2024-10-16 17:24:50 +08:00
|
|
|
|
}
|
2024-12-08 13:04:23 +08:00
|
|
|
|
|
|
|
|
|
|
type SQLGenerator interface {
|
|
|
|
|
|
// GenTableDDL 生成建表语句
|
|
|
|
|
|
GenTableDDL(table Table, columns []Column, dropBeforeCreate bool) []string
|
|
|
|
|
|
|
|
|
|
|
|
// GenIndexDDL 生成索引语句
|
|
|
|
|
|
GenIndexDDL(table Table, indexs []Index) []string
|
|
|
|
|
|
|
|
|
|
|
|
// GenInsert 生成插入语句
|
|
|
|
|
|
GenInsert(tableName string, columns []Column, values [][]any, duplicateStrategy int) []string
|
|
|
|
|
|
}
|