dialect.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package core
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. )
  7. type DbType string
  8. type Uri struct {
  9. DbType DbType
  10. Proto string
  11. Host string
  12. Port string
  13. DbName string
  14. User string
  15. Passwd string
  16. Charset string
  17. Laddr string
  18. Raddr string
  19. Timeout time.Duration
  20. }
  21. // a dialect is a driver's wrapper
  22. type Dialect interface {
  23. SetLogger(logger ILogger)
  24. Init(*DB, *Uri, string, string) error
  25. URI() *Uri
  26. DB() *DB
  27. DBType() DbType
  28. SqlType(*Column) string
  29. FormatBytes(b []byte) string
  30. DriverName() string
  31. DataSourceName() string
  32. QuoteStr() string
  33. IsReserved(string) bool
  34. Quote(string) string
  35. AndStr() string
  36. OrStr() string
  37. EqStr() string
  38. RollBackStr() string
  39. AutoIncrStr() string
  40. SupportInsertMany() bool
  41. SupportEngine() bool
  42. SupportCharset() bool
  43. SupportDropIfExists() bool
  44. IndexOnTable() bool
  45. ShowCreateNull() bool
  46. IndexCheckSql(tableName, idxName string) (string, []interface{})
  47. TableCheckSql(tableName string) (string, []interface{})
  48. IsColumnExist(tableName string, colName string) (bool, error)
  49. CreateTableSql(table *Table, tableName, storeEngine, charset string) string
  50. DropTableSql(tableName string) string
  51. CreateIndexSql(tableName string, index *Index) string
  52. DropIndexSql(tableName string, index *Index) string
  53. ModifyColumnSql(tableName string, col *Column) string
  54. //CreateTableIfNotExists(table *Table, tableName, storeEngine, charset string) error
  55. //MustDropTable(tableName string) error
  56. GetColumns(tableName string) ([]string, map[string]*Column, error)
  57. GetTables() ([]*Table, error)
  58. GetIndexes(tableName string) (map[string]*Index, error)
  59. Filters() []Filter
  60. }
  61. func OpenDialect(dialect Dialect) (*DB, error) {
  62. return Open(dialect.DriverName(), dialect.DataSourceName())
  63. }
  64. type Base struct {
  65. db *DB
  66. dialect Dialect
  67. driverName string
  68. dataSourceName string
  69. Logger ILogger
  70. *Uri
  71. }
  72. func (b *Base) DB() *DB {
  73. return b.db
  74. }
  75. func (b *Base) SetLogger(logger ILogger) {
  76. b.Logger = logger
  77. }
  78. func (b *Base) Init(db *DB, dialect Dialect, uri *Uri, drivername, dataSourceName string) error {
  79. b.db, b.dialect, b.Uri = db, dialect, uri
  80. b.driverName, b.dataSourceName = drivername, dataSourceName
  81. return nil
  82. }
  83. func (b *Base) URI() *Uri {
  84. return b.Uri
  85. }
  86. func (b *Base) DBType() DbType {
  87. return b.Uri.DbType
  88. }
  89. func (b *Base) FormatBytes(bs []byte) string {
  90. return fmt.Sprintf("0x%x", bs)
  91. }
  92. func (b *Base) DriverName() string {
  93. return b.driverName
  94. }
  95. func (b *Base) ShowCreateNull() bool {
  96. return true
  97. }
  98. func (b *Base) DataSourceName() string {
  99. return b.dataSourceName
  100. }
  101. func (b *Base) AndStr() string {
  102. return "AND"
  103. }
  104. func (b *Base) OrStr() string {
  105. return "OR"
  106. }
  107. func (b *Base) EqStr() string {
  108. return "="
  109. }
  110. func (db *Base) RollBackStr() string {
  111. return "ROLL BACK"
  112. }
  113. func (db *Base) SupportDropIfExists() bool {
  114. return true
  115. }
  116. func (db *Base) DropTableSql(tableName string) string {
  117. return fmt.Sprintf("DROP TABLE IF EXISTS `%s`", tableName)
  118. }
  119. func (db *Base) HasRecords(query string, args ...interface{}) (bool, error) {
  120. rows, err := db.DB().Query(query, args...)
  121. if db.Logger != nil {
  122. db.Logger.Info("[sql]", query, args)
  123. }
  124. if err != nil {
  125. return false, err
  126. }
  127. defer rows.Close()
  128. if rows.Next() {
  129. return true, nil
  130. }
  131. return false, nil
  132. }
  133. func (db *Base) IsColumnExist(tableName, colName string) (bool, error) {
  134. query := "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ?"
  135. query = strings.Replace(query, "`", db.dialect.QuoteStr(), -1)
  136. return db.HasRecords(query, db.DbName, tableName, colName)
  137. }
  138. /*
  139. func (db *Base) CreateTableIfNotExists(table *Table, tableName, storeEngine, charset string) error {
  140. sql, args := db.dialect.TableCheckSql(tableName)
  141. rows, err := db.DB().Query(sql, args...)
  142. if db.Logger != nil {
  143. db.Logger.Info("[sql]", sql, args)
  144. }
  145. if err != nil {
  146. return err
  147. }
  148. defer rows.Close()
  149. if rows.Next() {
  150. return nil
  151. }
  152. sql = db.dialect.CreateTableSql(table, tableName, storeEngine, charset)
  153. _, err = db.DB().Exec(sql)
  154. if db.Logger != nil {
  155. db.Logger.Info("[sql]", sql)
  156. }
  157. return err
  158. }*/
  159. func (db *Base) CreateIndexSql(tableName string, index *Index) string {
  160. quote := db.dialect.Quote
  161. var unique string
  162. var idxName string
  163. if index.Type == UniqueType {
  164. unique = " UNIQUE"
  165. }
  166. idxName = index.XName(tableName)
  167. return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v)", unique,
  168. quote(idxName), quote(tableName),
  169. quote(strings.Join(index.Cols, quote(","))))
  170. }
  171. func (db *Base) DropIndexSql(tableName string, index *Index) string {
  172. quote := db.dialect.Quote
  173. var name string
  174. if index.IsRegular {
  175. name = index.XName(tableName)
  176. } else {
  177. name = index.Name
  178. }
  179. return fmt.Sprintf("DROP INDEX %v ON %s", quote(name), quote(tableName))
  180. }
  181. func (db *Base) ModifyColumnSql(tableName string, col *Column) string {
  182. return fmt.Sprintf("alter table %s MODIFY COLUMN %s", tableName, col.StringNoPk(db.dialect))
  183. }
  184. func (b *Base) CreateTableSql(table *Table, tableName, storeEngine, charset string) string {
  185. var sql string
  186. sql = "CREATE TABLE IF NOT EXISTS "
  187. if tableName == "" {
  188. tableName = table.Name
  189. }
  190. sql += b.dialect.Quote(tableName) + " ("
  191. pkList := table.PrimaryKeys
  192. for _, colName := range table.ColumnsSeq() {
  193. col := table.GetColumn(colName)
  194. if col.IsPrimaryKey && len(pkList) == 1 {
  195. sql += col.String(b.dialect)
  196. } else {
  197. sql += col.StringNoPk(b.dialect)
  198. }
  199. sql = strings.TrimSpace(sql)
  200. sql += ", "
  201. }
  202. if len(pkList) > 1 {
  203. sql += "PRIMARY KEY ( "
  204. sql += b.dialect.Quote(strings.Join(pkList, b.dialect.Quote(",")))
  205. sql += " ), "
  206. }
  207. sql = sql[:len(sql)-2] + ")"
  208. if b.dialect.SupportEngine() && storeEngine != "" {
  209. sql += " ENGINE=" + storeEngine
  210. }
  211. if b.dialect.SupportCharset() {
  212. if len(charset) == 0 {
  213. charset = b.dialect.URI().Charset
  214. }
  215. if len(charset) > 0 {
  216. sql += " DEFAULT CHARSET " + charset
  217. }
  218. }
  219. sql += ";"
  220. return sql
  221. }
  222. var (
  223. dialects = map[DbType]Dialect{}
  224. )
  225. func RegisterDialect(dbName DbType, dialect Dialect) {
  226. if dialect == nil {
  227. panic("core: Register dialect is nil")
  228. }
  229. dialects[dbName] = dialect // !nashtsai! allow override dialect
  230. }
  231. func QueryDialect(dbName DbType) Dialect {
  232. return dialects[dbName]
  233. }