Guest User

Untitled

a guest
Feb 24th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. type Query struct {
  2. Raw string
  3. Named *sqlx.NamedStmt
  4. }
  5.  
  6. func (q *Query) Build(db *sqlx.DB) error {
  7. var err error
  8. q.Named, err = db.PrepareNamed(q.Raw)
  9. return nil
  10. }
  11.  
  12. func initQF(db *sqlx.DB, qf func() *Query) error {
  13. q := qf()
  14. return q.Build(db)
  15. }
  16.  
  17. func defineQ(q *Query, raw string) *Query {
  18. if q != nil {
  19. return q
  20. }
  21. q = &Query{
  22. Raw: raw,
  23. }
  24. return q
  25. }
  26.  
  27. type AddUser struct {
  28. checkUserExists *Query
  29. insertUser *Query
  30. }
  31.  
  32. func NewAddUser(db *sqlx.DB) (*AppQueries, error) {
  33. var au AddUser
  34.  
  35. if err := initQF(db, au.checkUserExists); err != nil {
  36. return nil, err
  37. }
  38.  
  39. if err := initQF(db, au.insertUser); err != nil {
  40. return nil, err
  41. }
  42.  
  43. return &au, nil
  44. }
  45.  
  46. type UserQuery interface {
  47. CheckUserExists() Query
  48. InsertUser() Query
  49. }
  50.  
  51. func SignupUser(uq UserQuery) {
  52. uq.CheckUserExists()
  53. uq.InsertUser()
  54. }
  55.  
  56. // Here is the nice part: You can define you queries in their methods, which seems clean and
  57. // easily inspectable
  58. func (au *AddUser) CheckUserExists() *Query {
  59. return defineQ(au.checkUserExists,
  60. `SELECT COUNT(*) FROM users ...`)
  61. }
  62.  
  63. func (au *AddUser) InsertUser() *Query {
  64. return defineQ(au.insertUser,
  65. `INSERT INTO users ...`)
  66. }
  67.  
  68. // =============================================================================
  69.  
  70. type AddUser struct {
  71. db *sqlx.DB
  72. checkUserExists *sqlx.NamedStmt
  73. insertUser *sqlx.NamedStmt
  74. }
  75.  
  76. func NewAddUser(db *sqlx.DB) (*AddUser, error) {
  77. var err error
  78.  
  79. queryCUE := "SELECT COUNT(*) FROM users ..."
  80. namedCUE, err := db.PrepareNamed(queryCUE)
  81. if err != nil {
  82. return nil, err
  83. }
  84.  
  85. queryIU := "INSERT INTO users ..."
  86. namedIU, err := db.PrepareNamed(queryIU)
  87. if err != nil {
  88. return nil, err
  89. }
  90.  
  91. au := AddUser{
  92. db: db,
  93. checkUserExists: namedCUE,
  94. insertUser: namedIU,
  95. }
  96.  
  97. return &au, nil
  98. }
  99.  
  100. func (au *AddUser) Execute() error {
  101. // DO STUFF HERE
  102. }
Add Comment
Please, Sign In to add comment