github.com/RevenueMonster/sqlike@v1.0.6/sql/dialect/dialect.go (about)

     1  package dialect
     2  
     3  import (
     4  	"reflect"
     5  	"strings"
     6  	"sync"
     7  
     8  	"github.com/RevenueMonster/sqlike/reflext"
     9  	"github.com/RevenueMonster/sqlike/sql"
    10  	"github.com/RevenueMonster/sqlike/sql/codec"
    11  	"github.com/RevenueMonster/sqlike/sql/driver"
    12  	sqlstmt "github.com/RevenueMonster/sqlike/sql/stmt"
    13  	"github.com/RevenueMonster/sqlike/sql/util"
    14  	"github.com/RevenueMonster/sqlike/sqlike/actions"
    15  	"github.com/RevenueMonster/sqlike/sqlike/indexes"
    16  	"github.com/RevenueMonster/sqlike/sqlike/options"
    17  )
    18  
    19  // SQLDialect :
    20  type SQLDialect interface {
    21  	TableName(db, table string) string
    22  	Var(i int) string
    23  	Quote(n string) string
    24  	Format(v interface{}) (val string)
    25  }
    26  
    27  // Dialect :
    28  type Dialect interface {
    29  	SQLDialect
    30  	Connect(opt *options.ConnectOptions) (connStr string)
    31  	UseDatabase(stmt sqlstmt.Stmt, db string)
    32  	GetVersion(stmt sqlstmt.Stmt)
    33  	GetDatabases(stmt sqlstmt.Stmt)
    34  	CreateDatabase(stmt sqlstmt.Stmt, db string, checkExists bool)
    35  	DropDatabase(stmt sqlstmt.Stmt, db string, checkExists bool)
    36  	HasTable(stmt sqlstmt.Stmt, db, table string)
    37  	HasPrimaryKey(stmt sqlstmt.Stmt, db, table string)
    38  	RenameTable(stmt sqlstmt.Stmt, db, oldName, newName string)
    39  	RenameColumn(stmt sqlstmt.Stmt, db, table, oldColName, newColName string)
    40  	DropColumn(stmt sqlstmt.Stmt, db, table, column string)
    41  	DropTable(stmt sqlstmt.Stmt, db, table string, checkExists bool)
    42  	TruncateTable(stmt sqlstmt.Stmt, db, table string)
    43  	GetColumns(stmt sqlstmt.Stmt, db, table string)
    44  	HasIndexByName(stmt sqlstmt.Stmt, db, table, indexName string)
    45  	HasIndex(stmt sqlstmt.Stmt, dbName, table string, idx indexes.Index)
    46  	GetIndexes(stmt sqlstmt.Stmt, db, table string)
    47  	CreateIndexes(stmt sqlstmt.Stmt, db, table string, idxs []indexes.Index, supportDesc bool)
    48  	DropIndexes(stmt sqlstmt.Stmt, db, table string, idxs []string)
    49  	CreateTable(stmt sqlstmt.Stmt, db, table, pk string, info driver.Info, fields []reflext.StructFielder) (err error)
    50  	AlterTable(stmt sqlstmt.Stmt, db, table, pk string, hasPk bool, info driver.Info, fields []reflext.StructFielder, columns util.StringSlice, indexes util.StringSlice, unsafe bool) (err error)
    51  	InsertInto(stmt sqlstmt.Stmt, db, table, pk string, mapper reflext.StructMapper, codec codec.Codecer, fields []reflext.StructFielder, values reflect.Value, opts *options.InsertOptions) (err error)
    52  	Select(stmt sqlstmt.Stmt, act *actions.FindActions, mode options.LockMode) (err error)
    53  	Update(stmt sqlstmt.Stmt, act *actions.UpdateActions) (err error)
    54  	Delete(stmt sqlstmt.Stmt, act *actions.DeleteActions) (err error)
    55  	SelectStmt(stmt sqlstmt.Stmt, query interface{}) (err error)
    56  	Replace(stmt sqlstmt.Stmt, db, table string, columns []string, query *sql.SelectStmt) (err error)
    57  }
    58  
    59  var (
    60  	mutex    = new(sync.RWMutex)
    61  	dialects = make(map[string]Dialect)
    62  )
    63  
    64  // RegisterDialect :
    65  func RegisterDialect(driver string, dialect Dialect) {
    66  	mutex.Lock()
    67  	defer mutex.Unlock()
    68  	if dialect == nil {
    69  		panic("invalid nil dialect")
    70  	}
    71  	dialects[driver] = dialect
    72  }
    73  
    74  // GetDialectByDriver :
    75  func GetDialectByDriver(driver string) Dialect {
    76  	mutex.RLock()
    77  	defer mutex.RUnlock()
    78  	driver = strings.TrimSpace(strings.ToLower(driver))
    79  	return dialects[driver]
    80  }