From 883cdff6638c325f17db200a9c8f4984537f80b8 Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期五, 11 十月 2019 20:04:10 +0800
Subject: [PATCH] serf MaxUserEventSize is 9*1024,cannot more

---
 dbself.go |  132 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 121 insertions(+), 11 deletions(-)

diff --git a/dbself.go b/dbself.go
index 70b7024..e40ea65 100644
--- a/dbself.go
+++ b/dbself.go
@@ -8,10 +8,14 @@
 	"path/filepath"
 	"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
@@ -24,15 +28,15 @@
 		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
 	}
 
@@ -45,21 +49,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()
@@ -77,10 +81,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.
@@ -89,19 +98,120 @@
 	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 {
+				logger.Error("ExecuteSqlByGorm err:",err,",sql:",sql)
+				return false,err
+			}
+			if result.RowsAffected == 0 {
+				logger.Debug("ExecuteSqlByGorm RowsAffected == 0",",sql:",sql)
+				err = errors.New("ExecuteSqlByGorm RowsAffected == 0")
+				return false,err
+			}
+		}
+		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"`
+}
+
+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