diff options
author | tomas@mc05.(none) <> | 2004-05-05 11:29:56 +0200 |
---|---|---|
committer | tomas@mc05.(none) <> | 2004-05-05 11:29:56 +0200 |
commit | 420814fa18deba26b35b58126dc63b07f9ea50d0 (patch) | |
tree | 89ab1f0c13b8d76de8b53c55dfa0716b06f6d02b /ndb | |
parent | 23d4741042935be4785c1d7c3e64329418f13d2d (diff) | |
download | mariadb-git-420814fa18deba26b35b58126dc63b07f9ea50d0.tar.gz |
Restructure of ndb error
Diffstat (limited to 'ndb')
-rw-r--r-- | ndb/include/ndbapi/NdbError.hpp | 58 | ||||
-rw-r--r-- | ndb/include/ndbapi/ndberror.h | 100 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/backup/restore/Makefile | 6 | ||||
-rw-r--r-- | ndb/src/ndbapi/Makefile | 1 | ||||
-rw-r--r-- | ndb/src/ndbapi/NdbErrorOut.cpp | 65 | ||||
-rw-r--r-- | ndb/src/ndbapi/Ndberror.cpp | 596 | ||||
-rw-r--r-- | ndb/src/ndbapi/ndberror.c | 596 |
7 files changed, 783 insertions, 639 deletions
diff --git a/ndb/include/ndbapi/NdbError.hpp b/ndb/include/ndbapi/NdbError.hpp index b08dd1041b2..2bcc3cee983 100644 --- a/ndb/include/ndbapi/NdbError.hpp +++ b/ndb/include/ndbapi/NdbError.hpp @@ -17,6 +17,8 @@ #ifndef NDB_ERROR_HPP #define NDB_ERROR_HPP +#include <ndberror.h> + /** * @struct NdbError * @brief Contains error information @@ -51,7 +53,7 @@ struct NdbError { * The error code indicate success<br> * (Includes classification: NdbError::NoError) */ - Success = 0, + Success = ndberror_st_success, /** * The error code indicates a temporary error. @@ -61,7 +63,7 @@ struct NdbError { * NdbError::OverloadError, NdbError::NodeShutdown * and NdbError::TimeoutExpired.) */ - TemporaryError = 1, + TemporaryError = ndberror_st_temporary, /** * The error code indicates a permanent error.<br> @@ -71,14 +73,14 @@ struct NdbError { * NdbError::UserDefinedError, NdbError::InternalError, and, * NdbError::FunctionNotImplemented.) */ - PermanentError = 2, + PermanentError = ndberror_st_permanent, /** * The result/status is unknown.<br> * (Includes classifications: NdbError::UnknownResultError, and * NdbError::UnknownErrorCode.) */ - UnknownResult = 3 + UnknownResult = ndberror_st_unknown }; /** @@ -88,85 +90,85 @@ struct NdbError { /** * Success. No error occurred. */ - NoError = 0, + NoError = ndberror_cl_none, /** * Error in application program. */ - ApplicationError = 1, + ApplicationError = ndberror_cl_application, /** * Read operation failed due to missing record. */ - NoDataFound = 2, + NoDataFound = ndberror_cl_no_data_found, /** * E.g. inserting a tuple with a primary key already existing * in the table. */ - ConstraintViolation = 3, + ConstraintViolation = ndberror_cl_constraint_violation, /** * Error in creating table or usage of table. */ - SchemaError = 4, + SchemaError = ndberror_cl_schema_error, /** * Error occurred in interpreted program. */ - UserDefinedError = 5, + UserDefinedError = ndberror_cl_user_defined, /** * E.g. insufficient memory for data or indexes. */ - InsufficientSpace = 6, + InsufficientSpace = ndberror_cl_insufficient_space, /** * E.g. too many active transactions. */ - TemporaryResourceError = 7, + TemporaryResourceError = ndberror_cl_temporary_resource, /** * Temporary failures which are probably inflicted by a node * recovery in progress. Examples: information sent between * application and NDB lost, distribution change. */ - NodeRecoveryError = 8, + NodeRecoveryError = ndberror_cl_node_recovery, /** * E.g. out of log file space. */ - OverloadError = 9, + OverloadError = ndberror_cl_overload, /** * Timeouts, often inflicted by deadlocks in NDB. */ - TimeoutExpired = 10, + TimeoutExpired = ndberror_cl_timeout_expired, /** * Is is unknown whether the transaction was committed or not. */ - UnknownResultError = 11, + UnknownResultError = ndberror_cl_unknown_result, /** * A serious error in NDB has occurred. */ - InternalError = 12, + InternalError = ndberror_cl_internal_error, /** * A function used is not yet implemented. */ - FunctionNotImplemented = 13, + FunctionNotImplemented = ndberror_cl_function_not_implemented, /** * Error handler could not determine correct error code. */ - UnknownErrorCode = 14, + UnknownErrorCode = ndberror_cl_unknown_error_code, /** * Node shutdown */ - NodeShutdown = 15 + NodeShutdown = ndberror_cl_node_shutdown }; /** @@ -204,6 +206,22 @@ struct NdbError { message = 0; details = 0; } + NdbError(ndberror_struct ndberror){ + status = (NdbError::Status) ndberror.status; + classification = (NdbError::Classification) ndberror.classification; + code = ndberror.code; + message = ndberror.message; + details = ndberror.details; + } + operator ndberror_struct() const { + ndberror_struct ndberror; + ndberror.status = (ndberror_status_enum) status; + ndberror.classification = (ndberror_classification_enum) classification; + ndberror.code = code; + ndberror.message = message; + ndberror.details = details; + return ndberror; + } }; class NdbOut& operator <<(class NdbOut&, const NdbError &); diff --git a/ndb/include/ndbapi/ndberror.h b/ndb/include/ndbapi/ndberror.h new file mode 100644 index 00000000000..2a18e1eb913 --- /dev/null +++ b/ndb/include/ndbapi/ndberror.h @@ -0,0 +1,100 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef NDBERROR_H +#define NDBERROR_H + +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum +{ + ndberror_st_success = 0, + ndberror_st_temporary = 1, + ndberror_st_permanent = 2, + ndberror_st_unknown = 3 +} ndberror_status_enum; + +typedef enum +{ + ndberror_cl_none = 0, + ndberror_cl_application = 1, + ndberror_cl_no_data_found = 2, + ndberror_cl_constraint_violation = 3, + ndberror_cl_schema_error = 4, + ndberror_cl_user_defined = 5, + ndberror_cl_insufficient_space = 6, + ndberror_cl_temporary_resource = 7, + ndberror_cl_node_recovery = 8, + ndberror_cl_overload = 9, + ndberror_cl_timeout_expired = 10, + ndberror_cl_unknown_result = 11, + ndberror_cl_internal_error = 12, + ndberror_cl_function_not_implemented = 13, + ndberror_cl_unknown_error_code = 14, + ndberror_cl_node_shutdown = 15 +} ndberror_classification_enum; + + +typedef struct { + + /** + * Error status. + */ + ndberror_status_enum status; + + /** + * Error type + */ + ndberror_classification_enum classification; + + /** + * Error code + */ + int code; + + /** + * Error message + */ + const char * message; + + /** + * The detailed description. This is extra information regarding the + * error which is not included in the error message. + * + * @note Is NULL when no details specified + */ + char * details; + +} ndberror_struct; + + +typedef ndberror_status_enum ndberror_status; +typedef ndberror_classification_enum ndberror_classification; + +const char *ndberror_status_message(const ndberror_status); +const char *ndberror_classification_message(const ndberror_classification); +void ndberror_update(ndberror_struct *); +int ndb_error_string(int err_no, char *str, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ndb/src/kernel/blocks/backup/restore/Makefile b/ndb/src/kernel/blocks/backup/restore/Makefile index f99e3e3da0d..4c884525d73 100644 --- a/ndb/src/kernel/blocks/backup/restore/Makefile +++ b/ndb/src/kernel/blocks/backup/restore/Makefile @@ -1,12 +1,12 @@ include .defs.mk -TYPE := ndbapi ndbapiclient +TYPE := * BIN_TARGET := restore BIN_TARGET_LIBS := -BIN_TARGET_ARCHIVES := NDB_API general +BIN_TARGET_ARCHIVES := NDB_API -CCFLAGS_LOC = -I.. -I$(NDB_TOP)/src/ndbapi +CCFLAGS_LOC = -I.. -I$(NDB_TOP)/src/ndbapi -I$(NDB_TOP)/include/ndbapi -I$(NDB_TOP)/include/util -I$(NDB_TOP)/include/portlib -I$(NDB_TOP)/include/kernel #ifneq ($(MYSQLCLUSTER_TOP),) #CCFLAGS_LOC +=-I$(MYSQLCLUSTER_TOP)/include -D USE_MYSQL diff --git a/ndb/src/ndbapi/Makefile b/ndb/src/ndbapi/Makefile index 23a5cb946d1..328bb5e3741 100644 --- a/ndb/src/ndbapi/Makefile +++ b/ndb/src/ndbapi/Makefile @@ -32,6 +32,7 @@ SOURCES = \ Ndbif.cpp \ Ndbinit.cpp \ Ndberror.cpp \ + ndberror.c \ NdbErrorOut.cpp \ NdbConnection.cpp \ NdbConnectionScan.cpp \ diff --git a/ndb/src/ndbapi/NdbErrorOut.cpp b/ndb/src/ndbapi/NdbErrorOut.cpp index 286f8216bf7..01d5f63599b 100644 --- a/ndb/src/ndbapi/NdbErrorOut.cpp +++ b/ndb/src/ndbapi/NdbErrorOut.cpp @@ -15,7 +15,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <NdbError.hpp> #include <NdbStdio.h> #include <stdarg.h> @@ -23,10 +22,7 @@ #include <NdbOut.hpp> -const char *ndberror_status_message(const NdbError::Status & status); -const char *ndberror_classification_message(const NdbError::Classification & classification); -int ndb_error_string(int err_no, char *str, size_t size); -void ndberror_update(const NdbError & _err); +#include <NdbError.hpp> /** * operators @@ -42,66 +38,11 @@ operator<<(NdbOut & out, const NdbError & error){ NdbOut & operator<<(NdbOut & out, const NdbError::Status & status){ - return out << ndberror_status_message(status); + return out << ndberror_status_message((ndberror_status)status); } NdbOut & operator<<(NdbOut & out, const NdbError::Classification & classification){ - return out << ndberror_classification_message(classification); -} - -/****************************************************** - * - */ -#include "NdbImpl.hpp" -#include "NdbDictionaryImpl.hpp" -#include <NdbSchemaCon.hpp> -#include <NdbOperation.hpp> -#include <NdbConnection.hpp> - - -const -NdbError & -Ndb::getNdbError(int code){ - theError.code = code; - ndberror_update(theError); - return theError; + return out << ndberror_classification_message((ndberror_classification)classification); } -const -NdbError & -Ndb::getNdbError() const { - ndberror_update(theError); - return theError; -} - -const -NdbError & -NdbDictionaryImpl::getNdbError() const { - ndberror_update(m_error); - return m_error; -} - -const -NdbError & -NdbConnection::getNdbError() const { - ndberror_update(theError); - return theError; -} - -const -NdbError & -NdbOperation::getNdbError() const { - ndberror_update(theError); - return theError; -} - -const -NdbError & -NdbSchemaCon::getNdbError() const { - ndberror_update(theError); - return theError; -} - - - diff --git a/ndb/src/ndbapi/Ndberror.cpp b/ndb/src/ndbapi/Ndberror.cpp index f90d18fc68a..faa2f00cfce 100644 --- a/ndb/src/ndbapi/Ndberror.cpp +++ b/ndb/src/ndbapi/Ndberror.cpp @@ -16,572 +16,60 @@ #include <NdbError.hpp> -#include <stdio.h> -#include <stdarg.h> -#include <assert.h> +#include "NdbImpl.hpp" +#include "NdbDictionaryImpl.hpp" +#include <NdbSchemaCon.hpp> +#include <NdbOperation.hpp> +#include <NdbConnection.hpp> -struct ErrorBundle { - int code; - NdbError::Classification classification; - const char * message; -}; -/** - * Shorter names in table below - */ -static const NdbError::Classification NE = NdbError::NoError; -static const NdbError::Classification AE = NdbError::ApplicationError; -static const NdbError::Classification ND = NdbError::NoDataFound; -static const NdbError::Classification CV = NdbError::ConstraintViolation; -static const NdbError::Classification SE = NdbError::SchemaError; -static const NdbError::Classification UD = NdbError::UserDefinedError; - -static const NdbError::Classification IS = NdbError::InsufficientSpace; -static const NdbError::Classification TR = NdbError::TemporaryResourceError; -static const NdbError::Classification NR = NdbError::NodeRecoveryError; -static const NdbError::Classification OL = NdbError::OverloadError; -static const NdbError::Classification TO = NdbError::TimeoutExpired; -static const NdbError::Classification NS = NdbError::NodeShutdown; - -static const NdbError::Classification UR = NdbError::UnknownResultError; - -static const NdbError::Classification IE = NdbError::InternalError; -static const NdbError::Classification NI = NdbError::FunctionNotImplemented; -static const NdbError::Classification UE = NdbError::UnknownErrorCode; - -static const char* empty_string = ""; - -static -const -ErrorBundle ErrorCodes[] = { - /** - * No error - */ - { 0, NE, "No error" }, - - /** - * NoDataFound - */ - { 626, ND, "Tuple did not exist" }, - - /** - * ConstraintViolation - */ - { 630, CV, "Tuple already existed when attempting to insert" }, - { 840, CV, "Trying to set a NOT NULL attribute to NULL" }, - { 893, CV, "Constraint violation e.g. duplicate value in unique index" }, - - /** - * Node recovery errors - */ - { 286, NR, "Node failure caused abort of transaction" }, - { 250, NR, "Node where lock was held crashed, restart scan transaction" }, - { 499, NR, "Scan take over error, restart scan transaction" }, - { 1204, NR, "Temporary failure, distribution changed" }, - { 4002, NR, "Send to NDB failed" }, - { 4010, NR, "Node failure caused abort of transaction" }, - { 4025, NR, "Node failure caused abort of transaction" }, - { 4027, NR, "Node failure caused abort of transaction" }, - { 4028, NR, "Node failure caused abort of transaction" }, - { 4029, NR, "Node failure caused abort of transaction" }, - { 4031, NR, "Node failure caused abort of transaction" }, - { 4033, NR, "Send to NDB failed" }, - - /** - * Node shutdown - */ - { 280, NS, "Transaction aborted due to node shutdown" }, - // This scan trans had an active fragment scan in a LQH which have crashed - { 270, NS, "Transaction aborted due to node shutdown" }, - { 1223, NS, "Read operation aborted due to node shutdown" }, - { 4023, NS, "Transaction aborted due to node shutdown" }, - { 4030, NS, "Transaction aborted due to node shutdown" }, - { 4034, NS, "Transaction aborted due to node shutdown" }, - - - - /** - * Unknown result - */ - { 4008, UR, "Receive from NDB failed" }, - { 4009, UR, "Cluster Failure" }, - { 4012, UR, - "Time-out, most likely caused by simple read or cluster failure" }, - { 4024, UR, - "Time-out, most likely caused by simple read or cluster failure" }, - { 4115, UR, - "Transaction was committed but all read information was not " - "received due to node crash" }, - - /** - * TemporaryResourceError - */ - { 217, TR, "217" }, - { 218, TR, "218" }, - { 219, TR, "219" }, - { 233, TR, "Out of operation records in transaction coordinator" }, - { 275, TR, "275" }, - { 279, TR, "Out of transaction markers in transaction coordinator" }, - { 414, TR, "414" }, - { 418, TR, "Out of transaction buffers in LQH" }, - { 419, TR, "419" }, - { 245, TR, "Too many active scans" }, - { 488, TR, "Too many active scans" }, - { 490, TR, "Too many active scans" }, - { 805, TR, "Out of attrinfo records in tuple manager" }, - { 830, TR, "Out of add fragment operation records" }, - { 873, TR, "Out of attrinfo records for scan in tuple manager" }, - { 1217, TR, "1217" }, - { 1219, TR, "Out of operation records in local data manager" }, - { 1220, TR, "1220" }, - { 1222, TR, "Out of transaction markers in LQH" }, - { 4021, TR, "Out of Send Buffer space in NDB API" }, - { 4022, TR, "Out of Send Buffer space in NDB API" }, - { 4032, TR, "Out of Send Buffer space in NDB API" }, - - /** - * InsufficientSpace - */ - { 623, IS, "623" }, - { 624, IS, "624" }, - { 625, IS, "Out of memory in Ndb Kernel, index part" }, - { 826, IS, "826" }, - { 827, IS, "Out of memory in Ndb Kernel, data part" }, - { 832, IS, "832" }, - - /** - * TimeoutExpired - */ - { 266, TO, "Time-out in NDB, probably caused by deadlock" }, - { 274, TO, "Time-out in NDB, probably caused by deadlock" }, // Scan trans timeout - { 296, TO, "Time-out in NDB, probably caused by deadlock" }, // Scan trans timeout - { 297, TO, "Time-out in NDB, probably caused by deadlock" }, // Scan trans timeout, temporary!! - { 237, TO, "Transaction had timed out when trying to commit it" }, - - - /** - * OverloadError - */ - { 410, OL, "Out of log file space temporarily" }, - { 677, OL, "Index UNDO buffers overloaded" }, - { 891, OL, "Data UNDO buffers overloaded" }, - { 1221, OL, "REDO log buffers overloaded" }, - { 4006, AE, "Connect failure - out of connection objects" }, - - - - /** - * Internal errors - */ - { 892, IE, "Inconsistent hash index. The index needs to be dropped and recreated" }, - { 895, IE, "Inconsistent ordered index. The index needs to be dropped and recreated" }, - { 202, IE, "202" }, - { 203, IE, "203" }, - { 207, IE, "207" }, - { 208, IE, "208" }, - { 209, IE, "Communication problem, signal error" }, - { 220, IE, "220" }, - { 230, IE, "230" }, - { 232, IE, "232" }, - { 238, IE, "238" }, - { 271, IE, "Simple Read transaction without any attributes to read" }, - { 272, IE, "Update operation without any attributes to update" }, - { 276, IE, "276" }, - { 277, IE, "277" }, - { 278, IE, "278" }, - { 287, IE, "Index corrupted" }, - { 631, IE, "631" }, - { 632, IE, "632" }, - { 702, IE, "Request to non-master" }, - { 706, IE, "Inconsistency during table creation" }, - { 809, IE, "809" }, - { 812, IE, "812" }, - { 829, IE, "829" }, - { 833, IE, "833" }, - { 839, IE, "Illegal null attribute" }, - { 871, IE, "871" }, - { 882, IE, "882" }, - { 883, IE, "883" }, - { 887, IE, "887" }, - { 888, IE, "888" }, - { 890, IE, "890" }, - { 4000, IE, "MEMORY ALLOCATION ERROR" }, - { 4001, IE, "Signal Definition Error" }, - { 4005, IE, "Internal Error in NdbApi" }, - { 4011, IE, "Internal Error in NdbApi" }, - { 4107, IE, "Simple Transaction and Not Start" }, - { 4108, IE, "Faulty operation type" }, - { 4109, IE, "Faulty primary key attribute length" }, - { 4110, IE, "Faulty length in ATTRINFO signal" }, - { 4111, IE, "Status Error in NdbConnection" }, - { 4113, IE, "Too many operations received" }, - { 4320, IE, "Cannot use the same object twice to create table" }, - { 4321, IE, "Trying to start two schema transactions" }, - { 4344, IE, "Only DBDICT and TRIX can send requests to TRIX" }, - { 4345, IE, "TRIX block is not available yet, probably due to node failure" }, - { 4346, IE, "Internal error at index create/build" }, - { 4347, IE, "Bad state at alter index" }, - { 4348, IE, "Inconsistency detected at alter index" }, - { 4349, IE, "Inconsistency detected at index usage" }, - - /** - * Application error - */ - { 823, AE, "Too much attrinfo from application in tuple manager" }, - { 876, AE, "876" }, - { 877, AE, "877" }, - { 878, AE, "878" }, - { 879, AE, "879" }, - { 884, AE, "Stack overflow in interpreter" }, - { 885, AE, "Stack underflow in interpreter" }, - { 886, AE, "More than 65535 instructions executed in interpreter" }, - { 4256, AE, "Must call Ndb::init() before this function" }, - { 880, AE, "Tried to read too much - too many getValue calls" }, - { 4257, AE, "Tried to read too much - too many getValue calls" }, - - /** - * Scan application errors - */ - { 242, AE, "Zero concurrency in scan"}, - { 244, AE, "Too high concurrency in scan"}, - { 269, AE, "No condition and attributes to read in scan"}, - { 4600, AE, "Transaction is already started"}, - { 4601, AE, "Transaction is not started"}, - { 4602, AE, "You must call getNdbOperation before executeScan" }, - { 4603, AE, "There can only be ONE operation in a scan transaction" }, - { 4604, AE, "takeOverScanOp, opType must be UpdateRequest or DeleteRequest" }, - { 4605, AE, "You may only call openScanRead or openScanExclusive once for each operation"}, - { 4607, AE, "There may only be one operation in a scan transaction"}, - { 4608, AE, "You can not takeOverScan unless you have used openScanExclusive"}, - { 4609, AE, "You must call nextScanResult before trying to takeOverScan"}, - { 4232, AE, "Parallelism can only be between 1 and 240" }, - { 290, AE, "Scan not started or has been closed by kernel due to timeout" }, - - /** - * SchemaError - */ - { 701, SE, "System busy with other schema operation" }, - { 703, SE, "Invalid table format" }, - { 704, SE, "Attribute name too long" }, - { 705, SE, "Table name too long" }, - { 707, SE, "No more table metadata records" }, - { 708, SE, "No more attribute metadata records" }, - { 709, SE, "No such table existed" }, - { 721, SE, "Table or index with given name already exists" }, - { 723, SE, "No such table existed" }, - { 736, SE, "Wrong attribute size" }, - { 737, SE, "Attribute array size too big" }, - { 738, SE, "Record too big" }, - { 739, SE, "Unsupported primary key length" }, - { 740, SE, "Nullable primary key not supported" }, - { 741, SE, "Unsupported alter table" }, - { 241, SE, "Invalid schema object version" }, - { 283, SE, "Table is being dropped" }, - { 284, SE, "Table not defined in transaction coordinator" }, - { 285, SE, "Unknown table error in transaction coordinator" }, - { 881, SE, "Unable to create table, out of data pages" }, - { 1225, SE, "Table not defined in local query handler" }, - { 1226, SE, "Table is being dropped" }, - { 1228, SE, "Cannot use drop table for drop index" }, - { 1229, SE, "Too long frm data supplied" }, - - /** - * FunctionNotImplemented - */ - { 4003, NI, "Function not implemented yet" }, - - /** - * Still uncategorized - */ - { 720, AE, "Attribute name reused in table definition" }, - { 4004, AE, "Attribute name not found in the Table" }, - - { 4100, AE, "Status Error in NDB" }, - { 4101, AE, "No connections to NDB available and connect failed" }, - { 4102, AE, "Type in NdbTamper not correct" }, - { 4103, AE, "No schema connections to NDB available and connect failed" }, - { 4104, AE, "Ndb Init in wrong state, destroy Ndb object and create a new" }, - { 4105, AE, "Too many Ndb objects" }, - { 4106, AE, "All Not NULL attribute have not been defined" }, - { 4114, AE, "Transaction is already completed" }, - { 4116, AE, "Operation was not defined correctly, probably missing a key" }, - { 4117, AE, "Could not start transporter, configuration error"}, - { 4118, AE, "Parameter error in API call" }, - { 4300, AE, "Tuple Key Type not correct" }, - { 4301, AE, "Fragment Type not correct" }, - { 4302, AE, "Minimum Load Factor not correct" }, - { 4303, AE, "Maximum Load Factor not correct" }, - { 4304, AE, "Maximum Load Factor smaller than Minimum" }, - { 4305, AE, "K value must currently be set to 6" }, - { 4306, AE, "Memory Type not correct" }, - { 4307, AE, "Invalid table name" }, - { 4308, AE, "Attribute Size not correct" }, - { 4309, AE, "Fixed array too large, maximum 64000 bytes" }, - { 4310, AE, "Attribute Type not correct" }, - { 4311, AE, "Storage Mode not correct" }, - { 4312, AE, "Null Attribute Type not correct" }, - { 4313, AE, "Index only storage for non-key attribute" }, - { 4314, AE, "Storage Type of attribute not correct" }, - { 4315, AE, "No more key attributes allowed after defining variable length key attribute" }, - { 4316, AE, "Key attributes are not allowed to be NULL attributes" }, - { 4317, AE, "Too many primary keys defined in table" }, - { 4318, AE, "Invalid attribute name" }, - { 4319, AE, "createAttribute called at erroneus place" }, - { 4322, AE, "Attempt to define distribution key when not prepared to" }, - { 4323, AE, "Distribution Key set on table but not defined on first attribute" }, - { 4324, AE, "Attempt to define distribution group when not prepared to" }, - { 4325, AE, "Distribution Group set on table but not defined on first attribute" }, - { 4326, AE, "Distribution Group with erroneus number of bits" }, - { 4327, AE, "Distribution Group with 1 byte attribute is not allowed" }, - { 4328, AE, "Disk memory attributes not yet supported" }, - { 4329, AE, "Variable stored attributes not yet supported" }, - { 4330, AE, "Table names limited to 127 bytes" }, - { 4331, AE, "Attribute names limited to 31 bytes" }, - { 4332, AE, "Maximum 2000 attributes in a table" }, - { 4333, AE, "Maximum 4092 bytes long keys allowed" }, - { 4334, AE, "Attribute properties length limited to 127 bytes" }, - - { 4400, AE, "Status Error in NdbSchemaCon" }, - { 4401, AE, "Only one schema operation per schema transaction" }, - { 4402, AE, "No schema operation defined before calling execute" }, - - { 4500, AE, "Cannot handle more than 2048 tables in NdbApi" }, - { 4501, AE, "Insert in hash table failed when getting table information from Ndb" }, - { 4502, AE, "GetValue not allowed in Update operation" }, - { 4503, AE, "GetValue not allowed in Insert operation" }, - { 4504, AE, "SetValue not allowed in Read operation" }, - { 4505, AE, "NULL value not allowed in primary key search" }, - { 4506, AE, "Missing getValue/setValue when calling execute" }, - { 4507, AE, "Missing operation request when calling execute" }, - - { 4200, AE, "Status Error when defining an operation" }, - { 4201, AE, "Variable Arrays not yet supported" }, - { 4202, AE, "Set value on tuple key attribute is not allowed" }, - { 4203, AE, "Trying to set a NOT NULL attribute to NULL" }, - { 4204, AE, "Set value and Read/Delete Tuple is incompatible" }, - { 4205, AE, "No Key attribute used to define tuple" }, - { 4206, AE, "Not allowed to equal key attribute twice" }, - { 4207, AE, "Key size is limited to 4092 bytes" }, - { 4208, AE, "Trying to read a non-stored attribute" }, - { 4209, AE, "Length parameter in equal/setValue is incorrect" }, - { 4210, AE, "Ndb sent more info than the length he specified" }, - { 4211, AE, "Inconsistency in list of NdbRecAttr-objects" }, - { 4212, AE, "Ndb reports NULL value on Not NULL attribute" }, - { 4213, AE, "Not all data of an attribute has been received" }, - { 4214, AE, "Not all attributes have been received" }, - { 4215, AE, "More data received than reported in TCKEYCONF message" }, - { 4216, AE, "More than 8052 bytes in setValue cannot be handled" }, - { 4217, AE, "It is not allowed to increment any other than unsigned ints" }, - { 4218, AE, "Currently not allowed to increment NULL-able attributes" }, - { 4219, AE, "Maximum size of interpretative attributes are 64 bits" }, - { 4220, AE, "Maximum size of interpretative attributes are 64 bits" }, - { 4221, AE, "Trying to jump to a non-defined label" }, - { 4222, AE, "Label was not found, internal error" }, - { 4223, AE, "Not allowed to create jumps to yourself" }, - { 4224, AE, "Not allowed to jump to a label in a different subroutine" }, - { 4225, AE, "All primary keys defined, call setValue/getValue"}, - { 4226, AE, "Bad number when defining a label" }, - { 4227, AE, "Bad number when defining a subroutine" }, - { 4228, AE, "Illegal interpreter function in scan definition" }, - { 4229, AE, "Illegal register in interpreter function definition" }, - { 4230, AE, "Illegal state when calling getValue, probably not a read" }, - { 4231, AE, "Illegal state when calling interpreter routine" }, - { 4233, AE, "Calling execute (synchronous) when already prepared asynchronous transaction exists" }, - { 4234, AE, "Illegal to call setValue in this state" }, - { 4235, AE, "No callback from execute" }, - { 4236, AE, "Trigger name too long" }, - { 4237, AE, "Too many triggers" }, - { 4238, AE, "Trigger not found" }, - { 4239, AE, "Trigger with given name already exists"}, - { 4240, AE, "Unsupported trigger type"}, - { 4241, AE, "Index name too long" }, - { 4242, AE, "Too many indexes" }, - { 4243, AE, "Index not found" }, - { 4244, AE, "Index or table with given name already exists" }, - { 4245, AE, "Index attribute must be defined as stored, i.e. the StorageAttributeType must be defined as NormalStorageAttribute"}, - { 4246, AE, "Combined index attributes are not allowed to be NULL attributes" }, - { 4247, AE, "Illegal index/trigger create/drop/alter request" }, - { 4248, AE, "Trigger/index name invalid" }, - { 4249, AE, "Invalid table" }, - { 4250, AE, "Invalid index type or index logging option" }, - { 4251, AE, "Cannot create unique index, duplicate keys found" }, - { 4252, AE, "Failed to allocate space for index" }, - { 4253, AE, "Failed to create index table" }, - { 4254, AE, "Table not an index table" }, - { 4255, AE, "Hash index attributes must be specified in same order as table attributes" }, - { 4258, AE, "Cannot create unique index, duplicate attributes found in definition" }, - { 4259, AE, "Invalid set of range scan bounds" }, - { 4260, UD, "NdbScanFilter: Operator is not defined in NdbScanFilter::Group"}, - { 4261, UD, "NdbScanFilter: Column is NULL"}, - { 4262, UD, "NdbScanFilter: Condition is out of bounds"} - -}; - -static -const -int NbErrorCodes = sizeof(ErrorCodes)/sizeof(ErrorBundle); - -struct ErrorStatusMessage { - NdbError::Status status; - const char * message; -}; - -struct ErrorStatusClassification { - NdbError::Status status; - NdbError::Classification classification; - const char * message; -}; - -/** - * Mapping between classification and status - */ -static -const -ErrorStatusMessage StatusMessageMapping[] = { - { NdbError::Success, "Success"}, - { NdbError::PermanentError, "Permanent error"}, - { NdbError::TemporaryError, "Temporary error"}, - { NdbError::UnknownResult , "Unknown result"} -}; - -static -const -int NbStatus = sizeof(StatusMessageMapping)/sizeof(ErrorStatusMessage); - -static -const -ErrorStatusClassification StatusClassificationMapping[] = { - { NdbError::Success, NdbError::NoError, "No error"}, - { NdbError::PermanentError, NdbError::ApplicationError, "Application error"}, - { NdbError::PermanentError, NdbError::NoDataFound, "No data found"}, - { NdbError::PermanentError, NdbError::ConstraintViolation, "Constraint violation"}, - { NdbError::PermanentError, NdbError::SchemaError, "Schema error"}, - { NdbError::PermanentError, NdbError::UserDefinedError, "User defined error"}, - { NdbError::PermanentError, NdbError::InsufficientSpace, "Insufficient space"}, - - { NdbError::TemporaryError, NdbError::TemporaryResourceError, "Temporary Resource error"}, - { NdbError::TemporaryError, NdbError::NodeRecoveryError, "Node Recovery error"}, - { NdbError::TemporaryError, NdbError::OverloadError, "Overload error"}, - { NdbError::TemporaryError, NdbError::TimeoutExpired, "Timeout expired"}, - { NdbError::TemporaryError, NdbError::NodeShutdown, "Node shutdown"}, - - { NdbError::UnknownResult , NdbError::UnknownResultError, "Unknown result error"}, - { NdbError::UnknownResult , NdbError::UnknownErrorCode, "Unknown error code"}, - - { NdbError::PermanentError, NdbError::InternalError, "Internal error"}, - { NdbError::PermanentError, NdbError::FunctionNotImplemented, "Function not implemented"} -}; - -static -const -int NbClassification = sizeof(StatusClassificationMapping)/sizeof(ErrorStatusClassification); - -/** - * Complete all fields of an NdbError given the error code - * and details - */ -static -void -set(NdbError & error, int code, const char * details, ...){ - error.code = code; - - va_list ap; - va_start(ap, details); - vsnprintf(error.details, sizeof(error.details), details, ap); - va_end(ap); -} - - -void -ndberror_update(const NdbError & _err){ +static void +update(const NdbError & _err){ NdbError & error = (NdbError &) _err; - - bool found = false; - for(int i = 0; i<NbErrorCodes; i++){ - if(ErrorCodes[i].code == error.code){ - error.classification = ErrorCodes[i].classification; - error.message = ErrorCodes[i].message; - found = true; - break; - } - } - - if(!found){ - error.classification = NdbError::UnknownErrorCode; - error.message = "Unknown error code"; - } - - found = false; - for(int i = 0; i<NbClassification; i++){ - if(StatusClassificationMapping[i].classification == error.classification){ - error.status = StatusClassificationMapping[i].status; - found = true; - break; - } - } - if(!found){ - error.status = NdbError::UnknownResult; - } - - error.details = 0; + ndberror_struct ndberror = (ndberror_struct)error; + ndberror_update(&ndberror); + error = NdbError(ndberror); } -bool -checkErrorCodes(){ - for(int i = 0; i<NbErrorCodes; i++) - for(int j = i+1; j<NbErrorCodes; j++) - if(ErrorCodes[i].code == ErrorCodes[j].code){ - printf("ErrorCode %d is defined multiple times!!\n", - ErrorCodes[i].code); - assert(0); - } - - return true; +const +NdbError & +Ndb::getNdbError(int code){ + theError.code = code; + update(theError); + return theError; } -static const bool a = checkErrorCodes(); - -#if CHECK_ERRORCODES -int main(void){ - checkErrorCodes(); - return 0; +const +NdbError & +Ndb::getNdbError() const { + update(theError); + return theError; } -#endif -const char *ndberror_status_message(const NdbError::Status & status) -{ - for (int i= 0; i < NbStatus; i++) - if (StatusMessageMapping[i].status == status) - return StatusMessageMapping[i].message; - return empty_string; +const +NdbError & +NdbDictionaryImpl::getNdbError() const { + update(m_error); + return m_error; } -const char *ndberror_classification_message(const NdbError::Classification & classification) -{ - for (int i= 0; i < NbClassification; i++) - if (StatusClassificationMapping[i].classification == classification) - return StatusClassificationMapping[i].message; - return empty_string; +const +NdbError & +NdbConnection::getNdbError() const { + update(theError); + return theError; } -extern "C" { -int ndb_error_string(int err_no, char *str, size_t size) -{ - NdbError error; - int len= 0, tlen= 0; - - error.code = err_no; - ndberror_update(error); - - len+= snprintf(str+tlen, size-tlen, "%s", error.message); - tlen= len < size ? len : size; - len+= snprintf(str+tlen, size-tlen, ": "); - tlen= len < size ? len : size; - len+= snprintf(str+tlen, size-tlen, "%s", ndberror_status_message(error.status)); - tlen= len < size ? len : size; - len+= snprintf(str+tlen, size-tlen, ": "); - tlen= len < size ? len : size; - len+= snprintf(str+tlen, size-tlen, "%s", ndberror_classification_message(error.classification)); - return len; +const +NdbError & +NdbOperation::getNdbError() const { + update(theError); + return theError; } + +const +NdbError & +NdbSchemaCon::getNdbError() const { + update(theError); + return theError; } diff --git a/ndb/src/ndbapi/ndberror.c b/ndb/src/ndbapi/ndberror.c new file mode 100644 index 00000000000..bcd71475b0e --- /dev/null +++ b/ndb/src/ndbapi/ndberror.c @@ -0,0 +1,596 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#include <ndberror.h> +#include <stdio.h> +#include <stdarg.h> +#include <assert.h> + +typedef struct ErrorBundle { + int code; + ndberror_classification classification; + const char * message; +} ErrorBundle; + +/** + * Shorter names in table below + */ + +#define ST_S ndberror_st_success +#define ST_P ndberror_st_permanent +#define ST_T ndberror_st_temporary +#define ST_U ndberror_st_unknown + +#define NE ndberror_cl_none +#define AE ndberror_cl_application +#define ND ndberror_cl_no_data_found +#define CV ndberror_cl_constraint_violation +#define SE ndberror_cl_schema_error +#define UD ndberror_cl_user_defined + +#define IS ndberror_cl_insufficient_space +#define TR ndberror_cl_temporary_resource +#define NR ndberror_cl_node_recovery +#define OL ndberror_cl_overload +#define TO ndberror_cl_timeout_expired +#define NS ndberror_cl_node_shutdown + +#define UR ndberror_cl_unknown_result + +#define IE ndberror_cl_internal_error +#define NI ndberror_cl_function_not_implemented +#define UE ndberror_cl_unknown_error_code + +static const char* empty_string = ""; + +static +const +ErrorBundle ErrorCodes[] = { + /** + * No error + */ + { 0, NE, "No error" }, + + /** + * NoDataFound + */ + { 626, ND, "Tuple did not exist" }, + + /** + * ConstraintViolation + */ + { 630, CV, "Tuple already existed when attempting to insert" }, + { 840, CV, "Trying to set a NOT NULL attribute to NULL" }, + { 893, CV, "Constraint violation e.g. duplicate value in unique index" }, + + /** + * Node recovery errors + */ + { 286, NR, "Node failure caused abort of transaction" }, + { 250, NR, "Node where lock was held crashed, restart scan transaction" }, + { 499, NR, "Scan take over error, restart scan transaction" }, + { 1204, NR, "Temporary failure, distribution changed" }, + { 4002, NR, "Send to NDB failed" }, + { 4010, NR, "Node failure caused abort of transaction" }, + { 4025, NR, "Node failure caused abort of transaction" }, + { 4027, NR, "Node failure caused abort of transaction" }, + { 4028, NR, "Node failure caused abort of transaction" }, + { 4029, NR, "Node failure caused abort of transaction" }, + { 4031, NR, "Node failure caused abort of transaction" }, + { 4033, NR, "Send to NDB failed" }, + + /** + * Node shutdown + */ + { 280, NS, "Transaction aborted due to node shutdown" }, + /* This scan trans had an active fragment scan in a LQH which have crashed */ + { 270, NS, "Transaction aborted due to node shutdown" }, + { 1223, NS, "Read operation aborted due to node shutdown" }, + { 4023, NS, "Transaction aborted due to node shutdown" }, + { 4030, NS, "Transaction aborted due to node shutdown" }, + { 4034, NS, "Transaction aborted due to node shutdown" }, + + + + /** + * Unknown result + */ + { 4008, UR, "Receive from NDB failed" }, + { 4009, UR, "Cluster Failure" }, + { 4012, UR, + "Time-out, most likely caused by simple read or cluster failure" }, + { 4024, UR, + "Time-out, most likely caused by simple read or cluster failure" }, + { 4115, UR, + "Transaction was committed but all read information was not " + "received due to node crash" }, + + /** + * TemporaryResourceError + */ + { 217, TR, "217" }, + { 218, TR, "218" }, + { 219, TR, "219" }, + { 233, TR, "Out of operation records in transaction coordinator" }, + { 275, TR, "275" }, + { 279, TR, "Out of transaction markers in transaction coordinator" }, + { 414, TR, "414" }, + { 418, TR, "Out of transaction buffers in LQH" }, + { 419, TR, "419" }, + { 245, TR, "Too many active scans" }, + { 488, TR, "Too many active scans" }, + { 490, TR, "Too many active scans" }, + { 805, TR, "Out of attrinfo records in tuple manager" }, + { 830, TR, "Out of add fragment operation records" }, + { 873, TR, "Out of attrinfo records for scan in tuple manager" }, + { 1217, TR, "1217" }, + { 1219, TR, "Out of operation records in local data manager" }, + { 1220, TR, "1220" }, + { 1222, TR, "Out of transaction markers in LQH" }, + { 4021, TR, "Out of Send Buffer space in NDB API" }, + { 4022, TR, "Out of Send Buffer space in NDB API" }, + { 4032, TR, "Out of Send Buffer space in NDB API" }, + + /** + * InsufficientSpace + */ + { 623, IS, "623" }, + { 624, IS, "624" }, + { 625, IS, "Out of memory in Ndb Kernel, index part" }, + { 826, IS, "826" }, + { 827, IS, "Out of memory in Ndb Kernel, data part" }, + { 832, IS, "832" }, + + /** + * TimeoutExpired + */ + { 266, TO, "Time-out in NDB, probably caused by deadlock" }, + { 274, TO, "Time-out in NDB, probably caused by deadlock" }, /* Scan trans timeout */ + { 296, TO, "Time-out in NDB, probably caused by deadlock" }, /* Scan trans timeout */ + { 297, TO, "Time-out in NDB, probably caused by deadlock" }, /* Scan trans timeout, temporary!! */ + { 237, TO, "Transaction had timed out when trying to commit it" }, + + + /** + * OverloadError + */ + { 410, OL, "Out of log file space temporarily" }, + { 677, OL, "Index UNDO buffers overloaded" }, + { 891, OL, "Data UNDO buffers overloaded" }, + { 1221, OL, "REDO log buffers overloaded" }, + { 4006, AE, "Connect failure - out of connection objects" }, + + + + /** + * Internal errors + */ + { 892, IE, "Inconsistent hash index. The index needs to be dropped and recreated" }, + { 895, IE, "Inconsistent ordered index. The index needs to be dropped and recreated" }, + { 202, IE, "202" }, + { 203, IE, "203" }, + { 207, IE, "207" }, + { 208, IE, "208" }, + { 209, IE, "Communication problem, signal error" }, + { 220, IE, "220" }, + { 230, IE, "230" }, + { 232, IE, "232" }, + { 238, IE, "238" }, + { 271, IE, "Simple Read transaction without any attributes to read" }, + { 272, IE, "Update operation without any attributes to update" }, + { 276, IE, "276" }, + { 277, IE, "277" }, + { 278, IE, "278" }, + { 287, IE, "Index corrupted" }, + { 631, IE, "631" }, + { 632, IE, "632" }, + { 702, IE, "Request to non-master" }, + { 706, IE, "Inconsistency during table creation" }, + { 809, IE, "809" }, + { 812, IE, "812" }, + { 829, IE, "829" }, + { 833, IE, "833" }, + { 839, IE, "Illegal null attribute" }, + { 871, IE, "871" }, + { 882, IE, "882" }, + { 883, IE, "883" }, + { 887, IE, "887" }, + { 888, IE, "888" }, + { 890, IE, "890" }, + { 4000, IE, "MEMORY ALLOCATION ERROR" }, + { 4001, IE, "Signal Definition Error" }, + { 4005, IE, "Internal Error in NdbApi" }, + { 4011, IE, "Internal Error in NdbApi" }, + { 4107, IE, "Simple Transaction and Not Start" }, + { 4108, IE, "Faulty operation type" }, + { 4109, IE, "Faulty primary key attribute length" }, + { 4110, IE, "Faulty length in ATTRINFO signal" }, + { 4111, IE, "Status Error in NdbConnection" }, + { 4113, IE, "Too many operations received" }, + { 4320, IE, "Cannot use the same object twice to create table" }, + { 4321, IE, "Trying to start two schema transactions" }, + { 4344, IE, "Only DBDICT and TRIX can send requests to TRIX" }, + { 4345, IE, "TRIX block is not available yet, probably due to node failure" }, + { 4346, IE, "Internal error at index create/build" }, + { 4347, IE, "Bad state at alter index" }, + { 4348, IE, "Inconsistency detected at alter index" }, + { 4349, IE, "Inconsistency detected at index usage" }, + + /** + * Application error + */ + { 823, AE, "Too much attrinfo from application in tuple manager" }, + { 876, AE, "876" }, + { 877, AE, "877" }, + { 878, AE, "878" }, + { 879, AE, "879" }, + { 884, AE, "Stack overflow in interpreter" }, + { 885, AE, "Stack underflow in interpreter" }, + { 886, AE, "More than 65535 instructions executed in interpreter" }, + { 4256, AE, "Must call Ndb::init() before this function" }, + { 880, AE, "Tried to read too much - too many getValue calls" }, + { 4257, AE, "Tried to read too much - too many getValue calls" }, + + /** + * Scan application errors + */ + { 242, AE, "Zero concurrency in scan"}, + { 244, AE, "Too high concurrency in scan"}, + { 269, AE, "No condition and attributes to read in scan"}, + { 4600, AE, "Transaction is already started"}, + { 4601, AE, "Transaction is not started"}, + { 4602, AE, "You must call getNdbOperation before executeScan" }, + { 4603, AE, "There can only be ONE operation in a scan transaction" }, + { 4604, AE, "takeOverScanOp, opType must be UpdateRequest or DeleteRequest" }, + { 4605, AE, "You may only call openScanRead or openScanExclusive once for each operation"}, + { 4607, AE, "There may only be one operation in a scan transaction"}, + { 4608, AE, "You can not takeOverScan unless you have used openScanExclusive"}, + { 4609, AE, "You must call nextScanResult before trying to takeOverScan"}, + { 4232, AE, "Parallelism can only be between 1 and 240" }, + { 290, AE, "Scan not started or has been closed by kernel due to timeout" }, + + /** + * SchemaError + */ + { 701, SE, "System busy with other schema operation" }, + { 703, SE, "Invalid table format" }, + { 704, SE, "Attribute name too long" }, + { 705, SE, "Table name too long" }, + { 707, SE, "No more table metadata records" }, + { 708, SE, "No more attribute metadata records" }, + { 709, SE, "No such table existed" }, + { 721, SE, "Table or index with given name already exists" }, + { 723, SE, "No such table existed" }, + { 736, SE, "Wrong attribute size" }, + { 737, SE, "Attribute array size too big" }, + { 738, SE, "Record too big" }, + { 739, SE, "Unsupported primary key length" }, + { 740, SE, "Nullable primary key not supported" }, + { 741, SE, "Unsupported alter table" }, + { 241, SE, "Invalid schema object version" }, + { 283, SE, "Table is being dropped" }, + { 284, SE, "Table not defined in transaction coordinator" }, + { 285, SE, "Unknown table error in transaction coordinator" }, + { 881, SE, "Unable to create table, out of data pages" }, + { 1225, SE, "Table not defined in local query handler" }, + { 1226, SE, "Table is being dropped" }, + { 1228, SE, "Cannot use drop table for drop index" }, + { 1229, SE, "Too long frm data supplied" }, + + /** + * FunctionNotImplemented + */ + { 4003, NI, "Function not implemented yet" }, + + /** + * Still uncategorized + */ + { 720, AE, "Attribute name reused in table definition" }, + { 4004, AE, "Attribute name not found in the Table" }, + + { 4100, AE, "Status Error in NDB" }, + { 4101, AE, "No connections to NDB available and connect failed" }, + { 4102, AE, "Type in NdbTamper not correct" }, + { 4103, AE, "No schema connections to NDB available and connect failed" }, + { 4104, AE, "Ndb Init in wrong state, destroy Ndb object and create a new" }, + { 4105, AE, "Too many Ndb objects" }, + { 4106, AE, "All Not NULL attribute have not been defined" }, + { 4114, AE, "Transaction is already completed" }, + { 4116, AE, "Operation was not defined correctly, probably missing a key" }, + { 4117, AE, "Could not start transporter, configuration error"}, + { 4118, AE, "Parameter error in API call" }, + { 4300, AE, "Tuple Key Type not correct" }, + { 4301, AE, "Fragment Type not correct" }, + { 4302, AE, "Minimum Load Factor not correct" }, + { 4303, AE, "Maximum Load Factor not correct" }, + { 4304, AE, "Maximum Load Factor smaller than Minimum" }, + { 4305, AE, "K value must currently be set to 6" }, + { 4306, AE, "Memory Type not correct" }, + { 4307, AE, "Invalid table name" }, + { 4308, AE, "Attribute Size not correct" }, + { 4309, AE, "Fixed array too large, maximum 64000 bytes" }, + { 4310, AE, "Attribute Type not correct" }, + { 4311, AE, "Storage Mode not correct" }, + { 4312, AE, "Null Attribute Type not correct" }, + { 4313, AE, "Index only storage for non-key attribute" }, + { 4314, AE, "Storage Type of attribute not correct" }, + { 4315, AE, "No more key attributes allowed after defining variable length key attribute" }, + { 4316, AE, "Key attributes are not allowed to be NULL attributes" }, + { 4317, AE, "Too many primary keys defined in table" }, + { 4318, AE, "Invalid attribute name" }, + { 4319, AE, "createAttribute called at erroneus place" }, + { 4322, AE, "Attempt to define distribution key when not prepared to" }, + { 4323, AE, "Distribution Key set on table but not defined on first attribute" }, + { 4324, AE, "Attempt to define distribution group when not prepared to" }, + { 4325, AE, "Distribution Group set on table but not defined on first attribute" }, + { 4326, AE, "Distribution Group with erroneus number of bits" }, + { 4327, AE, "Distribution Group with 1 byte attribute is not allowed" }, + { 4328, AE, "Disk memory attributes not yet supported" }, + { 4329, AE, "Variable stored attributes not yet supported" }, + { 4330, AE, "Table names limited to 127 bytes" }, + { 4331, AE, "Attribute names limited to 31 bytes" }, + { 4332, AE, "Maximum 2000 attributes in a table" }, + { 4333, AE, "Maximum 4092 bytes long keys allowed" }, + { 4334, AE, "Attribute properties length limited to 127 bytes" }, + + { 4400, AE, "Status Error in NdbSchemaCon" }, + { 4401, AE, "Only one schema operation per schema transaction" }, + { 4402, AE, "No schema operation defined before calling execute" }, + + { 4500, AE, "Cannot handle more than 2048 tables in NdbApi" }, + { 4501, AE, "Insert in hash table failed when getting table information from Ndb" }, + { 4502, AE, "GetValue not allowed in Update operation" }, + { 4503, AE, "GetValue not allowed in Insert operation" }, + { 4504, AE, "SetValue not allowed in Read operation" }, + { 4505, AE, "NULL value not allowed in primary key search" }, + { 4506, AE, "Missing getValue/setValue when calling execute" }, + { 4507, AE, "Missing operation request when calling execute" }, + + { 4200, AE, "Status Error when defining an operation" }, + { 4201, AE, "Variable Arrays not yet supported" }, + { 4202, AE, "Set value on tuple key attribute is not allowed" }, + { 4203, AE, "Trying to set a NOT NULL attribute to NULL" }, + { 4204, AE, "Set value and Read/Delete Tuple is incompatible" }, + { 4205, AE, "No Key attribute used to define tuple" }, + { 4206, AE, "Not allowed to equal key attribute twice" }, + { 4207, AE, "Key size is limited to 4092 bytes" }, + { 4208, AE, "Trying to read a non-stored attribute" }, + { 4209, AE, "Length parameter in equal/setValue is incorrect" }, + { 4210, AE, "Ndb sent more info than the length he specified" }, + { 4211, AE, "Inconsistency in list of NdbRecAttr-objects" }, + { 4212, AE, "Ndb reports NULL value on Not NULL attribute" }, + { 4213, AE, "Not all data of an attribute has been received" }, + { 4214, AE, "Not all attributes have been received" }, + { 4215, AE, "More data received than reported in TCKEYCONF message" }, + { 4216, AE, "More than 8052 bytes in setValue cannot be handled" }, + { 4217, AE, "It is not allowed to increment any other than unsigned ints" }, + { 4218, AE, "Currently not allowed to increment NULL-able attributes" }, + { 4219, AE, "Maximum size of interpretative attributes are 64 bits" }, + { 4220, AE, "Maximum size of interpretative attributes are 64 bits" }, + { 4221, AE, "Trying to jump to a non-defined label" }, + { 4222, AE, "Label was not found, internal error" }, + { 4223, AE, "Not allowed to create jumps to yourself" }, + { 4224, AE, "Not allowed to jump to a label in a different subroutine" }, + { 4225, AE, "All primary keys defined, call setValue/getValue"}, + { 4226, AE, "Bad number when defining a label" }, + { 4227, AE, "Bad number when defining a subroutine" }, + { 4228, AE, "Illegal interpreter function in scan definition" }, + { 4229, AE, "Illegal register in interpreter function definition" }, + { 4230, AE, "Illegal state when calling getValue, probably not a read" }, + { 4231, AE, "Illegal state when calling interpreter routine" }, + { 4233, AE, "Calling execute (synchronous) when already prepared asynchronous transaction exists" }, + { 4234, AE, "Illegal to call setValue in this state" }, + { 4235, AE, "No callback from execute" }, + { 4236, AE, "Trigger name too long" }, + { 4237, AE, "Too many triggers" }, + { 4238, AE, "Trigger not found" }, + { 4239, AE, "Trigger with given name already exists"}, + { 4240, AE, "Unsupported trigger type"}, + { 4241, AE, "Index name too long" }, + { 4242, AE, "Too many indexes" }, + { 4243, AE, "Index not found" }, + { 4244, AE, "Index or table with given name already exists" }, + { 4245, AE, "Index attribute must be defined as stored, i.e. the StorageAttributeType must be defined as NormalStorageAttribute"}, + { 4246, AE, "Combined index attributes are not allowed to be NULL attributes" }, + { 4247, AE, "Illegal index/trigger create/drop/alter request" }, + { 4248, AE, "Trigger/index name invalid" }, + { 4249, AE, "Invalid table" }, + { 4250, AE, "Invalid index type or index logging option" }, + { 4251, AE, "Cannot create unique index, duplicate keys found" }, + { 4252, AE, "Failed to allocate space for index" }, + { 4253, AE, "Failed to create index table" }, + { 4254, AE, "Table not an index table" }, + { 4255, AE, "Hash index attributes must be specified in same order as table attributes" }, + { 4258, AE, "Cannot create unique index, duplicate attributes found in definition" }, + { 4259, AE, "Invalid set of range scan bounds" }, + { 4260, UD, "NdbScanFilter: Operator is not defined in NdbScanFilter::Group"}, + { 4261, UD, "NdbScanFilter: Column is NULL"}, + { 4262, UD, "NdbScanFilter: Condition is out of bounds"} + +}; + +static +const +int NbErrorCodes = sizeof(ErrorCodes)/sizeof(ErrorBundle); + +typedef struct ErrorStatusMessage { + ndberror_status status; + const char * message; +} ErrorStatusMessage; + +typedef struct ErrorStatusClassification { + ndberror_status status; + ndberror_classification classification; + const char * message; +} ErrorStatusClassification; + +/** + * Mapping between classification and status + */ +static +const +ErrorStatusMessage StatusMessageMapping[] = { + { ST_S, "Success"}, + { ST_P, "Permanent error"}, + { ST_T, "Temporary error"}, + { ST_U ,"Unknown result"} +}; + +static +const +int NbStatus = sizeof(StatusMessageMapping)/sizeof(ErrorStatusMessage); + +static +const +ErrorStatusClassification StatusClassificationMapping[] = { + { ST_S, NE, "No error"}, + { ST_P, AE, "Application error"}, + { ST_P, ND, "No data found"}, + { ST_P, CV, "Constraint violation"}, + { ST_P, SE, "Schema error"}, + { ST_P, UD, "User defined error"}, + { ST_P, IS, "Insufficient space"}, + + { ST_T, TR, "Temporary Resource error"}, + { ST_T, NR, "Node Recovery error"}, + { ST_T, OL, "Overload error"}, + { ST_T, TO, "Timeout expired"}, + { ST_T, NS, "Node shutdown"}, + + { ST_U , UR, "Unknown result error"}, + { ST_U , UE, "Unknown error code"}, + + { ST_P, IE, "Internal error"}, + { ST_P, NI, "Function not implemented"} +}; + +static +const +int NbClassification = sizeof(StatusClassificationMapping)/sizeof(ErrorStatusClassification); + +/** + * Complete all fields of an NdbError given the error code + * and details + */ +static +void +set(ndberror_struct * error, int code, const char * details, ...){ + error->code = code; + { + va_list ap; + va_start(ap, details); + vsnprintf(error->details, sizeof(error->details), details, ap); + va_end(ap); + } +} + + +void +ndberror_update(ndberror_struct * error){ + + int found = 0; + int i; + + for(i = 0; i<NbErrorCodes; i++){ + if(ErrorCodes[i].code == error->code){ + error->classification = ErrorCodes[i].classification; + error->message = ErrorCodes[i].message; + found = 1; + break; + } + } + + if(!found){ + error->classification = UE; + error->message = "Unknown error code"; + } + + found = 0; + for(i = 0; i<NbClassification; i++){ + if(StatusClassificationMapping[i].classification == error->classification){ + error->status = StatusClassificationMapping[i].status; + found = 1; + break; + } + } + if(!found){ + error->status = ST_U; + } + + error->details = 0; +} + +int +checkErrorCodes(){ + int i, j; + for(i = 0; i<NbErrorCodes; i++) + for(j = i+1; j<NbErrorCodes; j++) + if(ErrorCodes[i].code == ErrorCodes[j].code){ + printf("ErrorCode %d is defined multiple times!!\n", + ErrorCodes[i].code); + assert(0); + } + + return 1; +} + +/*static const int a = checkErrorCodes();*/ + +#if CHECK_ERRORCODES +int main(void){ + checkErrorCodes(); + return 0; +} +#endif + +const char *ndberror_status_message(ndberror_status status) +{ + int i; + for (i= 0; i < NbStatus; i++) + if (StatusMessageMapping[i].status == status) + return StatusMessageMapping[i].message; + return empty_string; +} + +const char *ndberror_classification_message(ndberror_classification classification) +{ + int i; + for (i= 0; i < NbClassification; i++) + if (StatusClassificationMapping[i].classification == classification) + return StatusClassificationMapping[i].message; + return empty_string; +} + +int ndb_error_string(int err_no, char *str, size_t size) +{ + ndberror_struct error; + size_t len= 0, tlen= 0; + + error.code = err_no; + ndberror_update(&error); + + len+= snprintf(str+tlen, size-tlen, "%s", error.message); + tlen= len < size ? len : size; + len+= snprintf(str+tlen, size-tlen, ": "); + tlen= len < size ? len : size; + len+= snprintf(str+tlen, size-tlen, "%s", ndberror_status_message(error.status)); + tlen= len < size ? len : size; + len+= snprintf(str+tlen, size-tlen, ": "); + tlen= len < size ? len : size; + len+= snprintf(str+tlen, size-tlen, "%s", ndberror_classification_message(error.classification)); + return len; +} |