zd.go 11 KB

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