backends_mock.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package sqlchemy
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "reflect"
  6. "yunion.io/x/pkg/utils"
  7. )
  8. const (
  9. mockBackendName = DBBackendName("mock")
  10. )
  11. type sMockColumn struct {
  12. SBaseColumn
  13. isCreatedAt bool
  14. isUpdatedAt bool
  15. isAutoVersion bool
  16. }
  17. func (c *sMockColumn) DefinitionString() string {
  18. return fmt.Sprintf("%s %s", c.name, c.sqlType)
  19. }
  20. func (c *sMockColumn) ConvertFromString(str string) interface{} {
  21. return str
  22. }
  23. func (c *sMockColumn) ConvertFromValue(v interface{}) interface{} {
  24. return v
  25. }
  26. func (c *sMockColumn) IsAutoVersion() bool {
  27. return c.isAutoVersion
  28. }
  29. func (c *sMockColumn) IsUpdatedAt() bool {
  30. return c.isUpdatedAt
  31. }
  32. func (c *sMockColumn) IsCreatedAt() bool {
  33. return c.isCreatedAt
  34. }
  35. func (c *sMockColumn) IsNumeric() bool {
  36. switch c.sqlType {
  37. case "int", "uint", "int8", "int16", "int32", "int64", "uin8", "uint16", "uint32", "uint64", "float32", "float64":
  38. return true
  39. }
  40. return false
  41. }
  42. func (c *sMockColumn) IsText() bool {
  43. return c.sqlType == "string"
  44. }
  45. func (c *sMockColumn) IsZero(val interface{}) bool {
  46. return reflect.ValueOf(val).IsZero()
  47. }
  48. func newMockColumn(name string, sqlType string, tagMap map[string]string, isPointer bool) sMockColumn {
  49. var (
  50. isCreatedAt = false
  51. isUpdatedAt = false
  52. isAutoVersion = false
  53. val string
  54. ok bool
  55. )
  56. tagMap, val, ok = utils.TagPop(tagMap, TAG_CREATE_TIMESTAMP)
  57. if ok {
  58. isCreatedAt = utils.ToBool(val)
  59. }
  60. tagMap, val, ok = utils.TagPop(tagMap, TAG_UPDATE_TIMESTAMP)
  61. if ok {
  62. isUpdatedAt = utils.ToBool(val)
  63. }
  64. tagMap, val, ok = utils.TagPop(tagMap, TAG_AUTOVERSION)
  65. if ok {
  66. isAutoVersion = utils.ToBool(val)
  67. }
  68. return sMockColumn{
  69. SBaseColumn: NewBaseColumn(name, sqlType, tagMap, isPointer),
  70. isCreatedAt: isCreatedAt,
  71. isUpdatedAt: isUpdatedAt,
  72. isAutoVersion: isAutoVersion,
  73. }
  74. }
  75. type sMockBackend struct {
  76. SBaseBackend
  77. }
  78. func SetupMockDatabaseBackend() {
  79. RegisterBackend(&sMockBackend{})
  80. SetDBWithNameBackend(&sql.DB{}, DefaultDB, mockBackendName)
  81. }
  82. func (mock *sMockBackend) Name() DBBackendName {
  83. return mockBackendName
  84. }
  85. // CanUpdate returns wether the backend supports update
  86. func (mock *sMockBackend) CanUpdate() bool {
  87. return true
  88. }
  89. // CanInsert returns wether the backend supports Insert
  90. func (mock *sMockBackend) CanInsert() bool {
  91. return true
  92. }
  93. // CanInsertOrUpdate returns weather the backend supports InsertOrUpdate
  94. func (mock *sMockBackend) CanInsertOrUpdate() bool {
  95. return true
  96. }
  97. func (mock *sMockBackend) DropIndexSQLTemplate() string {
  98. return ""
  99. }
  100. func (mock *sMockBackend) InsertOrUpdateSQLTemplate() string {
  101. return "INSERT INTO `{{ .Table }}` ({{ .Columns }}) VALUES ({{ .Values }}) ON DUPLICATE KEY UPDATE {{ .SetValues }}"
  102. }
  103. func (mock *sMockBackend) PrepareInsertOrUpdateSQL(ts ITableSpec, insertColNames []string, insertFields []string, onPrimaryCols []string, updateSetCols []string, insertValues []interface{}, updateValues []interface{}) (string, []interface{}) {
  104. return "", nil
  105. }
  106. func (mock *sMockBackend) GetTableSQL() string {
  107. return ""
  108. }
  109. func (mock *sMockBackend) IsSupportIndexAndContraints() bool {
  110. return true
  111. }
  112. func (mock *sMockBackend) GetCreateSQLs(ts ITableSpec) []string {
  113. return nil
  114. }
  115. func (mock *sMockBackend) FetchIndexesAndConstraints(ts ITableSpec) ([]STableIndex, []STableConstraint, error) {
  116. return nil, nil, nil
  117. }
  118. func (mock *sMockBackend) FetchTableColumnSpecs(ts ITableSpec) ([]IColumnSpec, error) {
  119. return nil, nil
  120. }
  121. func (mock *sMockBackend) GetColumnSpecByFieldType(table *STableSpec, fieldType reflect.Type, fieldname string, tagmap map[string]string, isPointer bool) IColumnSpec {
  122. col := newMockColumn(fieldname, fieldType.String(), tagmap, isPointer)
  123. return &col
  124. }
  125. func (mock *sMockBackend) CurrentUTCTimeStampString() string {
  126. return "UTC_NOW()"
  127. }
  128. func (mock *sMockBackend) CurrentTimeStampString() string {
  129. return "NOW()"
  130. }
  131. func (mock *sMockBackend) CommitTableChangeSQL(ts ITableSpec, changes STableChanges) []string {
  132. return []string{}
  133. }
  134. func (mock *sMockBackend) QuoteChar() string {
  135. return "`"
  136. }