github.com/wanlay/gorm-dm8@v1.0.5/dmr/za.go (about)

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