database_io.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. package dataway
  2. import (
  3. "errors"
  4. "fmt"
  5. "strconv"
  6. "time"
  7. "xorm.io/xorm"
  8. "xps/cmd/cache"
  9. "xps/cmd/constant"
  10. "xps/pkg/common"
  11. )
  12. type DatabaseIO struct {
  13. engine *xorm.Engine
  14. }
  15. func NewDatabaseIO(engine *xorm.Engine) *DatabaseIO {
  16. return &DatabaseIO{
  17. engine: engine,
  18. }
  19. }
  20. func (d *DatabaseIO) BuildQueryParam(params []common.QueryParam) string {
  21. sqlWhere := " WHERE 1 = 1 "
  22. for _, param := range params {
  23. paramType := param.Type
  24. if paramType == constant.DATA_TYPE_DATE ||
  25. paramType == constant.DATA_TYPE_DATETIME ||
  26. paramType == constant.DATA_TYPE_VARCHAR {
  27. sqlWhere += fmt.Sprintf(" %s %v %s '%v'", param.LogicalOperator, param.Name, param.CompareOperator, param.Value)
  28. } else {
  29. sqlWhere += fmt.Sprintf(" %s %v %s %v", param.LogicalOperator, param.Name, param.CompareOperator, param.Value)
  30. }
  31. }
  32. return sqlWhere
  33. }
  34. func (d *DatabaseIO) GetPage(sqlStatement, sqlCount string, params []common.QueryParam, page int, limit int) (*common.PageResult, error) {
  35. sqlWhere := d.BuildQueryParam(params)
  36. res, err1 := d.engine.Query(sqlCount + sqlWhere)
  37. if err1 != nil {
  38. return nil, err1
  39. }
  40. total := int64(0)
  41. for _, v := range res[0] {
  42. total, _ = strconv.ParseInt(string(v), 10, 64)
  43. }
  44. pageStart := (page - 1) * limit
  45. sqlLimit := fmt.Sprintf(" LIMIT %d OFFSET %d ", limit, pageStart)
  46. data, err2 := d.engine.QueryInterface(sqlStatement + sqlWhere + sqlLimit)
  47. if err2 != nil {
  48. return nil, err2
  49. }
  50. pageResult := &common.PageResult{
  51. Total: total,
  52. PageSize: limit,
  53. Page: page,
  54. Data: data,
  55. }
  56. return pageResult, nil
  57. }
  58. func (d *DatabaseIO) GetList(sqlStatement string, params []common.QueryParam) ([]map[string]interface{}, error) {
  59. sqlWhere := d.BuildQueryParam(params)
  60. results, err := d.engine.QueryInterface(sqlStatement + sqlWhere)
  61. if err != nil {
  62. return nil, err
  63. }
  64. return results, nil
  65. }
  66. func (d *DatabaseIO) GetById(sqlStatement string, params []common.QueryParam) (map[string]interface{}, error) {
  67. sqlWhere := d.BuildQueryParam(params)
  68. results, err := d.engine.QueryInterface(sqlStatement + sqlWhere)
  69. if err != nil {
  70. return nil, err
  71. }
  72. if len(results) > 1 {
  73. return nil, errors.New(" 主键不唯一")
  74. }
  75. return results[0], nil
  76. }
  77. func (d *DatabaseIO) Create(objectCode string, values map[string]interface{}) error {
  78. object, err1 := cache.GetModelObject(objectCode)
  79. if err1 != nil {
  80. return err1
  81. }
  82. tableName := object.ObjectCode
  83. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  84. if err2 != nil {
  85. return err2
  86. }
  87. sql := "INSERT INTO" + fmt.Sprintf(" %s ", tableName)
  88. sqlFields := "( "
  89. sqlValues := "VALUES ( "
  90. for idx, field := range fields {
  91. fieldName := field.AttrCode
  92. fieldType := field.AttrType
  93. fieldValue, ok := values[fieldName]
  94. if !ok {
  95. return nil
  96. }
  97. if idx > 0 {
  98. sqlFields += ","
  99. sqlValues += ","
  100. }
  101. sqlFields += fieldName + ""
  102. if fieldType == constant.DATA_TYPE_DATE ||
  103. fieldType == constant.DATA_TYPE_DATETIME ||
  104. fieldType == constant.DATA_TYPE_VARCHAR {
  105. sqlValues += fmt.Sprintf("'%v'", fieldValue) + ""
  106. } else {
  107. sqlValues += fmt.Sprintf("%v", fieldValue) + ""
  108. }
  109. }
  110. sqlFields += ") "
  111. sqlValues += ") "
  112. _, err3 := d.engine.Exec(sql + sqlFields + sqlValues)
  113. return err3
  114. }
  115. func (d *DatabaseIO) Update(objectCode string, values map[string]interface{}) error {
  116. object, err1 := cache.GetModelObject(objectCode)
  117. if err1 != nil {
  118. return err1
  119. }
  120. tableName := object.ObjectCode
  121. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  122. if err2 != nil {
  123. return err2
  124. }
  125. sql := fmt.Sprintf("UPDATE %s ", tableName)
  126. sqlFieldSets := " SET "
  127. sqlWhere := " WHERE 1 = 1 "
  128. bFirstSetValue := true
  129. for _, field := range fields {
  130. fieldName := field.AttrCode
  131. fieldType := field.AttrType
  132. fieldValue, ok := values[fieldName]
  133. if !ok {
  134. return nil
  135. }
  136. if !bFirstSetValue {
  137. sqlFieldSets += ","
  138. }
  139. if field.IsPKey <= 0 {
  140. bFirstSetValue = false
  141. if fieldType == constant.DATA_TYPE_DATE ||
  142. fieldType == constant.DATA_TYPE_DATETIME ||
  143. fieldType == constant.DATA_TYPE_VARCHAR {
  144. sqlFieldSets += fmt.Sprintf(" %s = '%v' ", fieldName, fieldValue) + ""
  145. } else {
  146. sqlFieldSets += fmt.Sprintf(" %s = %v ", fieldName, fieldValue) + ""
  147. }
  148. } else {
  149. if fieldType == constant.DATA_TYPE_DATE ||
  150. fieldType == constant.DATA_TYPE_DATETIME ||
  151. fieldType == constant.DATA_TYPE_VARCHAR {
  152. sqlWhere += fmt.Sprintf(" AND %s = '%v' ", fieldName, fieldValue) + ""
  153. } else {
  154. sqlWhere += fmt.Sprintf(" AND %s = %v ", fieldName, fieldValue) + ""
  155. }
  156. }
  157. }
  158. _, err := d.engine.Exec(sql + sqlFieldSets + sqlWhere)
  159. return err
  160. }
  161. func (d *DatabaseIO) Patch(objectCode string, values map[string]interface{}) error {
  162. object, err1 := cache.GetModelObject(objectCode)
  163. if err1 != nil {
  164. return err1
  165. }
  166. tableName := object.ObjectCode
  167. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  168. if err2 != nil {
  169. return err2
  170. }
  171. sql := fmt.Sprintf("UPDATE table %s ", tableName)
  172. sqlFieldSets := "SET "
  173. sqlWhere := "WHERE 1 = 1"
  174. for idx, field := range fields {
  175. fieldName := field.AttrCode
  176. fieldType := field.AttrType
  177. fieldValue, ok := values[fieldName]
  178. if !ok {
  179. return nil
  180. }
  181. if idx > 0 {
  182. sqlFieldSets += ","
  183. }
  184. if field.IsPKey <= 0 {
  185. if fieldType == constant.DATA_TYPE_DATE ||
  186. fieldType == constant.DATA_TYPE_DATETIME ||
  187. fieldType == constant.DATA_TYPE_VARCHAR {
  188. sqlFieldSets += fmt.Sprintf(" %s = '%v' ", fieldName, fieldValue) + ""
  189. } else {
  190. sqlFieldSets += fmt.Sprintf(" %s = %v ", fieldName, fieldValue) + ""
  191. }
  192. } else {
  193. if fieldType == constant.DATA_TYPE_DATE ||
  194. fieldType == constant.DATA_TYPE_DATETIME ||
  195. fieldType == constant.DATA_TYPE_VARCHAR {
  196. sqlWhere += fmt.Sprintf(" AND %s = '%v' ", fieldName, fieldValue) + ""
  197. } else {
  198. sqlWhere += fmt.Sprintf(" AND %s = %v ", fieldName, fieldValue) + ""
  199. }
  200. }
  201. }
  202. _, err := d.engine.Exec(sql + sqlFieldSets + sqlWhere)
  203. return err
  204. }
  205. func (d *DatabaseIO) Delete(objectCode string, values map[string]interface{}) error {
  206. object, err1 := cache.GetModelObject(objectCode)
  207. if err1 == nil {
  208. return err1
  209. }
  210. tableName := object.ObjectCode
  211. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  212. if err2 != nil {
  213. return err2
  214. }
  215. deletedBy := values["deletedBy"].(int64)
  216. sql := fmt.Sprintf("UPDATE table %s ", tableName)
  217. sqlFieldSets := fmt.Sprintf("SET deleted_flag = 1 AND deleted_by = %d AND deleted_at = %s", deletedBy, time.Now().String())
  218. sqlWhere := "WHERE 1 = 1"
  219. for idx, field := range fields {
  220. fieldName := field.AttrCode
  221. fieldType := field.AttrType
  222. fieldValue, ok := values[fieldName]
  223. if !ok {
  224. return nil
  225. }
  226. if idx > 0 {
  227. sqlFieldSets += ","
  228. }
  229. if field.IsPKey >= 1 {
  230. if fieldType == constant.DATA_TYPE_DATE ||
  231. fieldType == constant.DATA_TYPE_DATETIME ||
  232. fieldType == constant.DATA_TYPE_VARCHAR {
  233. sqlFieldSets += fmt.Sprintf(" %s = '%v' ", fieldName, fieldValue) + ""
  234. } else {
  235. sqlFieldSets += fmt.Sprintf(" %s = %v ", fieldName, fieldValue) + ""
  236. }
  237. }
  238. }
  239. _, err := d.engine.Exec(sql + sqlFieldSets + sqlWhere)
  240. return err
  241. }