gitee.com/curryzheng/dm@v0.0.1/ze.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  
     6  package dm
     7  
     8  import (
     9  	"context"
    10  	"database/sql/driver"
    11  	"reflect"
    12  )
    13  
    14  type filterChain struct {
    15  	filters []filter
    16  	fpos    int
    17  }
    18  
    19  func newFilterChain(filters []filter) *filterChain {
    20  	fc := new(filterChain)
    21  	fc.filters = filters
    22  	fc.fpos = 0
    23  	return fc
    24  }
    25  
    26  func (filterChain *filterChain) reset() *filterChain {
    27  	filterChain.fpos = 0
    28  	return filterChain
    29  }
    30  
    31  func (filterChain *filterChain) DmDriverOpen(d *DmDriver, dsn string) (*DmConnection, error) {
    32  	if filterChain.fpos < len(filterChain.filters) {
    33  		f := filterChain.filters[filterChain.fpos]
    34  		filterChain.fpos++
    35  		return f.DmDriverOpen(filterChain, d, dsn)
    36  	}
    37  
    38  	return d.open(dsn)
    39  }
    40  
    41  func (filterChain *filterChain) DmDriverOpenConnector(d *DmDriver, dsn string) (*DmConnector, error) {
    42  	if filterChain.fpos < len(filterChain.filters) {
    43  		f := filterChain.filters[filterChain.fpos]
    44  		filterChain.fpos++
    45  		return f.DmDriverOpenConnector(filterChain, d, dsn)
    46  	}
    47  
    48  	return d.openConnector(dsn)
    49  }
    50  
    51  //DmConnector
    52  func (filterChain *filterChain) DmConnectorConnect(c *DmConnector, ctx context.Context) (*DmConnection, error) {
    53  	if filterChain.fpos < len(filterChain.filters) {
    54  		f := filterChain.filters[filterChain.fpos]
    55  		filterChain.fpos++
    56  		return f.DmConnectorConnect(filterChain, c, ctx)
    57  	}
    58  
    59  	return c.connect(ctx)
    60  }
    61  
    62  func (filterChain *filterChain) DmConnectorDriver(c *DmConnector) *DmDriver {
    63  	if filterChain.fpos < len(filterChain.filters) {
    64  		f := filterChain.filters[filterChain.fpos]
    65  		filterChain.fpos++
    66  		return f.DmConnectorDriver(filterChain, c)
    67  	}
    68  
    69  	return c.driver()
    70  }
    71  
    72  //DmConnection
    73  func (filterChain *filterChain) DmConnectionBegin(c *DmConnection) (*DmConnection, error) {
    74  	if filterChain.fpos < len(filterChain.filters) {
    75  		f := filterChain.filters[filterChain.fpos]
    76  		filterChain.fpos++
    77  		return f.DmConnectionBegin(filterChain, c)
    78  	}
    79  
    80  	return c.begin()
    81  }
    82  func (filterChain *filterChain) DmConnectionBeginTx(c *DmConnection, ctx context.Context, opts driver.TxOptions) (*DmConnection, error) {
    83  	if filterChain.fpos < len(filterChain.filters) {
    84  		f := filterChain.filters[filterChain.fpos]
    85  		filterChain.fpos++
    86  		return f.DmConnectionBeginTx(filterChain, c, ctx, opts)
    87  	}
    88  
    89  	return c.beginTx(ctx, opts)
    90  }
    91  
    92  func (filterChain *filterChain) DmConnectionCommit(c *DmConnection) error {
    93  	if filterChain.fpos < len(filterChain.filters) {
    94  		f := filterChain.filters[filterChain.fpos]
    95  		filterChain.fpos++
    96  		return f.DmConnectionCommit(filterChain, c)
    97  	}
    98  
    99  	return c.commit()
   100  }
   101  
   102  func (filterChain *filterChain) DmConnectionRollback(c *DmConnection) error {
   103  	if filterChain.fpos < len(filterChain.filters) {
   104  		f := filterChain.filters[filterChain.fpos]
   105  		filterChain.fpos++
   106  		return f.DmConnectionRollback(filterChain, c)
   107  	}
   108  
   109  	return c.rollback()
   110  }
   111  
   112  func (filterChain *filterChain) DmConnectionClose(c *DmConnection) error {
   113  	if filterChain.fpos < len(filterChain.filters) {
   114  		f := filterChain.filters[filterChain.fpos]
   115  		filterChain.fpos++
   116  		return f.DmConnectionClose(filterChain, c)
   117  	}
   118  
   119  	return c.close()
   120  }
   121  
   122  func (filterChain *filterChain) DmConnectionPing(c *DmConnection, ctx context.Context) error {
   123  	if filterChain.fpos < len(filterChain.filters) {
   124  		f := filterChain.filters[filterChain.fpos]
   125  		filterChain.fpos++
   126  		return f.DmConnectionPing(filterChain, c, ctx)
   127  	}
   128  
   129  	return c.ping(ctx)
   130  }
   131  
   132  func (filterChain *filterChain) DmConnectionExec(c *DmConnection, query string, args []driver.Value) (*DmResult, error) {
   133  	if filterChain.fpos < len(filterChain.filters) {
   134  		f := filterChain.filters[filterChain.fpos]
   135  		filterChain.fpos++
   136  		return f.DmConnectionExec(filterChain, c, query, args)
   137  	}
   138  
   139  	return c.exec(query, args)
   140  }
   141  
   142  func (filterChain *filterChain) DmConnectionExecContext(c *DmConnection, ctx context.Context, query string, args []driver.NamedValue) (*DmResult, error) {
   143  	if filterChain.fpos < len(filterChain.filters) {
   144  		f := filterChain.filters[filterChain.fpos]
   145  		filterChain.fpos++
   146  		return f.DmConnectionExecContext(filterChain, c, ctx, query, args)
   147  	}
   148  
   149  	return c.execContext(ctx, query, args)
   150  }
   151  
   152  func (filterChain *filterChain) DmConnectionQuery(c *DmConnection, query string, args []driver.Value) (*DmRows, error) {
   153  	if filterChain.fpos < len(filterChain.filters) {
   154  		f := filterChain.filters[filterChain.fpos]
   155  		filterChain.fpos++
   156  		return f.DmConnectionQuery(filterChain, c, query, args)
   157  	}
   158  
   159  	return c.query(query, args)
   160  }
   161  
   162  func (filterChain *filterChain) DmConnectionQueryContext(c *DmConnection, ctx context.Context, query string, args []driver.NamedValue) (*DmRows, error) {
   163  	if filterChain.fpos < len(filterChain.filters) {
   164  		f := filterChain.filters[filterChain.fpos]
   165  		filterChain.fpos++
   166  		return f.DmConnectionQueryContext(filterChain, c, ctx, query, args)
   167  	}
   168  
   169  	return c.queryContext(ctx, query, args)
   170  }
   171  
   172  func (filterChain *filterChain) DmConnectionPrepare(c *DmConnection, query string) (*DmStatement, error) {
   173  	if filterChain.fpos < len(filterChain.filters) {
   174  		f := filterChain.filters[filterChain.fpos]
   175  		filterChain.fpos++
   176  		return f.DmConnectionPrepare(filterChain, c, query)
   177  	}
   178  
   179  	return c.prepare(query)
   180  }
   181  
   182  func (filterChain *filterChain) DmConnectionPrepareContext(c *DmConnection, ctx context.Context, query string) (*DmStatement, error) {
   183  	if filterChain.fpos < len(filterChain.filters) {
   184  		f := filterChain.filters[filterChain.fpos]
   185  		filterChain.fpos++
   186  		return f.DmConnectionPrepareContext(filterChain, c, ctx, query)
   187  	}
   188  
   189  	return c.prepareContext(ctx, query)
   190  }
   191  
   192  func (filterChain *filterChain) DmConnectionResetSession(c *DmConnection, ctx context.Context) error {
   193  	if filterChain.fpos < len(filterChain.filters) {
   194  		f := filterChain.filters[filterChain.fpos]
   195  		filterChain.fpos++
   196  		return f.DmConnectionResetSession(filterChain, c, ctx)
   197  	}
   198  
   199  	return c.resetSession(ctx)
   200  }
   201  
   202  func (filterChain *filterChain) DmConnectionCheckNamedValue(c *DmConnection, nv *driver.NamedValue) error {
   203  	if filterChain.fpos < len(filterChain.filters) {
   204  		f := filterChain.filters[filterChain.fpos]
   205  		filterChain.fpos++
   206  		return f.DmConnectionCheckNamedValue(filterChain, c, nv)
   207  	}
   208  
   209  	return c.checkNamedValue(nv)
   210  }
   211  
   212  //DmStatement
   213  func (filterChain *filterChain) DmStatementClose(s *DmStatement) error {
   214  	if filterChain.fpos < len(filterChain.filters) {
   215  		f := filterChain.filters[filterChain.fpos]
   216  		filterChain.fpos++
   217  		return f.DmStatementClose(filterChain, s)
   218  	}
   219  
   220  	return s.close()
   221  }
   222  
   223  func (filterChain *filterChain) DmStatementNumInput(s *DmStatement) int {
   224  	if filterChain.fpos < len(filterChain.filters) {
   225  		f := filterChain.filters[filterChain.fpos]
   226  		filterChain.fpos++
   227  		return f.DmStatementNumInput(filterChain, s)
   228  	}
   229  
   230  	return s.numInput()
   231  }
   232  
   233  func (filterChain *filterChain) DmStatementExec(s *DmStatement, args []driver.Value) (*DmResult, error) {
   234  	if filterChain.fpos < len(filterChain.filters) {
   235  		f := filterChain.filters[filterChain.fpos]
   236  		filterChain.fpos++
   237  		return f.DmStatementExec(filterChain, s, args)
   238  	}
   239  
   240  	return s.exec(args)
   241  }
   242  
   243  func (filterChain *filterChain) DmStatementExecContext(s *DmStatement, ctx context.Context, args []driver.NamedValue) (*DmResult, error) {
   244  	if filterChain.fpos < len(filterChain.filters) {
   245  		f := filterChain.filters[filterChain.fpos]
   246  		filterChain.fpos++
   247  		return f.DmStatementExecContext(filterChain, s, ctx, args)
   248  	}
   249  
   250  	return s.execContext(ctx, args)
   251  }
   252  
   253  func (filterChain *filterChain) DmStatementQuery(s *DmStatement, args []driver.Value) (*DmRows, error) {
   254  	if filterChain.fpos < len(filterChain.filters) {
   255  		f := filterChain.filters[filterChain.fpos]
   256  		filterChain.fpos++
   257  		return f.DmStatementQuery(filterChain, s, args)
   258  	}
   259  
   260  	return s.query(args)
   261  }
   262  
   263  func (filterChain *filterChain) DmStatementQueryContext(s *DmStatement, ctx context.Context, args []driver.NamedValue) (*DmRows, error) {
   264  	if filterChain.fpos < len(filterChain.filters) {
   265  		f := filterChain.filters[filterChain.fpos]
   266  		filterChain.fpos++
   267  		return f.DmStatementQueryContext(filterChain, s, ctx, args)
   268  	}
   269  
   270  	return s.queryContext(ctx, args)
   271  }
   272  
   273  func (filterChain *filterChain) DmStatementCheckNamedValue(s *DmStatement, nv *driver.NamedValue) error {
   274  	if filterChain.fpos < len(filterChain.filters) {
   275  		f := filterChain.filters[filterChain.fpos]
   276  		filterChain.fpos++
   277  		return f.DmStatementCheckNamedValue(filterChain, s, nv)
   278  	}
   279  
   280  	return s.checkNamedValue(nv)
   281  }
   282  
   283  //DmResult
   284  func (filterChain *filterChain) DmResultLastInsertId(r *DmResult) (int64, error) {
   285  	if filterChain.fpos < len(filterChain.filters) {
   286  		f := filterChain.filters[filterChain.fpos]
   287  		filterChain.fpos++
   288  		return f.DmResultLastInsertId(filterChain, r)
   289  	}
   290  
   291  	return r.lastInsertId()
   292  }
   293  
   294  func (filterChain *filterChain) DmResultRowsAffected(r *DmResult) (int64, error) {
   295  	if filterChain.fpos < len(filterChain.filters) {
   296  		f := filterChain.filters[filterChain.fpos]
   297  		filterChain.fpos++
   298  		return f.DmResultRowsAffected(filterChain, r)
   299  	}
   300  
   301  	return r.rowsAffected()
   302  }
   303  
   304  //DmRows
   305  func (filterChain *filterChain) DmRowsColumns(r *DmRows) []string {
   306  	if filterChain.fpos < len(filterChain.filters) {
   307  		f := filterChain.filters[filterChain.fpos]
   308  		filterChain.fpos++
   309  		return f.DmRowsColumns(filterChain, r)
   310  	}
   311  
   312  	return r.columns()
   313  }
   314  
   315  func (filterChain *filterChain) DmRowsClose(r *DmRows) error {
   316  	if filterChain.fpos < len(filterChain.filters) {
   317  		f := filterChain.filters[filterChain.fpos]
   318  		filterChain.fpos++
   319  		return f.DmRowsClose(filterChain, r)
   320  	}
   321  
   322  	return r.close()
   323  }
   324  
   325  func (filterChain *filterChain) DmRowsNext(r *DmRows, dest []driver.Value) error {
   326  	if filterChain.fpos < len(filterChain.filters) {
   327  		f := filterChain.filters[filterChain.fpos]
   328  		filterChain.fpos++
   329  		return f.DmRowsNext(filterChain, r, dest)
   330  	}
   331  
   332  	return r.next(dest)
   333  }
   334  
   335  func (filterChain *filterChain) DmRowsHasNextResultSet(r *DmRows) bool {
   336  	if filterChain.fpos < len(filterChain.filters) {
   337  		f := filterChain.filters[filterChain.fpos]
   338  		filterChain.fpos++
   339  		return f.DmRowsHasNextResultSet(filterChain, r)
   340  	}
   341  
   342  	return r.hasNextResultSet()
   343  }
   344  
   345  func (filterChain *filterChain) DmRowsNextResultSet(r *DmRows) error {
   346  	if filterChain.fpos < len(filterChain.filters) {
   347  		f := filterChain.filters[filterChain.fpos]
   348  		filterChain.fpos++
   349  		return f.DmRowsNextResultSet(filterChain, r)
   350  	}
   351  
   352  	return r.nextResultSet()
   353  }
   354  
   355  func (filterChain *filterChain) DmRowsColumnTypeScanType(r *DmRows, index int) reflect.Type {
   356  	if filterChain.fpos < len(filterChain.filters) {
   357  		f := filterChain.filters[filterChain.fpos]
   358  		filterChain.fpos++
   359  		return f.DmRowsColumnTypeScanType(filterChain, r, index)
   360  	}
   361  
   362  	return r.columnTypeScanType(index)
   363  }
   364  
   365  func (filterChain *filterChain) DmRowsColumnTypeDatabaseTypeName(r *DmRows, index int) string {
   366  	if filterChain.fpos < len(filterChain.filters) {
   367  		f := filterChain.filters[filterChain.fpos]
   368  		filterChain.fpos++
   369  		return f.DmRowsColumnTypeDatabaseTypeName(filterChain, r, index)
   370  	}
   371  
   372  	return r.columnTypeDatabaseTypeName(index)
   373  }
   374  
   375  func (filterChain *filterChain) DmRowsColumnTypeLength(r *DmRows, index int) (length int64, ok bool) {
   376  	if filterChain.fpos < len(filterChain.filters) {
   377  		f := filterChain.filters[filterChain.fpos]
   378  		filterChain.fpos++
   379  		return f.DmRowsColumnTypeLength(filterChain, r, index)
   380  	}
   381  
   382  	return r.columnTypeLength(index)
   383  }
   384  
   385  func (filterChain *filterChain) DmRowsColumnTypeNullable(r *DmRows, index int) (nullable, ok bool) {
   386  	if filterChain.fpos < len(filterChain.filters) {
   387  		f := filterChain.filters[filterChain.fpos]
   388  		filterChain.fpos++
   389  		return f.DmRowsColumnTypeNullable(filterChain, r, index)
   390  	}
   391  
   392  	return r.columnTypeNullable(index)
   393  }
   394  
   395  func (filterChain *filterChain) DmRowsColumnTypePrecisionScale(r *DmRows, index int) (precision, scale int64, ok bool) {
   396  	if filterChain.fpos < len(filterChain.filters) {
   397  		f := filterChain.filters[filterChain.fpos]
   398  		filterChain.fpos++
   399  		return f.DmRowsColumnTypePrecisionScale(filterChain, r, index)
   400  	}
   401  
   402  	return r.columnTypePrecisionScale(index)
   403  }