gitee.com/chunanyong/dm@v1.8.12/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  	"fmt"
    12  	"io"
    13  	"reflect"
    14  	"strconv"
    15  	"time"
    16  
    17  	"gitee.com/chunanyong/dm/util"
    18  )
    19  
    20  type logFilter struct{}
    21  
    22  func (filter *logFilter) DmDriverOpen(filterChain *filterChain, d *DmDriver, dsn string) (ret *DmConnection, err error) {
    23  	var logRecord = d.logInfo.logRecord.Reset()
    24  	logRecord.Set(d, "open", dsn)
    25  	defer func() {
    26  		filter.doLog(logRecord)
    27  	}()
    28  	ret, err = filterChain.DmDriverOpen(d, dsn)
    29  	if err != nil {
    30  		logRecord.SetError(err)
    31  		return
    32  	}
    33  	logRecord.SetReturnValue(ret)
    34  	return
    35  }
    36  
    37  func (filter *logFilter) DmDriverOpenConnector(filterChain *filterChain, d *DmDriver, dsn string) (ret *DmConnector, err error) {
    38  	var logRecord = d.logInfo.logRecord.Reset()
    39  	logRecord.Set(d, "openConnector", dsn)
    40  	defer func() {
    41  		filter.doLog(logRecord)
    42  	}()
    43  	ret, err = filterChain.DmDriverOpenConnector(d, dsn)
    44  	if err != nil {
    45  		logRecord.SetError(err)
    46  		return
    47  	}
    48  	logRecord.SetReturnValue(ret)
    49  	return
    50  }
    51  
    52  func (filter *logFilter) DmConnectorConnect(filterChain *filterChain, c *DmConnector, ctx context.Context) (ret *DmConnection, err error) {
    53  	var logRecord = c.logInfo.logRecord.Reset()
    54  	logRecord.Set(c, "connect")
    55  	defer func() {
    56  		filter.doLog(logRecord)
    57  	}()
    58  	ret, err = filterChain.DmConnectorConnect(c, ctx)
    59  	if err != nil {
    60  		logRecord.SetError(err)
    61  		return
    62  	}
    63  	logRecord.SetReturnValue(ret)
    64  	return
    65  }
    66  
    67  func (filter *logFilter) DmConnectorDriver(filterChain *filterChain, c *DmConnector) (ret *DmDriver) {
    68  	var logRecord = c.logInfo.logRecord.Reset()
    69  	logRecord.Set(c, "driver")
    70  	defer func() {
    71  		filter.doLog(logRecord)
    72  	}()
    73  	ret = filterChain.DmConnectorDriver(c)
    74  	logRecord.SetReturnValue(ret)
    75  	return
    76  }
    77  
    78  func (filter *logFilter) DmConnectionBegin(filterChain *filterChain, c *DmConnection) (ret *DmConnection, err error) {
    79  	var logRecord = c.logInfo.logRecord.Reset()
    80  	logRecord.Set(c, "begin")
    81  	defer func() {
    82  		filter.doLog(logRecord)
    83  	}()
    84  	ret, err = filterChain.DmConnectionBegin(c)
    85  	if err != nil {
    86  		logRecord.SetError(err)
    87  		return
    88  	}
    89  	logRecord.SetReturnValue(ret)
    90  	return
    91  }
    92  
    93  func (filter *logFilter) DmConnectionBeginTx(filterChain *filterChain, c *DmConnection, ctx context.Context, opts driver.TxOptions) (ret *DmConnection, err error) {
    94  	var logRecord = c.logInfo.logRecord.Reset()
    95  	logRecord.Set(c, "beginTx", opts)
    96  	defer func() {
    97  		filter.doLog(logRecord)
    98  	}()
    99  	ret, err = filterChain.DmConnectionBeginTx(c, ctx, opts)
   100  	if err != nil {
   101  		logRecord.SetError(err)
   102  		return
   103  	}
   104  	logRecord.SetReturnValue(ret)
   105  	return
   106  }
   107  
   108  func (filter *logFilter) DmConnectionCommit(filterChain *filterChain, c *DmConnection) (err error) {
   109  	var logRecord = c.logInfo.logRecord.Reset()
   110  	logRecord.Set(c, "commit")
   111  	defer func() {
   112  		filter.doLog(logRecord)
   113  	}()
   114  	err = filterChain.DmConnectionCommit(c)
   115  	if err != nil {
   116  		logRecord.SetError(err)
   117  		return
   118  	}
   119  	return
   120  }
   121  
   122  func (filter *logFilter) DmConnectionRollback(filterChain *filterChain, c *DmConnection) (err error) {
   123  	var logRecord = c.logInfo.logRecord.Reset()
   124  	logRecord.Set(c, "rollback")
   125  	defer func() {
   126  		filter.doLog(logRecord)
   127  	}()
   128  	err = filterChain.DmConnectionRollback(c)
   129  	if err != nil {
   130  		logRecord.SetError(err)
   131  		return
   132  	}
   133  	return
   134  }
   135  
   136  func (filter *logFilter) DmConnectionClose(filterChain *filterChain, c *DmConnection) (err error) {
   137  	var logRecord = c.logInfo.logRecord.Reset()
   138  	logRecord.Set(c, "close")
   139  	defer func() {
   140  		filter.doLog(logRecord)
   141  	}()
   142  	err = filterChain.DmConnectionClose(c)
   143  	if err != nil {
   144  		logRecord.SetError(err)
   145  		return
   146  	}
   147  	return
   148  }
   149  
   150  func (filter *logFilter) DmConnectionPing(filterChain *filterChain, c *DmConnection, ctx context.Context) (err error) {
   151  	var logRecord = c.logInfo.logRecord.Reset()
   152  	logRecord.Set(c, "ping")
   153  	defer func() {
   154  		filter.doLog(logRecord)
   155  	}()
   156  	err = filterChain.DmConnectionPing(c, ctx)
   157  	if err != nil {
   158  		logRecord.SetError(err)
   159  		return
   160  	}
   161  	return
   162  }
   163  
   164  func (filter *logFilter) DmConnectionExec(filterChain *filterChain, c *DmConnection, query string, args []driver.Value) (ret *DmResult, err error) {
   165  	var logRecord = c.logInfo.logRecord.Reset()
   166  	logRecord.Set(c, "exec", convertParams2(args)...)
   167  	defer func() {
   168  		filter.executeAfter(c.logInfo, logRecord)
   169  		filter.doLog(logRecord)
   170  	}()
   171  	logRecord.SetSql(query, true)
   172  	filter.executeBefore(c.logInfo)
   173  	ret, err = filterChain.DmConnectionExec(c, query, args)
   174  	if err != nil {
   175  		logRecord.SetError(err)
   176  		return
   177  	}
   178  	logRecord.SetReturnValue(ret)
   179  	return
   180  }
   181  
   182  func (filter *logFilter) DmConnectionExecContext(filterChain *filterChain, c *DmConnection, ctx context.Context, query string, args []driver.NamedValue) (ret *DmResult, err error) {
   183  	var logRecord = c.logInfo.logRecord.Reset()
   184  	logRecord.Set(c, "execCtx", convertParams1(args)...)
   185  	defer func() {
   186  		filter.executeAfter(c.logInfo, logRecord)
   187  		filter.doLog(logRecord)
   188  	}()
   189  	logRecord.SetSql(query, true)
   190  	filter.executeBefore(c.logInfo)
   191  	ret, err = filterChain.DmConnectionExecContext(c, ctx, query, args)
   192  	if err != nil {
   193  		logRecord.SetError(err)
   194  		return
   195  	}
   196  	logRecord.SetReturnValue(ret)
   197  	return
   198  }
   199  
   200  func (filter *logFilter) DmConnectionQuery(filterChain *filterChain, c *DmConnection, query string, args []driver.Value) (ret *DmRows, err error) {
   201  	var logRecord = c.logInfo.logRecord.Reset()
   202  	logRecord.Set(c, "query", convertParams2(args)...)
   203  	defer func() {
   204  		filter.executeAfter(c.logInfo, logRecord)
   205  		filter.doLog(logRecord)
   206  	}()
   207  	logRecord.SetSql(query, true)
   208  	filter.executeBefore(c.logInfo)
   209  	ret, err = filterChain.DmConnectionQuery(c, query, args)
   210  	if err != nil {
   211  		logRecord.SetError(err)
   212  		return
   213  	}
   214  	logRecord.SetReturnValue(ret)
   215  	return
   216  }
   217  
   218  func (filter *logFilter) DmConnectionQueryContext(filterChain *filterChain, c *DmConnection, ctx context.Context, query string, args []driver.NamedValue) (ret *DmRows, err error) {
   219  	var logRecord = c.logInfo.logRecord.Reset()
   220  	logRecord.Set(c, "queryCtx", convertParams1(args)...)
   221  	defer func() {
   222  		filter.executeAfter(c.logInfo, logRecord)
   223  		filter.doLog(logRecord)
   224  	}()
   225  	logRecord.SetSql(query, true)
   226  	filter.executeBefore(c.logInfo)
   227  	ret, err = filterChain.DmConnectionQueryContext(c, ctx, query, args)
   228  	if err != nil {
   229  		logRecord.SetError(err)
   230  		return
   231  	}
   232  	logRecord.SetReturnValue(ret)
   233  	return
   234  }
   235  
   236  func (filter *logFilter) DmConnectionPrepare(filterChain *filterChain, c *DmConnection, query string) (ret *DmStatement, err error) {
   237  	var logRecord = c.logInfo.logRecord.Reset()
   238  	logRecord.Set(c, "prepare", query)
   239  	defer func() {
   240  		filter.doLog(logRecord)
   241  	}()
   242  	logRecord.SetSql(query, false)
   243  	ret, err = filterChain.DmConnectionPrepare(c, query)
   244  	if err != nil {
   245  		logRecord.SetError(err)
   246  		return
   247  	}
   248  	logRecord.SetReturnValue(ret)
   249  	return
   250  }
   251  
   252  func (filter *logFilter) DmConnectionPrepareContext(filterChain *filterChain, c *DmConnection, ctx context.Context, query string) (ret *DmStatement, err error) {
   253  	var logRecord = c.logInfo.logRecord.Reset()
   254  	logRecord.Set(c, "prepareCtx", query)
   255  	defer func() {
   256  		filter.doLog(logRecord)
   257  	}()
   258  	logRecord.SetSql(query, false)
   259  	ret, err = filterChain.DmConnectionPrepareContext(c, ctx, query)
   260  	if err != nil {
   261  		logRecord.SetError(err)
   262  		return
   263  	}
   264  	logRecord.SetReturnValue(ret)
   265  	return
   266  }
   267  
   268  func (filter *logFilter) DmConnectionResetSession(filterChain *filterChain, c *DmConnection, ctx context.Context) (err error) {
   269  	var logRecord = c.logInfo.logRecord.Reset()
   270  	logRecord.Set(c, "resetSession")
   271  	defer func() {
   272  		filter.doLog(logRecord)
   273  	}()
   274  	err = filterChain.DmConnectionResetSession(c, ctx)
   275  	if err != nil {
   276  		logRecord.SetError(err)
   277  		return
   278  	}
   279  	return
   280  }
   281  
   282  func (filter *logFilter) DmConnectionCheckNamedValue(filterChain *filterChain, c *DmConnection, nv *driver.NamedValue) (err error) {
   283  	var logRecord = c.logInfo.logRecord.Reset()
   284  	logRecord.Set(c, "checkNamedValue", nv.Value)
   285  	defer func() {
   286  		filter.doLog(logRecord)
   287  	}()
   288  	err = filterChain.DmConnectionCheckNamedValue(c, nv)
   289  	if err != nil {
   290  		logRecord.SetError(err)
   291  		return
   292  	}
   293  	return
   294  }
   295  
   296  func (filter *logFilter) DmStatementClose(filterChain *filterChain, s *DmStatement) (err error) {
   297  	var logRecord = s.logInfo.logRecord.Reset()
   298  	logRecord.Set(s, "close")
   299  	defer func() {
   300  		filter.doLog(logRecord)
   301  	}()
   302  	err = filterChain.DmStatementClose(s)
   303  	if err != nil {
   304  		logRecord.SetError(err)
   305  		return
   306  	}
   307  	return
   308  }
   309  
   310  func (filter *logFilter) DmStatementNumInput(filterChain *filterChain, s *DmStatement) (ret int) {
   311  	var logRecord = s.logInfo.logRecord.Reset()
   312  	logRecord.Set(s, "numInput")
   313  	defer func() {
   314  		filter.doLog(logRecord)
   315  	}()
   316  	ret = filterChain.DmStatementNumInput(s)
   317  	logRecord.SetReturnValue(ret)
   318  	return
   319  }
   320  
   321  func (filter *logFilter) DmStatementExec(filterChain *filterChain, s *DmStatement, args []driver.Value) (ret *DmResult, err error) {
   322  	var logRecord = s.logInfo.logRecord.Reset()
   323  	logRecord.Set(s, "exec", convertParams2(args)...)
   324  	defer func() {
   325  		filter.executeAfter(s.logInfo, logRecord)
   326  		filter.doLog(logRecord)
   327  	}()
   328  	logRecord.SetSql(s.nativeSql, true)
   329  	filter.executeBefore(s.logInfo)
   330  	ret, err = filterChain.DmStatementExec(s, args)
   331  	if err != nil {
   332  		logRecord.SetError(err)
   333  		return
   334  	}
   335  	logRecord.SetReturnValue(ret)
   336  	return
   337  }
   338  
   339  func (filter *logFilter) DmStatementExecContext(filterChain *filterChain, s *DmStatement, ctx context.Context, args []driver.NamedValue) (ret *DmResult, err error) {
   340  	var logRecord = s.logInfo.logRecord.Reset()
   341  	logRecord.Set(s, "execCtx", convertParams1(args)...)
   342  	defer func() {
   343  		filter.executeAfter(s.logInfo, logRecord)
   344  		filter.doLog(logRecord)
   345  	}()
   346  	logRecord.SetSql(s.nativeSql, true)
   347  	filter.executeBefore(s.logInfo)
   348  	ret, err = filterChain.DmStatementExecContext(s, ctx, args)
   349  	if err != nil {
   350  		logRecord.SetError(err)
   351  		return
   352  	}
   353  	logRecord.SetReturnValue(ret)
   354  	return
   355  }
   356  
   357  func (filter *logFilter) DmStatementQuery(filterChain *filterChain, s *DmStatement, args []driver.Value) (ret *DmRows, err error) {
   358  	var logRecord = s.logInfo.logRecord.Reset()
   359  	logRecord.Set(s, "query", convertParams2(args)...)
   360  	defer func() {
   361  		filter.executeAfter(s.logInfo, logRecord)
   362  		filter.doLog(logRecord)
   363  	}()
   364  	logRecord.SetSql(s.nativeSql, true)
   365  	filter.executeBefore(s.logInfo)
   366  	ret, err = filterChain.DmStatementQuery(s, args)
   367  	if err != nil {
   368  		logRecord.SetError(err)
   369  		return
   370  	}
   371  	logRecord.SetReturnValue(ret)
   372  	return
   373  }
   374  
   375  func (filter *logFilter) DmStatementQueryContext(filterChain *filterChain, s *DmStatement, ctx context.Context, args []driver.NamedValue) (ret *DmRows, err error) {
   376  	var logRecord = s.logInfo.logRecord.Reset()
   377  	logRecord.Set(s, "queryCtx", convertParams1(args)...)
   378  	defer func() {
   379  		filter.executeAfter(s.logInfo, logRecord)
   380  		filter.doLog(logRecord)
   381  	}()
   382  	logRecord.SetSql(s.nativeSql, true)
   383  	filter.executeBefore(s.logInfo)
   384  	ret, err = filterChain.DmStatementQueryContext(s, ctx, args)
   385  	if err != nil {
   386  		logRecord.SetError(err)
   387  		return
   388  	}
   389  	logRecord.SetReturnValue(ret)
   390  	return
   391  }
   392  
   393  func (filter *logFilter) DmStatementCheckNamedValue(filterChain *filterChain, s *DmStatement, nv *driver.NamedValue) (err error) {
   394  	var logRecord = s.logInfo.logRecord.Reset()
   395  	logRecord.Set(s, "checkNamedValue", nv.Value)
   396  	defer func() {
   397  		filter.doLog(logRecord)
   398  	}()
   399  	err = filterChain.DmStatementCheckNamedValue(s, nv)
   400  	if err != nil {
   401  		logRecord.SetError(err)
   402  		return
   403  	}
   404  	return
   405  }
   406  
   407  func (filter *logFilter) DmResultLastInsertId(filterChain *filterChain, r *DmResult) (ret int64, err error) {
   408  	var logRecord = r.logInfo.logRecord.Reset()
   409  	logRecord.Set(r, "lastInsertId")
   410  	defer func() {
   411  		filter.doLog(logRecord)
   412  	}()
   413  	ret, err = filterChain.DmResultLastInsertId(r)
   414  	if err != nil {
   415  		logRecord.SetError(err)
   416  		return
   417  	}
   418  	logRecord.SetReturnValue(ret)
   419  	return
   420  }
   421  
   422  func (filter *logFilter) DmResultRowsAffected(filterChain *filterChain, r *DmResult) (ret int64, err error) {
   423  	var logRecord = r.logInfo.logRecord.Reset()
   424  	logRecord.Set(r, "rowsAffected")
   425  	defer func() {
   426  		filter.doLog(logRecord)
   427  	}()
   428  	ret, err = filterChain.DmResultRowsAffected(r)
   429  	if err != nil {
   430  		logRecord.SetError(err)
   431  		return
   432  	}
   433  	logRecord.SetReturnValue(ret)
   434  	return
   435  }
   436  
   437  func (filter *logFilter) DmRowsColumns(filterChain *filterChain, r *DmRows) (ret []string) {
   438  	var logRecord = r.logInfo.logRecord.Reset()
   439  	logRecord.Set(r, "columns")
   440  	defer func() {
   441  		filter.doLog(logRecord)
   442  	}()
   443  	ret = filterChain.DmRowsColumns(r)
   444  	logRecord.SetReturnValue(ret)
   445  	return
   446  }
   447  
   448  func (filter *logFilter) DmRowsClose(filterChain *filterChain, r *DmRows) (err error) {
   449  	var logRecord = r.logInfo.logRecord.Reset()
   450  	logRecord.Set(r, "close")
   451  	defer func() {
   452  		filter.doLog(logRecord)
   453  	}()
   454  	err = filterChain.DmRowsClose(r)
   455  	if err != nil {
   456  		logRecord.SetError(err)
   457  		return
   458  	}
   459  	return
   460  }
   461  
   462  func (filter *logFilter) DmRowsNext(filterChain *filterChain, r *DmRows, dest []driver.Value) (err error) {
   463  	var logRecord = r.logInfo.logRecord.Reset()
   464  	logRecord.Set(r, "next", convertParams2(dest)...)
   465  	defer func() {
   466  		filter.doLog(logRecord)
   467  	}()
   468  	err = filterChain.DmRowsNext(r, dest)
   469  	if err != nil && err != io.EOF {
   470  		logRecord.SetError(err)
   471  		return
   472  	}
   473  	return
   474  }
   475  
   476  func (filter *logFilter) DmRowsHasNextResultSet(filterChain *filterChain, r *DmRows) (ret bool) {
   477  	var logRecord = r.logInfo.logRecord.Reset()
   478  	logRecord.Set(r, "hasNextResultSet")
   479  	defer func() {
   480  		filter.doLog(logRecord)
   481  	}()
   482  	ret = filterChain.DmRowsHasNextResultSet(r)
   483  	logRecord.SetReturnValue(ret)
   484  	return
   485  }
   486  
   487  func (filter *logFilter) DmRowsNextResultSet(filterChain *filterChain, r *DmRows) (err error) {
   488  	var logRecord = r.logInfo.logRecord.Reset()
   489  	logRecord.Set(r, "nextResultSet")
   490  	defer func() {
   491  		filter.doLog(logRecord)
   492  	}()
   493  	err = filterChain.DmRowsNextResultSet(r)
   494  	if err != nil && err != io.EOF {
   495  		logRecord.SetError(err)
   496  		return
   497  	}
   498  	return
   499  }
   500  
   501  func (filter *logFilter) DmRowsColumnTypeScanType(filterChain *filterChain, r *DmRows, index int) (ret reflect.Type) {
   502  	var logRecord = r.logInfo.logRecord.Reset()
   503  	logRecord.Set(r, "columnTypeScanType", index)
   504  	defer func() {
   505  		filter.doLog(logRecord)
   506  	}()
   507  	ret = filterChain.DmRowsColumnTypeScanType(r, index)
   508  	logRecord.SetReturnValue(ret)
   509  	return
   510  }
   511  
   512  func (filter *logFilter) DmRowsColumnTypeDatabaseTypeName(filterChain *filterChain, r *DmRows, index int) (ret string) {
   513  	var logRecord = r.logInfo.logRecord.Reset()
   514  	logRecord.Set(r, "columnTypeDatabaseTypeName", index)
   515  	defer func() {
   516  		filter.doLog(logRecord)
   517  	}()
   518  	ret = filterChain.DmRowsColumnTypeDatabaseTypeName(r, index)
   519  	logRecord.SetReturnValue(ret)
   520  	return
   521  }
   522  
   523  func (filter *logFilter) DmRowsColumnTypeLength(filterChain *filterChain, r *DmRows, index int) (length int64, ok bool) {
   524  	var logRecord = r.logInfo.logRecord.Reset()
   525  	logRecord.Set(r, "columnTypeLength", index)
   526  	defer func() {
   527  		filter.doLog(logRecord)
   528  	}()
   529  	length, ok = filterChain.DmRowsColumnTypeLength(r, index)
   530  	if ok {
   531  		logRecord.SetReturnValue(length)
   532  	} else {
   533  		logRecord.SetReturnValue(-1)
   534  	}
   535  	return
   536  }
   537  
   538  func (filter *logFilter) DmRowsColumnTypeNullable(filterChain *filterChain, r *DmRows, index int) (nullable, ok bool) {
   539  	var logRecord = r.logInfo.logRecord.Reset()
   540  	logRecord.Set(r, "columnTypeNullable", index)
   541  	defer func() {
   542  		filter.doLog(logRecord)
   543  	}()
   544  	nullable, ok = filterChain.DmRowsColumnTypeNullable(r, index)
   545  	if ok {
   546  		logRecord.SetReturnValue(nullable)
   547  	} else {
   548  		logRecord.SetReturnValue(false)
   549  	}
   550  	return
   551  }
   552  
   553  func (filter *logFilter) DmRowsColumnTypePrecisionScale(filterChain *filterChain, r *DmRows, index int) (precision, scale int64, ok bool) {
   554  	var logRecord = r.logInfo.logRecord.Reset()
   555  	logRecord.Set(r, "columnTypePrecisionScale", index)
   556  	defer func() {
   557  		filter.doLog(logRecord)
   558  	}()
   559  	precision, scale, ok = filterChain.DmRowsColumnTypePrecisionScale(r, index)
   560  	if ok {
   561  		logRecord.SetReturnValue(strconv.FormatInt(precision, 10) + "&" + strconv.FormatInt(scale, 10))
   562  	} else {
   563  		logRecord.SetReturnValue("-1&-1")
   564  	}
   565  	return
   566  }
   567  
   568  func (filter *logFilter) executeBefore(logInfo *logInfo) {
   569  	if LogFilterLogger.IsSqlEnabled() {
   570  		logInfo.lastExecuteStartNano = time.Now()
   571  	}
   572  }
   573  
   574  func (filter *logFilter) executeAfter(logInfo *logInfo, record *LogRecord) {
   575  	if LogFilterLogger.IsSqlEnabled() {
   576  		record.SetUsedTime(time.Since(logInfo.lastExecuteStartNano))
   577  	}
   578  }
   579  
   580  func (filter *logFilter) doLog(record *LogRecord) {
   581  
   582  	if record == nil {
   583  		return
   584  	}
   585  	if record.GetError() != nil {
   586  		LogFilterLogger.ErrorWithErr(record.ToString(), record.GetError())
   587  	} else if record.GetSql() != "" && LogFilterLogger.IsSqlEnabled() {
   588  		LogFilterLogger.Sql(record.ToString())
   589  	} else {
   590  		LogFilterLogger.Info(record.ToString())
   591  	}
   592  }
   593  
   594  /************************************************************************************************************/
   595  type Logger struct {
   596  }
   597  
   598  var LogFilterLogger = &Logger{}
   599  var ConnLogger = &Logger{}
   600  var AccessLogger = &Logger{}
   601  
   602  func (logger Logger) IsDebugEnabled() bool {
   603  	return LogLevel >= LOG_DEBUG
   604  }
   605  func (logger Logger) IsErrorEnabled() bool {
   606  	return LogLevel >= LOG_ERROR
   607  }
   608  func (logger Logger) IsInfoEnabled() bool {
   609  	return LogLevel >= LOG_INFO
   610  }
   611  func (logger Logger) IsWarnEnabled() bool {
   612  	return LogLevel >= LOG_WARN
   613  }
   614  func (logger Logger) IsSqlEnabled() bool {
   615  	return LogLevel >= LOG_SQL
   616  }
   617  func (logger Logger) Debug(msg string) {
   618  	if logger.IsDebugEnabled() {
   619  		logger.println(logger.formatHead("DEBUG") + msg)
   620  	}
   621  }
   622  func (logger Logger) DebugWithErr(msg string, err error) {
   623  	if logger.IsDebugEnabled() {
   624  		if e, ok := err.(*DmError); ok {
   625  			logger.println(logger.formatHead("DEBUG") + msg + util.LINE_SEPARATOR + e.FormatStack())
   626  		} else {
   627  			logger.println(logger.formatHead("DEBUG") + msg + util.LINE_SEPARATOR + err.Error())
   628  		}
   629  	}
   630  }
   631  func (logger Logger) Info(msg string) {
   632  	if logger.IsInfoEnabled() {
   633  		logger.println(logger.formatHead("INFO ") + msg)
   634  	}
   635  }
   636  func (logger Logger) Sql(msg string) {
   637  	if logger.IsSqlEnabled() {
   638  		logger.println(logger.formatHead("SQL  ") + msg)
   639  	}
   640  }
   641  func (logger Logger) Warn(msg string) {
   642  	if logger.IsWarnEnabled() {
   643  		logger.println(logger.formatHead("WARN ") + msg)
   644  	}
   645  }
   646  func (logger Logger) ErrorWithErr(msg string, err error) {
   647  	//if e, ok := err.(*DmError); ok {
   648  	//	logger.println(logger.formatHead("ERROR") + msg + util.LINE_SEPARATOR + e.FormatStack())
   649  	//} else {
   650  	logger.println(logger.formatHead("ERROR") + msg + util.LINE_SEPARATOR + err.Error())
   651  	//}
   652  }
   653  
   654  // TODO: 获取goroutine objId
   655  func (logger Logger) formatHead(head string) string {
   656  	// return "[" + head + " - " + StringUtil.formatTime() + "] tid:" + Thread.currentThread().getId();
   657  	return "[" + head + " - " + util.StringUtil.FormatTime() + "]"
   658  }
   659  func (logger Logger) println(msg string) {
   660  	goMap["log"].(*logWriter).WriteLine(msg)
   661  }
   662  
   663  /*************************************************************************************************/
   664  func formatSource(source interface{}) string {
   665  	if source == nil {
   666  		return ""
   667  	}
   668  	var str string
   669  	switch src := source.(type) {
   670  	case string:
   671  		str += src
   672  	case *DmDriver:
   673  		str += formatDriver(src)
   674  	case *DmConnector:
   675  		str += formatContor(src)
   676  	case *DmConnection:
   677  		str += formatConn(src)
   678  	case *DmStatement:
   679  		str += formatConn(src.dmConn) + ", "
   680  		str += formatStmt(src)
   681  	case *DmResult:
   682  		str += formatConn(src.dmStmt.dmConn) + ", "
   683  		str += formatStmt(src.dmStmt) + ", "
   684  		str += formatRs(src)
   685  	case *DmRows:
   686  		str += formatConn(src.CurrentRows.dmStmt.dmConn) + ", "
   687  		str += formatStmt(src.CurrentRows.dmStmt) + ", "
   688  		str += formatRows(src)
   689  	default:
   690  		str += reflect.TypeOf(src).String() + "@" + reflect.ValueOf(src).Addr().String()
   691  	}
   692  	return str
   693  }
   694  
   695  func formatDriver(driver *DmDriver) string {
   696  	if driver != nil && driver.logInfo != nil {
   697  		return "driver-" + strconv.FormatInt(driver.getID(), 10)
   698  	}
   699  	return "driver-nil"
   700  }
   701  
   702  func formatContor(contor *DmConnector) string {
   703  	if contor != nil && contor.logInfo != nil {
   704  		return "contor-" + strconv.FormatInt(contor.getID(), 10)
   705  	}
   706  	return "contor-nil"
   707  }
   708  
   709  func formatConn(conn *DmConnection) string {
   710  	if conn != nil && conn.logInfo != nil {
   711  		return "conn-0x" + strconv.FormatInt(conn.SessionID, 16)
   712  	}
   713  	return "conn-nil"
   714  }
   715  
   716  func formatStmt(stmt *DmStatement) string {
   717  	if stmt != nil && stmt.logInfo != nil {
   718  		return "stmt-" + strconv.Itoa(int(stmt.id))
   719  	}
   720  	return "stmt-nil"
   721  }
   722  
   723  func formatRs(result *DmResult) string {
   724  	if result != nil && result.logInfo != nil {
   725  		return "rs-" + strconv.FormatInt(result.getID(), 10)
   726  	}
   727  	return "rs-nil"
   728  }
   729  
   730  func formatRows(rows *DmRows) string {
   731  	if rows != nil && rows.logInfo != nil {
   732  		return "rows-" + strconv.FormatInt(rows.getID(), 10)
   733  	}
   734  	return "rows-nil"
   735  }
   736  
   737  func formatTrace(source string, sql string, method string, returnValue interface{}, params ...interface{}) string {
   738  	var str string
   739  	if source != "" {
   740  		str += "{ " + source + " } "
   741  	}
   742  	str += method + "("
   743  	var paramStartIndex = 0
   744  	if params != nil && len(params) > paramStartIndex {
   745  		for i := paramStartIndex; i < len(params); i++ {
   746  			if i != paramStartIndex {
   747  				str += ", "
   748  			}
   749  			if params[i] != nil {
   750  				str += reflect.TypeOf(params[i]).String()
   751  			} else {
   752  				str += "nil"
   753  			}
   754  		}
   755  	}
   756  	str += ")"
   757  	if returnValue != nil {
   758  		str += ": " + formatReturn(returnValue)
   759  	}
   760  	str += "; "
   761  	if params != nil && len(params) > paramStartIndex {
   762  		str += "[PARAMS]: "
   763  		for i := paramStartIndex; i < len(params); i++ {
   764  			if i != 0 {
   765  				str += ", "
   766  			}
   767  			//if s, ok := params[i].(driver.NamedValue); ok {
   768  			//	str += fmt.Sprintf("%v", s.Value)
   769  			//} else {
   770  			str += fmt.Sprintf("%v", params[i])
   771  			//}
   772  		}
   773  		str += "; "
   774  	}
   775  
   776  	if sql != "" {
   777  		str += "[SQL]: " + sql + "; "
   778  	}
   779  
   780  	return str
   781  }
   782  
   783  func formatReturn(returnObj interface{}) string {
   784  	var str string
   785  	switch o := returnObj.(type) {
   786  	case *DmConnection:
   787  		str = formatConn(o)
   788  	case *DmStatement:
   789  		str = formatStmt(o)
   790  	case *DmResult:
   791  		str = formatRs(o)
   792  	case *DmRows:
   793  		str = formatRows(o)
   794  	case string:
   795  		str = `"` + o + `"`
   796  	case nullData:
   797  		str = "nil"
   798  	default:
   799  		str = "unknown"
   800  	}
   801  	return str
   802  }
   803  
   804  func formatUsedTime(duration time.Duration) string {
   805  	return "[USED TIME]: " + duration.String()
   806  }
   807  
   808  /************************************************************************************************************/
   809  
   810  type nullData struct{}
   811  
   812  var null = nullData{}
   813  
   814  type LogRecord struct {
   815  	source      string
   816  	method      string
   817  	params      []interface{}
   818  	returnValue interface{}
   819  	e           error
   820  	usedTime    time.Duration
   821  	sql         string
   822  	logSql      bool // 是否需要记录sql(exec,query等需要在日志中记录sql语句)
   823  }
   824  
   825  func (record *LogRecord) Reset() *LogRecord {
   826  	record.source = ""
   827  	record.method = ""
   828  	record.params = nil
   829  	record.returnValue = nil
   830  	record.e = nil
   831  	record.usedTime = 0
   832  	record.sql = ""
   833  	record.logSql = false
   834  	return record
   835  }
   836  
   837  func (record *LogRecord) Set(source interface{}, method string, params ...interface{}) {
   838  	record.source = formatSource(source)
   839  	record.method = method
   840  	record.params = params
   841  }
   842  
   843  func (record *LogRecord) SetReturnValue(retValue interface{}) {
   844  	if retValue == nil {
   845  		record.returnValue = null
   846  	} else {
   847  		record.returnValue = retValue
   848  	}
   849  }
   850  
   851  func (record *LogRecord) GetReturnValue() interface{} {
   852  	return record.returnValue
   853  }
   854  
   855  func (record *LogRecord) SetSql(sql string, logSql bool) {
   856  	record.sql = sql
   857  	record.logSql = logSql
   858  }
   859  
   860  func (record *LogRecord) GetSql() string {
   861  	return record.sql
   862  }
   863  
   864  func (record *LogRecord) SetUsedTime(usedTime time.Duration) {
   865  	record.usedTime = usedTime
   866  }
   867  
   868  func (record *LogRecord) GetUsedTime() time.Duration {
   869  	return record.usedTime
   870  }
   871  
   872  func (record *LogRecord) SetError(err error) {
   873  	record.e = err
   874  }
   875  
   876  func (record *LogRecord) GetError() error {
   877  	return record.e
   878  }
   879  
   880  func (record *LogRecord) ToString() string {
   881  	var sql string
   882  	if record.logSql && record.sql != "" {
   883  		sql = record.sql
   884  	}
   885  	var str string
   886  	str += formatTrace(record.source, sql, record.method, record.returnValue, record.params...)
   887  	if record.usedTime > 0 {
   888  		str += formatUsedTime(record.usedTime)
   889  	}
   890  	return str
   891  }
   892  
   893  func convertParams1(args []driver.NamedValue) []interface{} {
   894  	tmp := make([]interface{}, len(args))
   895  	for i := 0; i < len(tmp); i++ {
   896  		tmp[i] = args[i].Value
   897  	}
   898  	return tmp
   899  }
   900  
   901  func convertParams2(args []driver.Value) []interface{} {
   902  	tmp := make([]interface{}, len(args))
   903  	for i := 0; i < len(tmp); i++ {
   904  		tmp[i] = args[i]
   905  	}
   906  	return tmp
   907  }