1
0
Fork 0

DB Request code-complete except for transactions

master
Philip O'Toole 1 year ago
parent fe176a9752
commit 4cbb541e9b

@ -424,13 +424,14 @@ func (db *DB) Execute(req *command.Request, xTime bool) ([]*command.ExecuteResul
return db.executeWithConn(req, xTime, conn)
}
type execer interface {
ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
}
func (db *DB) executeWithConn(req *command.Request, xTime bool, conn *sql.Conn) ([]*command.ExecuteResult, error) {
var err error
type Execer interface {
ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
}
var execer Execer
var execer execer
var tx *sql.Tx
if req.Transaction {
stats.Add(numETx, 1)
@ -471,49 +472,13 @@ func (db *DB) executeWithConn(req *command.Request, xTime bool, conn *sql.Conn)
continue
}
result := &command.ExecuteResult{}
start := time.Now()
parameters, err := parametersToValues(stmt.Parameters)
result, err := db.executeStmtWithConn(stmt, xTime, execer)
if err != nil {
if handleError(result, err) {
continue
}
break
}
r, err := execer.ExecContext(context.Background(), ss, parameters...)
if err != nil {
if handleError(result, err) {
continue
}
break
}
if r == nil {
continue
}
lid, err := r.LastInsertId()
if err != nil {
if handleError(result, err) {
continue
}
break
}
result.LastInsertId = lid
ra, err := r.RowsAffected()
if err != nil {
if handleError(result, err) {
continue
}
break
}
result.RowsAffected = ra
if xTime {
result.Time = time.Since(start).Seconds()
}
allResults = append(allResults, result)
}
@ -523,6 +488,45 @@ func (db *DB) executeWithConn(req *command.Request, xTime bool, conn *sql.Conn)
return allResults, err
}
func (db *DB) executeStmtWithConn(stmt *command.Statement, xTime bool, e execer) (*command.ExecuteResult, error) {
result := &command.ExecuteResult{}
start := time.Now()
parameters, err := parametersToValues(stmt.Parameters)
if err != nil {
result.Error = err.Error()
return result, nil
}
r, err := e.ExecContext(context.Background(), stmt.Sql, parameters...)
if err != nil {
result.Error = err.Error()
return result, err
}
if r == nil {
return result, nil
}
lid, err := r.LastInsertId()
if err != nil {
result.Error = err.Error()
return result, err
}
result.LastInsertId = lid
ra, err := r.RowsAffected()
if err != nil {
result.Error = err.Error()
return result, err
}
result.RowsAffected = ra
if xTime {
result.Time = time.Since(start).Seconds()
}
return result, nil
}
// QueryStringStmt executes a single query that return rows, but don't modify database.
func (db *DB) QueryStringStmt(query string) ([]*command.QueryRows, error) {
r := &command.Request{
@ -679,15 +683,29 @@ func (db *DB) queryStmtWithConn(stmt *command.Statement, xTime bool, q queryer)
}
func (db *DB) Request(req *command.Request, xTime bool) ([]*command.ExecuteQueryResponse, error) {
// Handle Txs. XXX
// Get the connection
conn, err := db.rwDB.Conn(context.Background())
if err != nil {
return nil, err
}
defer conn.Close()
var queryer queryer
var execer execer
if req.Transaction { //// XXX MORE transaction work needed here
stats.Add(numETx, 1)
tx, err := conn.BeginTx(context.Background(), nil)
if err != nil {
return nil, err
}
defer tx.Rollback() // Will be ignored if tx is committed
queryer = tx
execer = tx
} else {
queryer = conn
execer = conn
}
eqResponse := make([]*command.ExecuteQueryResponse, len(req.Statements))
for i, stmt := range req.Statements {
ss := stmt.Sql
@ -708,33 +726,27 @@ func (db *DB) Request(req *command.Request, xTime bool) ([]*command.ExecuteQuery
}
if ro {
rows, err := db.QueryStringStmt(ss) /// HANG ON!!! THIS WON"T WORK -- named parameters etc!!!
rows, err = db.queryWithConn(nil, false, conn)
rows, err := db.queryStmtWithConn(stmt, xTime, queryer)
if err != nil {
rows = []*command.QueryRows{
{
Error: err.Error(),
},
rows = &command.QueryRows{
Error: err.Error(),
}
}
eqResponse[i] = &command.ExecuteQueryResponse{
Result: &command.ExecuteQueryResponse_Q{
Q: rows[0],
Q: rows,
},
}
} else {
result, err := db.ExecuteStringStmt(ss) // WON'T WORK EITHER!
result, err := db.executeStmtWithConn(stmt, xTime, execer)
if err != nil {
result = []*command.ExecuteResult{
{
Error: err.Error(),
},
result = &command.ExecuteResult{
Error: err.Error(),
}
}
eqResponse[i] = &command.ExecuteQueryResponse{
Result: &command.ExecuteQueryResponse_E{
E: result[0],
E: result,
},
}
}

Loading…
Cancel
Save