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  }