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  }