/common/pdao/pdao.go

https://github.com/eolinker/goku-api-gateway · Go · 116 lines · 87 code · 19 blank · 10 comment · 11 complexity · 4c0f60506a6104f22d20dce9ebba2a76 MD5 · raw file

  1. package pdao
  2. import (
  3. "database/sql"
  4. "sync"
  5. )
  6. var (
  7. needsManager = NewNeedsManager()
  8. factoryManage = NewFactoryManager()
  9. )
  10. //Need need
  11. func Need(is ...interface{}) {
  12. for _, i := range is {
  13. needsManager.Need(i)
  14. }
  15. }
  16. //Check check
  17. func Check() error {
  18. return needsManager.Check()
  19. }
  20. //RegisterDao 注册dao类
  21. func RegisterDao(driver string, factories ...Factory) {
  22. for _, factory := range factories {
  23. factoryManage.RegisterDao(driver, factory)
  24. }
  25. }
  26. //RegisterDBBuilder 注册dbBuilder
  27. func RegisterDBBuilder(driver string, builders ...DBBuilder) {
  28. for _, builder := range builders {
  29. factoryManage.RegisterDBBuilder(driver, builder)
  30. }
  31. }
  32. //Build build
  33. func Build(driver string, db *sql.DB) error {
  34. return factoryManage.Build(driver, db, needsManager)
  35. }
  36. //FactoryManager 工厂管理者
  37. type FactoryManager struct {
  38. factories map[string][]Factory
  39. builders map[string][]DBBuilder
  40. locker sync.Mutex
  41. }
  42. //NewFactoryManager new工厂管理者
  43. func NewFactoryManager() *FactoryManager {
  44. return &FactoryManager{
  45. factories: make(map[string][]Factory),
  46. builders: make(map[string][]DBBuilder),
  47. locker: sync.Mutex{},
  48. }
  49. }
  50. //RegisterDBBuilder dbBuilder注册器
  51. func (f *FactoryManager) RegisterDBBuilder(driver string, builder DBBuilder) {
  52. f.locker.Lock()
  53. f.builders[driver] = append(f.builders[driver], builder)
  54. f.locker.Unlock()
  55. }
  56. //RegisterDao dao类注册器
  57. func (f *FactoryManager) RegisterDao(driver string, factory Factory) {
  58. f.locker.Lock()
  59. f.factories[driver] = append(f.factories[driver], factory)
  60. f.locker.Unlock()
  61. }
  62. func (f *FactoryManager) get(driver string) []Factory {
  63. f.locker.Lock()
  64. fs := f.factories[driver]
  65. delete(f.factories, driver)
  66. f.locker.Unlock()
  67. return fs
  68. }
  69. func (f *FactoryManager) callBuild(driver string, db *sql.DB) error {
  70. f.locker.Lock()
  71. bs := f.builders[driver]
  72. for _, b := range bs {
  73. err := b.Build(db)
  74. if err != nil {
  75. f.locker.Unlock()
  76. return err
  77. }
  78. }
  79. f.locker.Unlock()
  80. return nil
  81. }
  82. //Build build
  83. func (f *FactoryManager) Build(driver string, db *sql.DB, m *NeedsManager) error {
  84. err := f.callBuild(driver, db)
  85. if err != nil {
  86. return err
  87. }
  88. fs := f.get(driver)
  89. for _, factory := range fs {
  90. i, err := factory.Create(db)
  91. if err != nil {
  92. return err
  93. }
  94. m.Set(i)
  95. }
  96. return nil
  97. }