257 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #ifndef OBERROR_ERROR_H
 | |
| #define OBERROR_ERROR_H
 | |
| 
 | |
| #include "share/ob_errno.h"
 | |
| #include "os_errno.h"
 | |
| #include <iostream>
 | |
| #include <cstdio>
 | |
| using namespace oceanbase::common;
 | |
| 
 | |
| // code error print define
 | |
| #define ERROR_PRINT(fmt, ...) printf("%s[%d]-<%s>: " #fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
 | |
| 
 | |
| enum Fac {
 | |
|   ORA,  // oracle mode // ora
 | |
|   PLS,  // oracle mode // pls
 | |
|   MY,   // mysql mode
 | |
|   NONE
 | |
| };
 | |
| 
 | |
| struct OSErrorInfo {
 | |
| public:
 | |
|   OSErrorInfo() : error_name_(nullptr), error_msg_(nullptr), error_code_(-1)
 | |
|   {}
 | |
|   virtual ~OSErrorInfo()
 | |
|   {}
 | |
|   void free_space()
 | |
|   {
 | |
|     if (nullptr != error_name_) {
 | |
|       free(error_name_);
 | |
|       error_name_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != error_msg_) {
 | |
|       free(error_msg_);
 | |
|       error_msg_ = nullptr;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   char* error_name_;
 | |
|   char* error_msg_;
 | |
|   int error_code_;
 | |
| };
 | |
| 
 | |
| struct MySQLErrorInfo {
 | |
| public:
 | |
|   MySQLErrorInfo()
 | |
|       : error_name_(nullptr),
 | |
|         error_msg_(nullptr),
 | |
|         mysql_errno_(-1),
 | |
|         sqlstate_(nullptr),
 | |
|         cause_(nullptr),
 | |
|         solution_(nullptr),
 | |
|         ob_error_(-1)
 | |
|   {}
 | |
|   virtual ~MySQLErrorInfo()
 | |
|   {}
 | |
|   void free_space()
 | |
|   {
 | |
|     if (nullptr != error_name_) {
 | |
|       free(error_name_);
 | |
|       error_name_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != error_msg_) {
 | |
|       free(error_msg_);
 | |
|       error_msg_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != sqlstate_) {
 | |
|       free(sqlstate_);
 | |
|       sqlstate_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != cause_) {
 | |
|       free(cause_);
 | |
|       cause_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != solution_) {
 | |
|       free(solution_);
 | |
|       solution_ = nullptr;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   char* error_name_;
 | |
|   char* error_msg_;
 | |
|   int mysql_errno_;
 | |
|   char* sqlstate_;
 | |
|   char* cause_;
 | |
|   char* solution_;
 | |
|   int ob_error_;
 | |
| };
 | |
| 
 | |
| struct OracleErrorInfo {
 | |
| public:
 | |
|   OracleErrorInfo()
 | |
|       : error_name_(nullptr),
 | |
|         error_msg_(nullptr),
 | |
|         cause_(nullptr),
 | |
|         solution_(nullptr),
 | |
|         facility_(NONE),
 | |
|         error_code_(-1),
 | |
|         ob_error_(-1)
 | |
|   {}
 | |
|   virtual ~OracleErrorInfo()
 | |
|   {}
 | |
|   void free_space()
 | |
|   {
 | |
|     if (nullptr != error_name_) {
 | |
|       free(error_name_);
 | |
|       error_name_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != error_msg_) {
 | |
|       free(error_msg_);
 | |
|       error_msg_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != cause_) {
 | |
|       free(cause_);
 | |
|       cause_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != solution_) {
 | |
|       free(solution_);
 | |
|       solution_ = nullptr;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   char* error_name_;
 | |
|   char* error_msg_;
 | |
|   char* cause_;
 | |
|   char* solution_;
 | |
|   Fac facility_;
 | |
|   int error_code_;
 | |
|   int ob_error_;
 | |
| };
 | |
| 
 | |
| struct OBErrorInfo {
 | |
| public:
 | |
|   OBErrorInfo() : error_name_(nullptr), error_msg_(nullptr), cause_(nullptr), solution_(nullptr), error_code_(-1)
 | |
|   {}
 | |
|   virtual ~OBErrorInfo()
 | |
|   {}
 | |
|   void free_space()
 | |
|   {
 | |
|     if (nullptr != error_name_) {
 | |
|       free(error_name_);
 | |
|       error_name_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != error_msg_) {
 | |
|       free(error_msg_);
 | |
|       error_msg_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != cause_) {
 | |
|       free(cause_);
 | |
|       cause_ = nullptr;
 | |
|     }
 | |
|     if (nullptr != solution_) {
 | |
|       free(solution_);
 | |
|       solution_ = nullptr;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   char* error_name_;
 | |
|   char* error_msg_;
 | |
|   char* cause_;
 | |
|   char* solution_;
 | |
|   int error_code_;
 | |
| };
 | |
| 
 | |
| // The length of the second dimension, in order to solve the conflict of multiple identical error codes
 | |
| constexpr int OB_MAX_SAME_ERROR_COUNT = 10;
 | |
| constexpr int ORACLE_SPECIAL_ERROR_CODE = 600;
 | |
| constexpr int ORACLE_MAX_ERROR_CODE = 65535;
 | |
| constexpr int ORACLE_MSG_PREFIX = 11;  // strlen("ORA-00000: ")
 | |
| constexpr float OB_ERROR_VERSION = 1.0;
 | |
| 
 | |
| static const char* facility_str[NONE] = {"ORA", "PLS", "MY"};
 | |
| 
 | |
| class ObErrorInfoMgr {
 | |
| public:
 | |
|   ObErrorInfoMgr();
 | |
|   virtual ~ObErrorInfoMgr();
 | |
| 
 | |
|   bool insert_os_error(const char* name, const char* msg, int error_code);
 | |
|   void print_os_error();
 | |
|   bool is_os_error_exist()
 | |
|   {
 | |
|     return 0 < os_error_count_;
 | |
|   }
 | |
| 
 | |
|   bool insert_mysql_error(const char* name, const char* msg, int mysql_errno, const char* sqlstate, const char* cause,
 | |
|       const char* solution, int ob_error);
 | |
|   void print_mysql_error();
 | |
|   bool is_mysql_error_exist()
 | |
|   {
 | |
|     return 0 < mysql_error_count_;
 | |
|   }
 | |
| 
 | |
|   bool insert_oracle_error(const char* name, const char* msg, const char* cause, const char* solution, Fac facility,
 | |
|       int error_code, int ob_error);
 | |
|   void print_oracle_error();
 | |
|   bool is_oracle_error_exist()
 | |
|   {
 | |
|     return 0 < oracle_error_count_;
 | |
|   }
 | |
| 
 | |
|   bool insert_ob_error(const char* name, const char* msg, const char* cause, const char* solution, int error_code);
 | |
|   void print_ob_error();
 | |
|   bool is_ob_error_exist()
 | |
|   {
 | |
|     return 0 < ob_error_count_;
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   int os_error_count_;
 | |
|   OSErrorInfo os_error_[OS_MAX_SAME_ERROR_COUNT];
 | |
|   int mysql_error_count_;
 | |
|   MySQLErrorInfo mysql_error_[OB_MAX_SAME_ERROR_COUNT];
 | |
|   int oracle_error_count_;
 | |
|   OracleErrorInfo oracle_error_[OB_MAX_SAME_ERROR_COUNT];
 | |
|   int ob_error_count_;
 | |
|   OBErrorInfo ob_error_[OB_MAX_SAME_ERROR_COUNT];
 | |
| };
 | |
| 
 | |
| // oracle error code -> ob error map // Maximum number of identical error codes is OB_MAX_SAME_ERROR_COUNT
 | |
| static int g_oracle_ora[ORACLE_MAX_ERROR_CODE][OB_MAX_SAME_ERROR_COUNT];
 | |
| static int g_oracle_pls[ORACLE_MAX_ERROR_CODE][OB_MAX_SAME_ERROR_COUNT];
 | |
| // mysql error code -> ob error map // Maximum number of identical error codes is OB_MAX_SAME_ERROR_COUNT
 | |
| static int g_mysql_error[OB_MAX_ERROR_CODE][OB_MAX_SAME_ERROR_COUNT];
 | |
| // os error code -> ob error map // Maximum number of identical error codes is OS_MAX_SAME_ERROR_COUNT
 | |
| static int g_os_error[OS_MAX_ERROR_CODE][OS_MAX_SAME_ERROR_COUNT];
 | |
| 
 | |
| // adder
 | |
| bool add_os_info(int error_code, ObErrorInfoMgr* mgr);
 | |
| bool add_ob_info(int error_code, ObErrorInfoMgr* mgr);
 | |
| bool add_oracle_info(Fac oracle_facility, int error_code, int argument, ObErrorInfoMgr* mgr);
 | |
| bool add_mysql_info(int error_code, ObErrorInfoMgr* mgr);
 | |
| 
 | |
| // parser
 | |
| void parse_error_code(const char* argv, int& error_code);
 | |
| void parse_facility(const char* argv, Fac& facility);
 | |
| bool parse_param(int args, char* argv[]);
 | |
| 
 | |
| // printer
 | |
| bool print_error_info(Fac facility, int error_code, int argument);
 | |
| 
 | |
| // init
 | |
| bool init_global_info();
 | |
| 
 | |
| #endif /* OBERROR_ERROR_H */
 | 
