github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/shared/driver/objects.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package driver 5 6 import ( 7 "context" 8 "database/sql/driver" 9 10 "github.com/masterhung0112/hk_server/v5/plugin" 11 ) 12 13 type wrapperTx struct { 14 driver.Tx 15 id string 16 api plugin.Driver 17 } 18 19 func (t *wrapperTx) Commit() error { 20 return t.api.TxCommit(t.id) 21 } 22 23 func (t *wrapperTx) Rollback() error { 24 return t.api.TxRollback(t.id) 25 } 26 27 type wrapperStmt struct { 28 driver.Stmt 29 id string 30 api plugin.Driver 31 } 32 33 func (s *wrapperStmt) Close() error { 34 return s.api.StmtClose(s.id) 35 } 36 37 func (s *wrapperStmt) NumInput() int { 38 return s.api.StmtNumInput(s.id) 39 } 40 41 func (s *wrapperStmt) ExecContext(_ context.Context, args []driver.NamedValue) (driver.Result, error) { 42 resultContainer, err := s.api.StmtExec(s.id, args) 43 if err != nil { 44 return nil, err 45 } 46 res := &wrapperResult{ 47 res: resultContainer, 48 } 49 return res, nil 50 } 51 52 func (s *wrapperStmt) QueryContext(_ context.Context, args []driver.NamedValue) (driver.Rows, error) { 53 rowsID, err := s.api.StmtQuery(s.id, args) 54 if err != nil { 55 return nil, err 56 } 57 rows := &wrapperRows{ 58 id: rowsID, 59 api: s.api, 60 } 61 return rows, nil 62 } 63 64 // wrapperResult implements the driver.Result interface. 65 // This differs from other objects because it already contains the 66 // information for its methods. This does two things: 67 // 68 // 1. Simplifies server-side code by avoiding to track result ids 69 // in a map. 70 // 2. Avoids round-trip to compute result methods. 71 type wrapperResult struct { 72 res plugin.ResultContainer 73 } 74 75 func (r *wrapperResult) LastInsertId() (int64, error) { 76 return r.res.LastID, r.res.LastIDError 77 } 78 79 func (r *wrapperResult) RowsAffected() (int64, error) { 80 return r.res.RowsAffected, r.res.RowsAffectedError 81 } 82 83 type wrapperRows struct { 84 id string 85 api plugin.Driver 86 } 87 88 func (r *wrapperRows) Columns() []string { 89 return r.api.RowsColumns(r.id) 90 } 91 92 func (r *wrapperRows) Close() error { 93 return r.api.RowsClose(r.id) 94 } 95 96 func (r *wrapperRows) Next(dest []driver.Value) error { 97 return r.api.RowsNext(r.id, dest) 98 } 99 100 func (r *wrapperRows) HasNextResultSet() bool { 101 return r.api.RowsHasNextResultSet(r.id) 102 } 103 104 func (r *wrapperRows) NextResultSet() error { 105 return r.api.RowsNextResultSet(r.id) 106 } 107 108 func (r *wrapperRows) ColumnTypeDatabaseTypeName(index int) string { 109 return r.api.RowsColumnTypeDatabaseTypeName(r.id, index) 110 } 111 112 func (r *wrapperRows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool) { 113 return r.api.RowsColumnTypePrecisionScale(r.id, index) 114 }