nosql.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package nosql
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "fmt"
  6. )
  7. // OpenTXMethod is callback functon to open transaction in NoSQL object
  8. type OpenTXMethod func() (*sql.Tx, error)
  9. // NoSQL object
  10. type NoSQL struct {
  11. openMethod OpenTXMethod
  12. }
  13. // New is NoSQL object constructor
  14. func New(openMethod OpenTXMethod) *NoSQL {
  15. return &NoSQL{openMethod}
  16. }
  17. // CallJSON accepts raw json bytes and returns result raw json bytes
  18. func (_self *NoSQL) CallJSON(function string, rawJSON []byte) (resRawJSON []byte, err error) {
  19. // open tx
  20. var tx *sql.Tx
  21. if tx, err = _self.openMethod(); err == nil {
  22. // execute query and scan result
  23. row := tx.QueryRow(fmt.Sprintf("select * from %v($1)", function), rawJSON)
  24. if err = row.Scan(&resRawJSON); err != nil {
  25. tx.Rollback()
  26. return
  27. }
  28. err = tx.Commit()
  29. }
  30. return
  31. }
  32. // CallObjParam accepts interface{} object and returns result raw json bytes
  33. func (_self *NoSQL) CallObjParam(function string, data interface{}) (resRawJSON []byte, err error) {
  34. // convert incoming object to raw json
  35. var raw []byte
  36. if raw, err = json.Marshal(data); err != nil {
  37. return
  38. }
  39. return _self.CallJSON(function, raw)
  40. }
  41. // Call accepts interface{} object and returns result interface{}
  42. func (_self *NoSQL) Call(function string, data interface{}) (res interface{}, err error) {
  43. var resRawJSON []byte
  44. if resRawJSON, err = _self.CallObjParam(function, data); err == nil {
  45. // convert raw result data to obj
  46. if len(resRawJSON) > 0 {
  47. err = json.Unmarshal(resRawJSON, &res)
  48. }
  49. }
  50. return
  51. }
  52. func (_self *NoSQL) CallObject(function string, data interface{}, resultObject interface{}) (err error) {
  53. var resRawJSON []byte
  54. if resRawJSON, err = _self.CallObjParam(function, data); err == nil {
  55. // convert raw result data to result object
  56. err = json.Unmarshal(resRawJSON, resultObject)
  57. }
  58. return
  59. }