From c02c0ac5e06ee1a556107baa071ef0c80a387a13 Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期六, 28 九月 2019 10:34:43 +0800
Subject: [PATCH] rm ltime save and get from sqlite
---
dbself.go | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 155 insertions(+), 14 deletions(-)
diff --git a/dbself.go b/dbself.go
index 62f2293..49c4d34 100644
--- a/dbself.go
+++ b/dbself.go
@@ -6,34 +6,38 @@
"os"
"os/exec"
"path/filepath"
+ "strconv"
"strings"
"sync"
+ "github.com/jinzhu/gorm"
+ "basic.com/valib/logger.git"
)
-
const (
PersonSqliteDBPath = "~/workspace/gitblit/dbserver/config/testdb.db"
+ DbT_TableName = "dbtables"
+ DBP_TableName = "dbtablepersons"
)
-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
}
- fmt.Println("self: ========>", dbPath)
+ logger.Info("self: ========>", dbPath)
db, err := New(dbPath, "", false)
if err != nil {
- fmt.Println("new db database: ", err)
+ logger.Error("new db database: ", err)
return err
}
dbConn, err := db.Connect()
if err != nil {
- fmt.Println("new db conn error; ", err)
+ logger.Error("new db conn error; ", err)
return err
}
@@ -46,21 +50,21 @@
path, err := getCurrentPath()
if err != nil {
- fmt.Println("getCurrentPath error; ", err)
+ logger.Error("getCurrentPath error; ", err)
return "", err
}
filepath := path + "tmp.db"
- fmt.Println("filepath:", filepath)
+ logger.Info("filepath:", filepath)
db, err := New(filepath, "", false)
if err != nil {
- fmt.Println("new db database: ", err)
+ logger.Error("new db database: ", err)
return "", err
}
tmpconn, err := db.Connect()
if err != nil {
- fmt.Println("new db conn error; ", err)
+ logger.Error("new db conn error; ", err)
return "", err
}
defer tmpconn.Close()
@@ -78,10 +82,15 @@
defer syncMut.Unlock()
allResults, err := SerfDbConn.Execute(sqlString, false, false)
if err != nil {
- fmt.Println("execute error!", err)
+ logger.Error("execute error!", err)
return nil, err
}
return allResults, nil
+}
+
+var localDb *gorm.DB
+func InitLocalDb(db *gorm.DB) {
+ localDb = db
}
// do exet when get querystring.
@@ -90,19 +99,151 @@
defer syncMut.Unlock()
rows, err := SerfDbConn.Query(sqlString, false, false)
if err != nil {
- fmt.Println("execute error!", err)
+ logger.Error("execute error!", err)
return nil, err
}
return rows, nil
+}
+
+func ExecuteSqlByGorm(sqls []string) (bool,error) {
+ if localDb != nil {
+ localDb.LogMode(false)
+ defer localDb.LogMode(true)
+ var err error
+ tx := localDb.Begin()
+ defer func() {
+ if err !=nil && tx !=nil {
+ tx.Rollback()
+ }
+ }()
+ for _,sql :=range sqls {
+ result := tx.Exec(sql)
+ err = result.Error
+ if err !=nil {
+ return false,result.Error
+ }
+ if result.RowsAffected == 0{
+ logger.Error("ExecuteSqlByGorm fail")
+ return false,errors.New("ExecuteSqlByGorm fail")
+ }
+ }
+ tx.Commit()
+ return true,nil
+ }
+ return false,errors.New("localDb is nil")
+}
+
+type SyncSerf struct {
+ LamportTime string `json:"lamport_time"`
+}
+
+func QueryLTimeFromDbByGorm() uint64 {
+ if localDb != nil {
+ var syncSerf []SyncSerf
+ err := localDb.Raw("select * from sync_serf").Scan(&syncSerf).Error
+ if err == nil {
+ if len(syncSerf) > 0{
+ ltStr := syncSerf[0].LamportTime
+ logger.Info("db.LamportTime str:", ltStr)
+ t, e := strconv.ParseUint(ltStr, 10, 64)
+ if e != nil {
+ logger.Error("db.LamportTime parseUint err:", e)
+ } else {
+ curLTime = t
+ }
+ logger.Info("db.LamportTime:", ltStr)
+ }else {
+ err = localDb.Exec("insert into sync_serf values('0')").Error
+ if err !=nil {
+ logger.Error("sync_serf lamport_time init err:",err)
+ }
+ }
+
+ } else {
+ logger.Error("get db.LamportTime err:", err)
+ }
+ }
+ return 0
+}
+
+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"`
+}
+
+type DumpSql struct {
+ Sql string `json:"sql"`
+}
+
+func ExecuteQueryByGorm(tableNames []string) ([]string, error) {
+ localDb.LogMode(false)
+ defer localDb.LogMode(true)
+ if tableNames !=nil {
+ var arr []string
+ var dumpSql []DumpSql
+ for _,table :=range tableNames {
+ dumpSql = make([]DumpSql, 0)
+ 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")
+ }
+ logger.Info(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))
+ }
+ if table == DbT_TableName {
+ tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" VALUES(%s)' as sql FROM "%s" where (analyServerId='' or analyServerId is NULL);`,
+ table,
+ strings.Join(columnNames, ","),
+ table)
+ } else if table == DBP_TableName {
+ tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" VALUES(%s)' as sql FROM "%s" where tableId in (select id from dbTables where (analyServerId='' or analyServerId is NULL));`,
+ table,
+ strings.Join(columnNames, ","),
+ table)
+ } else {
+ tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" VALUES(%s)' as sql FROM "%s";`,
+ table,
+ strings.Join(columnNames, ","),
+ table)
+ }
+
+ logger.Info("tSql:",tSql)
+
+ err = localDb.Raw(tSql).Scan(&dumpSql).Error
+ if err !=nil {
+ return nil,errors.New("dump err")
+ continue
+ }
+ if len(dumpSql)>0 {
+ for _,d :=range dumpSql {
+ arr = append(arr, d.Sql)
+ }
+ }
+
+ }
+ return arr,nil
+ }
+ return nil,errors.New("tableNames is nil")
}
func Dumpdb() {
var b strings.Builder
if err := SerfDbConn.Dump(&b); err != nil {
- fmt.Println("dump file ", err.Error())
+ logger.Error("dump file ", err.Error())
}
- fmt.Printf("%T\n", b)
+ logger.Info("%T\n", b)
}
// get current path
--
Gitblit v1.8.0