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 }