za.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "bytes"
  8. "fmt"
  9. "runtime"
  10. "gitee.com/chunanyong/dm/i18n"
  11. )
  12. // 驱动级错误
  13. var (
  14. DSN_INVALID_SCHEMA = newDmError(9001, "error.dsn.invalidSchema")
  15. UNSUPPORTED_SCAN = newDmError(9002, "error.unsupported.scan")
  16. INVALID_PARAMETER_NUMBER = newDmError(9003, "error.invalidParameterNumber")
  17. THIRD_PART_CIPHER_INIT_FAILED = newDmError(9004, "error.initThirdPartCipherFailed")
  18. ECGO_NOT_QUERY_SQL = newDmError(9005, "error.notQuerySQL")
  19. ECGO_NOT_EXEC_SQL = newDmError(9006, "error.notExecSQL")
  20. ECGO_UNKOWN_NETWORK = newDmError(9007, "error.unkownNetWork")
  21. ECGO_INVALID_CONN = newDmError(9008, "error.invalidConn")
  22. ECGO_UNSUPPORTED_INPARAM_TYPE = newDmError(9009, "error.unsupportedInparamType")
  23. ECGO_UNSUPPORTED_OUTPARAM_TYPE = newDmError(9010, "error.unsupportedOutparamType")
  24. ECGO_STORE_IN_NIL_POINTER = newDmError(9011, "error.storeInNilPointer")
  25. ECGO_IS_NULL = newDmError(9012, "error.isNull")
  26. )
  27. var (
  28. ECGO_CONNECTION_SWITCH_FAILED = newDmError(20001, "error.connectionSwitchFailed")
  29. ECGO_CONNECTION_SWITCHED = newDmError(20000, "error.connectionSwitched")
  30. ECGO_COMMUNITION_ERROR = newDmError(6001, "error.communicationError")
  31. ECGO_MSG_CHECK_ERROR = newDmError(6002, "error.msgCheckError")
  32. ECGO_INVALID_TIME_INTERVAL = newDmError(6005, "error.invalidTimeInterval")
  33. ECGO_UNSUPPORTED_TYPE = newDmError(6006, "error.unsupportedType")
  34. ECGO_DATA_CONVERTION_ERROR = newDmError(6007, "error.dataConvertionError")
  35. ECGO_INVALID_SQL_TYPE = newDmError(6009, "error.invalidSqlType")
  36. ECGO_INVALID_DATETIME_FORMAT = newDmError(6015, "error.invalidDateTimeFormat")
  37. ECGO_INVALID_COLUMN_TYPE = newDmError(6016, "error.invalidColumnType")
  38. ECGO_RESULTSET_IS_READ_ONLY = newDmError(6029, "error.resultsetInReadOnlyStatus")
  39. ECGO_INVALID_SEQUENCE_NUMBER = newDmError(6032, "error.invalidSequenceNumber")
  40. ECGO_RESULTSET_CLOSED = newDmError(6034, "errorResultSetColsed")
  41. ECGO_STATEMENT_HANDLE_CLOSED = newDmError(6035, "errorStatementHandleClosed")
  42. ECGO_INVALID_PARAMETER_VALUE = newDmError(6036, "error.invalidParamterValue")
  43. ECGO_INVALID_TRAN_ISOLATION = newDmError(6038, "error.invalidTranIsolation")
  44. ECGO_COMMIT_IN_AUTOCOMMIT_MODE = newDmError(6039, "errorCommitInAutoCommitMode")
  45. ECGO_ROLLBACK_IN_AUTOCOMMIT_MODE = newDmError(6040, "errorRollbackInAutoCommitMode")
  46. ECGO_UNBINDED_PARAMETER = newDmError(6054, "error.unbindedParameter")
  47. ECGO_PARAM_COUNT_LIMIT = newDmError(6056, "error.ParamCountLimit")
  48. ECGO_INVALID_LENGTH_OR_OFFSET = newDmError(6057, "error.invalidLenOrOffset")
  49. ECGO_INTERVAL_OVERFLOW = newDmError(6066, "error.intervalValueOverflow")
  50. ECGO_STRING_CUT = newDmError(6067, "error.stringCut")
  51. ECGO_INVALID_HEX = newDmError(6068, "error.invalidHex")
  52. ECGO_INVALID_CIPHER = newDmError(6069, "error.invalidCipher")
  53. ECGO_INVALID_BFILE_STR = newDmError(6070, "error.invalidBFile")
  54. ECGO_OSAUTH_ERROR = newDmError(6073, "error.osauthError")
  55. ECGO_ERROR_SERVER_VERSION = newDmError(6074, "error.serverVersion")
  56. ECGO_USERNAME_TOO_LONG = newDmError(6075, "error.usernameTooLong")
  57. ECGO_PASSWORD_TOO_LONG = newDmError(6076, "error.passwordTooLong")
  58. ECGO_INVALID_COMPLEX_TYPE_NAME = newDmError(6079, "error.invalidComplexTypeName")
  59. ECGO_STRUCT_MEM_NOT_MATCH = newDmError(6080, "error.structMemNotMatch")
  60. ECGO_INVALID_OBJ_BLOB = newDmError(6081, "error.invalidObjBlob")
  61. ECGO_INVALID_ARRAY_LEN = newDmError(6082, "error.invalidArrayLen")
  62. ECGO_INVALID_SERVER_MODE = newDmError(6091, "error.invalidServerMode")
  63. ECGO_DATA_TOO_LONG = newDmError(6092, "error.dataTooLong")
  64. ECGO_BATCH_ERROR = newDmError(6093, "error.batchError")
  65. ECGO_MSG_TOO_LONG = newDmError(6101, "error.msgTooLong")
  66. ECGO_INVALID_DATETIME_VALUE = newDmError(6103, "error.invalidDateTimeValue")
  67. ECGO_INIT_SSL_FAILED = newDmError(20002, "error.SSLInitFailed")
  68. ECGO_LOB_FREED = newDmError(20003, "error.LobDataHasFreed")
  69. ECGO_FATAL_ERROR = newDmError(20004, "error.fatalError")
  70. )
  71. // Svr Msg Err
  72. var (
  73. ECGO_DATA_OVERFLOW = newDmError(-6102, "error.dataOverflow")
  74. ECGO_DATETIME_OVERFLOW = newDmError(-6112, "error.datetimeOverflow")
  75. EC_RN_EXCEED_ROWSET_SIZE = newDmError(-7036, "")
  76. EC_BP_WITH_ERROR = newDmError(121, "warning.bpWithErr")
  77. )
  78. type DmError struct {
  79. ErrCode int32
  80. ErrText string
  81. stack []uintptr
  82. detail string
  83. }
  84. func newDmError(errCode int32, errText string) *DmError {
  85. de := new(DmError)
  86. de.ErrCode = errCode
  87. de.ErrText = errText
  88. de.stack = nil
  89. de.detail = ""
  90. return de
  91. }
  92. func (dmError *DmError) throw() *DmError {
  93. var pcs [32]uintptr
  94. n := runtime.Callers(2, pcs[:])
  95. dmError.stack = pcs[0:n]
  96. return dmError
  97. }
  98. func (dmError *DmError) FormatStack() string {
  99. if dmError == nil || dmError.stack == nil {
  100. return ""
  101. }
  102. buffer := bytes.NewBuffer(nil)
  103. index := 1
  104. space := " "
  105. for _, p := range dmError.stack {
  106. if fn := runtime.FuncForPC(p - 1); fn != nil {
  107. file, line := fn.FileLine(p - 1)
  108. buffer.WriteString(fmt.Sprintf(" %d).%s%s\n \t%s:%d\n", index, space, fn.Name(), file, line))
  109. index++
  110. }
  111. }
  112. return buffer.String()
  113. }
  114. func (dmError *DmError) Error() string {
  115. return fmt.Sprintf("Error %d: %s", dmError.ErrCode, i18n.Get(dmError.ErrText, Locale)) + dmError.detail + "\n" + "stack info:\n" + dmError.FormatStack()
  116. }
  117. // 扩充ErrText
  118. func (dmError *DmError) addDetail(detail string) *DmError {
  119. dmError.detail = detail
  120. return dmError
  121. }
  122. func (dmError *DmError) addDetailln(detail string) *DmError {
  123. return dmError.addDetail("\n" + detail)
  124. }