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 }