package f5 import ( "q5" "fmt" "strings" ) type DBStyle int32 const ( GO_STYLE_DB DBStyle = iota JS_STYLE_DB ) type dbPool struct { style DBStyle dataSourceHash map[string]*q5.Mysql } func (this *dbPool) init() { } func (this *dbPool) unInit() { } func (this *dbPool) Select( dataSource string, tblName string, fields []string, whereKv [][]string, cb QueryResultCb) { params := []string{} sql := fmt.Sprintf("SELECT %s FROM %s WHERE 1=1 ", this.joinSelectFields(fields), tblName) this.joinWhere(&sql, ¶ms, whereKv) this.internalQuery(dataSource, sql, params, cb) } func (this *dbPool) OrmSelect( dataSource string, tblName string, whereKv [][]string, cb QueryResultCb) { params := []string{} sql := fmt.Sprintf("SELECT * FROM %s WHERE 1=1 ", tblName) this.joinWhere(&sql, ¶ms, whereKv) this.internalQuery(dataSource, sql, params, cb) } func (this *dbPool) SelectOne( dataSource string, tblName string, fields []string, whereKv [][]string, cb QueryOneCb) { params := []string{} sql := fmt.Sprintf("SELECT %s FROM %s WHERE 1=1 ", this.joinSelectFields(fields), tblName) this.joinWhere(&sql, ¶ms, whereKv) this.internalQueryOne(dataSource, sql, params, cb) } func (this *dbPool) OrmSelectOne( dataSource string, tblName string, fields []string, whereKv [][]string, cb QueryOneCb) { params := []string{} sql := fmt.Sprintf("SELECT * FROM %s WHERE 1=1 ", tblName) this.joinWhere(&sql, ¶ms, whereKv) this.internalQueryOne(dataSource, sql, params, cb) } func (this *dbPool) Update( dataSource string, tblName string, fieldsKv [][]string, whereKv [][]string, cb ExecResultCb) { params := []string{} sql := "UPDATE `" + tblName + "` SET " + this.joinUpdateFields(fieldsKv, ¶ms) + " WHERE 1=1" this.joinWhere(&sql, ¶ms, whereKv) this.internalExec(dataSource, sql, params, cb) } func (this *dbPool) Insert( dataSource string, tblName string, fieldsKv [][]string, cb ExecResultCb) { params := []string{} sql := "INSERT INTO `" + tblName + "` " + this.joinInsertFields(fieldsKv, ¶ms) this.internalExec(dataSource, sql, params, cb) } func (this *dbPool) Upsert( dataSource string, tblName string, whereKv map[string]string, updateKv map[string]string, insertKv map[string]string, cb ExecResultCb) { } func (this *dbPool) PageQuery( dataSource string, perPage int32, page int32, sql string, params []string, filter DbQueryFilter, orderBy string, cb PageQueryCb) { var pagination Pagination pagination.PerPage = q5.Max(1, perPage) pagination.CurrentPage = q5.Max(1, page) } func (this *dbPool) borrowConn(dataSource string) *q5.Mysql { return nil } func (this *dbPool) returnConn(conn *q5.Mysql) { } func (this *dbPool) joinSelectFields(fields []string) string { return strings.Join( q5.Map(fields, func(val string) string { return "`" + val + "`" }), ", ") } func (this *dbPool) joinWhere(sql *string, params *[]string, whereKv [][]string) { for _, items := range whereKv { *sql += " AND " + items[0] + "=?" *params = append(*params, items[1]) } } func (this *dbPool) joinUpdateFields(fieldsKv [][]string, params *[]string) string { return "" } func (this *dbPool) joinInsertFields(fieldsKv [][]string, params *[]string) string { return "" } func (this *dbPool) internalExec(dataSource string, sql string, params []string, cb ExecResultCb) { conn := this.borrowConn(dataSource) defer this.returnConn(conn) result, err := conn.Exec(sql, q5.ToInterfaces(params)...) var lastInsertId int64 var rowsAffected int64 if err == nil { if id, err := result.LastInsertId(); err == nil { lastInsertId = id } if id, err := result.RowsAffected(); err == nil { rowsAffected = id } } if this.style == GO_STYLE_DB { cb(err, lastInsertId, rowsAffected) } else { _app.RegisterMainThreadCb( func () { cb(err, lastInsertId, rowsAffected) }) } } func (this *dbPool) internalQuery(dataSource string, sql string, params []string, cb QueryResultCb) { conn := this.borrowConn(dataSource) defer this.returnConn(conn) rows, err := conn.Query(sql, q5.ToInterfaces(params)...) if this.style == GO_STYLE_DB { cb(err, NewDataSet(rows)) } else { _app.RegisterMainThreadCb( func () { cb(err, NewDataSet(rows)) }) } } func (this *dbPool) internalQueryOne(dataSource string, sql string, params []string, cb QueryOneCb) { conn := this.borrowConn(dataSource) defer this.returnConn(conn) rows, err := conn.Query(sql, q5.ToInterfaces(params)...) values := &[]*string{} if err == nil { dataSet := NewDataSet(rows) if dataSet.Next() { values = dataSet.GetValues() } } if this.style == GO_STYLE_DB { cb(err, values) } else { _app.RegisterMainThreadCb( func () { cb(err, values) }) } }