基于serf的数据库同步模块库
liuxiaolong
2019-08-09 3bea45bd2467b5d45fb1507e09c8493bc4ad73c9
dbself.go
@@ -8,20 +8,20 @@
   "path/filepath"
   "strings"
   "sync"
   "github.com/jinzhu/gorm"
)
const (
   PersonSqliteDBPath = "~/workspace/gitblit/dbserver/config/testdb.db"
)
var syncMut    sync.Mutex
var syncMut sync.Mutex
var SerfDbConn *Conn
// get Conn of db for do execute.
func InitDbConn(dbPath string) error {
   if dbPath == ""   {
   if dbPath == "" {
      dbPath = PersonSqliteDBPath
   }
@@ -84,6 +84,11 @@
   return allResults, nil
}
var localDb *gorm.DB
func InitLocalDb(db *gorm.DB) {
   localDb = db
}
// do exet when get querystring.
func ExecuteQuerySql(sqlString []string) ([]*Rows, error) {
   syncMut.Lock()
@@ -96,6 +101,74 @@
   return rows, nil
}
func ExecuteSqlByGorm(sqls []string) (bool,error) {
   if localDb != nil {
      var err error
      tx := localDb.Begin()
      defer func() {
         if err !=nil && tx !=nil {
            tx.Rollback()
         }
      }()
      for _,sql :=range sqls {
         result := tx.Exec(sql)
         if result.Error !=nil {
            return false,result.Error
         }
         if result.RowsAffected == 0{
            fmt.Println("ExecuteSqlByGorm fail")
            return false,errors.New("ExecuteSqlByGorm fail")
         }
      }
      tx.Commit()
      return true,nil
   }
   return false,errors.New("localDb is nil")
}
type TableDesc struct {
   Cid int `json:"cid"`
   Name string `json:"name"`
   Type string `json:"type"`
   Notnull bool `json:"notnull"`
   DFltValue interface{} `json:"dflt_value"`
   Pk int `json:"pk"`
}
func ExecuteQueryByGorm(tableNames []string) ([]string, error) {
   if tableNames !=nil {
      var arr []string
      for _,table :=range tableNames {
         var tDescArr []TableDesc
         tSql := fmt.Sprintf(`PRAGMA table_info("%s")`, table)
         err := localDb.Raw(tSql).Scan(&tDescArr).Error
         if err !=nil {
            return nil,errors.New("tableDesc err")
         }
         fmt.Println(table,"'Columns is:",tDescArr)
         if tDescArr == nil || len(tDescArr) == 0 {
            return nil,errors.New(table+" has no column")
         }
         var columnNames []string
         for _,col :=range tDescArr {
            columnNames = append(columnNames, fmt.Sprintf(`'||quote("%s")||'`, col.Name))
         }
         tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" VALUES(%s)' FROM "%s";`,
            table,
            strings.Join(columnNames, ","),
            table)
         var dumpSqls []string
         err = localDb.Raw(tSql).Scan(&dumpSqls).Error
         if err !=nil {
            return nil,errors.New("dump err")
         }
         arr = append(arr, dumpSqls...)
      }
      return arr,nil
   }
   return nil,errors.New("tableNames is nil")
}
func Dumpdb() {
   var b strings.Builder