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