gitee.com/curryzheng/dm@v0.0.1/zb.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  	"gitee.com/curryzheng/dm/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  	ECGO_IS_NULL                   = newDmError(9012, "error.isNull")
    29  )
    30  
    31  var (
    32  	ECGO_CONNECTION_SWITCH_FAILED    = newDmError(20001, "error.connectionSwitchFailed")
    33  	ECGO_CONNECTION_SWITCHED         = newDmError(20000, "error.connectionSwitched")
    34  	ECGO_COMMUNITION_ERROR           = newDmError(6001, "error.communicationError")
    35  	ECGO_MSG_CHECK_ERROR             = newDmError(6002, "error.msgCheckError")
    36  	ECGO_INVALID_TIME_INTERVAL       = newDmError(6005, "error.invalidTimeInterval")
    37  	ECGO_UNSUPPORTED_TYPE            = newDmError(6006, "error.unsupportedType")
    38  	ECGO_DATA_CONVERTION_ERROR       = newDmError(6007, "error.dataConvertionError")
    39  	ECGO_INVALID_SQL_TYPE            = newDmError(6009, "error.invalidSqlType")
    40  	ECGO_INVALID_DATETIME_FORMAT     = newDmError(6015, "error.invalidDateTimeFormat")
    41  	ECGO_INVALID_COLUMN_TYPE         = newDmError(6016, "error.invalidColumnType")
    42  	ECGO_RESULTSET_IS_READ_ONLY      = newDmError(6029, "error.resultsetInReadOnlyStatus")
    43  	ECGO_INVALID_SEQUENCE_NUMBER     = newDmError(6032, "error.invalidSequenceNumber")
    44  	ECGO_RESULTSET_CLOSED            = newDmError(6034, "errorResultSetColsed")
    45  	ECGO_STATEMENT_HANDLE_CLOSED     = newDmError(6035, "errorStatementHandleClosed")
    46  	ECGO_INVALID_PARAMETER_VALUE     = newDmError(6036, "error.invalidParamterValue")
    47  	ECGO_INVALID_TRAN_ISOLATION      = newDmError(6038, "error.invalidTranIsolation")
    48  	ECGO_COMMIT_IN_AUTOCOMMIT_MODE   = newDmError(6039, "errorCommitInAutoCommitMode")
    49  	ECGO_ROLLBACK_IN_AUTOCOMMIT_MODE = newDmError(6040, "errorRollbackInAutoCommitMode")
    50  	ECGO_INVALID_LENGTH_OR_OFFSET    = newDmError(6057, "error.invalidLenOrOffset")
    51  	ECGO_INTERVAL_OVERFLOW           = newDmError(6066, "error.intervalValueOverflow")
    52  	ECGO_INVALID_BFILE_STR           = newDmError(6067, "error.invalidBFile")
    53  	ECGO_INVALID_HEX                 = newDmError(6068, "error.invalidHex")
    54  	ECGO_INVALID_CIPHER              = newDmError(6069, "error.invalidCipher")
    55  	ECGO_OSAUTH_ERROR                = newDmError(6073, "error.osauthError")
    56  	ECGO_ERROR_SERVER_VERSION        = newDmError(6074, "error.serverVersion")
    57  	ECGO_USERNAME_TOO_LONG           = newDmError(6075, "error.usernameTooLong")
    58  	ECGO_PASSWORD_TOO_LONG           = newDmError(6076, "error.passwordTooLong")
    59  	ECGO_INVALID_COMPLEX_TYPE_NAME   = newDmError(6079, "error.invalidComplexTypeName")
    60  	ECGO_STRUCT_MEM_NOT_MATCH        = newDmError(6080, "error.structMemNotMatch")
    61  	ECGO_INVALID_OBJ_BLOB            = newDmError(6081, "error.invalidObjBlob")
    62  	ECGO_INVALID_ARRAY_LEN           = newDmError(6082, "error.invalidArrayLen")
    63  	ECGO_INVALID_SERVER_MODE         = newDmError(6091, "error.invalidServerMode")
    64  	ECGO_DATA_TOO_LONG               = newDmError(6092, "error.dataTooLong")
    65  	ECGO_BATCH_ERROR                 = newDmError(6093, "error.batchError")
    66  	ECGO_MSG_TOO_LONG                = newDmError(6101, "error.msgTooLong")
    67  	ECGO_INVALID_DATETIME_VALUE      = newDmError(6103, "error.invalidDateTimeValue")
    68  
    69  	ECGO_INIT_SSL_FAILED = newDmError(20002, "error.SSLInitFailed")
    70  	ECGO_LOB_FREED       = newDmError(20003, "error.LobDataHasFreed")
    71  	ECGO_FATAL_ERROR     = newDmError(20004, "error.fatalError")
    72  )
    73  
    74  //Svr Msg Err
    75  var (
    76  	ECGO_DATA_OVERFLOW       = newDmError(-6102, "error.dataOverflow")
    77  	ECGO_DATETIME_OVERFLOW   = newDmError(-6112, "error.datetimeOverflow")
    78  	EC_RN_EXCEED_ROWSET_SIZE = newDmError(-7036, "")
    79  	EC_BP_WITH_ERROR         = newDmError(121, "warning.bpWithErr")
    80  )
    81  
    82  type DmError struct {
    83  	ErrCode int32
    84  	ErrText string
    85  	stack   []uintptr
    86  	detail  string
    87  }
    88  
    89  func newDmError(errCode int32, errText string) *DmError {
    90  	de := new(DmError)
    91  	de.ErrCode = errCode
    92  	de.ErrText = errText
    93  	de.stack = nil
    94  	de.detail = ""
    95  	return de
    96  }
    97  
    98  func (dmError *DmError) throw() *DmError {
    99  	var pcs [32]uintptr
   100  	n := runtime.Callers(2, pcs[:])
   101  	dmError.stack = pcs[0:n]
   102  	return dmError
   103  }
   104  
   105  func (dmError *DmError) FormatStack() string {
   106  	if dmError == nil || dmError.stack == nil {
   107  		return ""
   108  	}
   109  	buffer := bytes.NewBuffer(nil)
   110  	index := 1
   111  	space := "  "
   112  	for _, p := range dmError.stack {
   113  		if fn := runtime.FuncForPC(p - 1); fn != nil {
   114  			file, line := fn.FileLine(p - 1)
   115  			buffer.WriteString(fmt.Sprintf("   %d).%s%s\n    \t%s:%d\n", index, space, fn.Name(), file, line))
   116  			index++
   117  		}
   118  	}
   119  	return buffer.String()
   120  }
   121  
   122  func (dmError *DmError) Error() string {
   123  	return fmt.Sprintf("Error %d: %s", dmError.ErrCode, i18n.Get(dmError.ErrText, Locale)) + dmError.detail + "\n" + "stack info:\n" + dmError.FormatStack()
   124  }
   125  
   126  // 扩充ErrText
   127  func (dmError *DmError) addDetail(detail string) *DmError {
   128  	dmError.detail = detail
   129  	return dmError
   130  }
   131  func (dmError *DmError) addDetailln(detail string) *DmError {
   132  	return dmError.addDetail("\n" + detail)
   133  }