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