ndberror.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:25k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <ndberror.h>
  15. #include <m_string.h>
  16. typedef struct ErrorBundle {
  17.   int code;
  18.   ndberror_classification classification;
  19.   const char * message;
  20. } ErrorBundle;
  21. /**
  22.  * Shorter names in table below
  23.  */
  24. #define ST_S ndberror_st_success
  25. #define ST_P ndberror_st_permanent
  26. #define ST_T ndberror_st_temporary
  27. #define ST_U ndberror_st_unknown
  28. #define NE ndberror_cl_none
  29. #define AE ndberror_cl_application
  30. #define CE ndberror_cl_configuration
  31. #define ND ndberror_cl_no_data_found
  32. #define CV ndberror_cl_constraint_violation
  33. #define SE ndberror_cl_schema_error
  34. #define UD ndberror_cl_user_defined
  35. #define IS ndberror_cl_insufficient_space
  36. #define TR ndberror_cl_temporary_resource
  37. #define NR ndberror_cl_node_recovery
  38. #define OL ndberror_cl_overload
  39. #define TO ndberror_cl_timeout_expired
  40. #define NS ndberror_cl_node_shutdown
  41. #define UR ndberror_cl_unknown_result
  42. #define IE ndberror_cl_internal_error
  43. #define NI ndberror_cl_function_not_implemented
  44. #define UE ndberror_cl_unknown_error_code
  45. static const char* empty_string = "";
  46. /*
  47.  * Error code ranges are reserved for respective block
  48.  *
  49.  *  200 - TC
  50.  *  300 - DIH
  51.  *  400 - LQH
  52.  *  600 - ACC
  53.  *  700 - DICT
  54.  *  800 - TUP
  55.  * 1200 - LQH
  56.  * 1300 - BACKUP
  57.  * 4000 - API
  58.  * 4100 - ""
  59.  * 4200 - ""
  60.  * 4300 - ""
  61.  * 4400 - ""
  62.  * 4500 - ""
  63.  * 4600 - ""
  64.  * 5000 - Management server
  65.  */
  66. static
  67. const 
  68. ErrorBundle ErrorCodes[] = {
  69.   /**
  70.    * No error
  71.    */
  72.   { 0,    NE, "No error" },
  73.   
  74.   /**
  75.    * NoDataFound
  76.    */
  77.   { 626,  ND, "Tuple did not exist" },
  78.   /**
  79.    * ConstraintViolation 
  80.    */
  81.   { 630,  CV, "Tuple already existed when attempting to insert" },
  82.   { 840,  CV, "Trying to set a NOT NULL attribute to NULL" },
  83.   { 893,  CV, "Constraint violation e.g. duplicate value in unique index" },
  84.   /**
  85.    * Node recovery errors
  86.    */
  87.   {  286, NR, "Node failure caused abort of transaction" }, 
  88.   {  250, NR, "Node where lock was held crashed, restart scan transaction" },
  89.   {  499, NR, "Scan take over error, restart scan transaction" },  
  90.   { 1204, NR, "Temporary failure, distribution changed" },
  91.   { 4002, NR, "Send to NDB failed" },
  92.   { 4010, NR, "Node failure caused abort of transaction" }, 
  93.   { 4025, NR, "Node failure caused abort of transaction" }, 
  94.   { 4027, NR, "Node failure caused abort of transaction" },
  95.   { 4028, NR, "Node failure caused abort of transaction" },
  96.   { 4029, NR, "Node failure caused abort of transaction" },
  97.   { 4031, NR, "Node failure caused abort of transaction" },
  98.   { 4033, NR, "Send to NDB failed" },
  99.   { 4115, NR, 
  100.     "Transaction was committed but all read information was not "
  101.     "received due to node crash" },
  102.   { 4119, NR, "Simple/dirty read failed due to node failure" },
  103.   
  104.   /**
  105.    * Node shutdown
  106.    */
  107.   {  280, NS, "Transaction aborted due to node shutdown" },
  108.   /* This scan trans had an active fragment scan in a LQH which have crashed */
  109.   {  270, NS, "Transaction aborted due to node shutdown" }, 
  110.   { 1223, NS, "Read operation aborted due to node shutdown" },
  111.   { 4023, NS, "Transaction aborted due to node shutdown" },
  112.   { 4030, NS, "Transaction aborted due to node shutdown" },
  113.   { 4034, NS, "Transaction aborted due to node shutdown" },
  114.   
  115.   /**
  116.    * Unknown result
  117.    */
  118.   { 4008, UR, "Receive from NDB failed" },
  119.   { 4009, UR, "Cluster Failure" },
  120.   { 4012, UR, 
  121.     "Request ndbd time-out, maybe due to high load or communication problems"}, 
  122.   { 4024, UR, 
  123.     "Time-out, most likely caused by simple read or cluster failure" }, 
  124.   
  125.   /**
  126.    * TemporaryResourceError
  127.    */
  128.   { 217,  TR, "217" },
  129.   { 218,  TR, "218" },
  130.   { 219,  TR, "219" },
  131.   { 233,  TR,
  132.     "Out of operation records in transaction coordinator (increase MaxNoOfConcurrentOperations)" },
  133.   { 275,  TR, "275" },
  134.   { 279,  TR, "Out of transaction markers in transaction coordinator" },
  135.   { 414,  TR, "414" },
  136.   { 418,  TR, "Out of transaction buffers in LQH" },
  137.   { 419,  TR, "419" },
  138.   { 245,  TR, "Too many active scans" },
  139.   { 488,  TR, "Too many active scans" },
  140.   { 490,  TR, "Too many active scans" },
  141.   { 805,  TR, "Out of attrinfo records in tuple manager" },
  142.   { 830,  TR, "Out of add fragment operation records" },
  143.   { 873,  TR, "Out of attrinfo records for scan in tuple manager" },
  144.   { 1217, TR, "Out of operation records in local data manager (increase MaxNoOfLocalOperations)" },
  145.   { 1220, TR, "REDO log files overloaded, consult online manual (decrease TimeBetweenLocalCheckpoints, and|or increase NoOfFragmentLogFiles)" },
  146.   { 1222, TR, "Out of transaction markers in LQH" },
  147.   { 1224, TR, "Out of Send Buffer space in LQH" },
  148.   { 4021, TR, "Out of Send Buffer space in NDB API" },
  149.   { 4022, TR, "Out of Send Buffer space in NDB API" },
  150.   { 4032, TR, "Out of Send Buffer space in NDB API" },
  151.   {  288, TR, "Out of index operations in transaction coordinator (increase MaxNoOfConcurrentIndexOperations)" },
  152.   /**
  153.    * InsufficientSpace
  154.    */
  155.   { 623,  IS, "623" },
  156.   { 624,  IS, "624" },
  157.   { 625,  IS, "Out of memory in Ndb Kernel, hash index part (increase IndexMemory)" },
  158.   { 800,  IS, "Too many ordered indexes (increase MaxNoOfOrderedIndexes)" },
  159.   { 826,  IS, "Too many tables and attributes (increase MaxNoOfAttributes or MaxNoOfTables)" },
  160.   { 827,  IS, "Out of memory in Ndb Kernel, table data (increase DataMemory)" },
  161.   { 902,  IS, "Out of memory in Ndb Kernel, ordered index data (increase DataMemory)" },
  162.   { 832,  IS, "832" },
  163.   /**
  164.    * TimeoutExpired 
  165.    */
  166.   { 266,  TO, "Time-out in NDB, probably caused by deadlock" },
  167.   { 274,  TO, "Time-out in NDB, probably caused by deadlock" }, /* Scan trans timeout */
  168.   { 296,  TO, "Time-out in NDB, probably caused by deadlock" }, /* Scan trans timeout */
  169.   { 297,  TO, "Time-out in NDB, probably caused by deadlock" }, /* Scan trans timeout, temporary!! */
  170.   { 237,  TO, "Transaction had timed out when trying to commit it" },
  171.   
  172.   /**
  173.    * OverloadError
  174.    */
  175.   { 410,  OL, "REDO log files overloaded, consult online manual (decrease TimeBetweenLocalCheckpoints, and|or increase NoOfFragmentLogFiles)" },
  176.   { 677,  OL, "Index UNDO buffers overloaded (increase UndoIndexBuffer)" },
  177.   { 891,  OL, "Data UNDO buffers overloaded (increase UndoDataBuffer)" },
  178.   { 1221, OL, "REDO buffers overloaded, consult online manual (increase RedoBuffer)" },
  179.   { 4006, OL, "Connect failure - out of connection objects (increase MaxNoOfConcurrentTransactions)" }, 
  180.   
  181.   /**
  182.    * Internal errors
  183.    */
  184.   { 892,  IE, "Inconsistent hash index. The index needs to be dropped and recreated" },
  185.   { 901,  IE, "Inconsistent ordered index. The index needs to be dropped and recreated" },
  186.   { 202,  IE, "202" },
  187.   { 203,  IE, "203" },
  188.   { 207,  IE, "207" },
  189.   { 208,  IE, "208" },
  190.   { 209,  IE, "Communication problem, signal error" },
  191.   { 220,  IE, "220" },
  192.   { 230,  IE, "230" },
  193.   { 232,  IE, "232" },
  194.   { 238,  IE, "238" },
  195.   { 271,  IE, "Simple Read transaction without any attributes to read" },
  196.   { 272,  IE, "Update operation without any attributes to update" },
  197.   { 276,  IE, "276" },
  198.   { 277,  IE, "277" },
  199.   { 278,  IE, "278" },
  200.   { 287,  IE, "Index corrupted" },
  201.   { 631,  IE, "631" },
  202.   { 632,  IE, "632" },
  203.   { 702,  IE, "Request to non-master" },
  204.   { 706,  IE, "Inconsistency during table creation" },
  205.   { 809,  IE, "809" },
  206.   { 812,  IE, "812" },
  207.   { 829,  IE, "829" },
  208.   { 833,  IE, "833" },
  209.   { 839,  IE, "Illegal null attribute" },
  210.   { 871,  IE, "871" },
  211.   { 882,  IE, "882" },
  212.   { 883,  IE, "883" },
  213.   { 887,  IE, "887" },
  214.   { 888,  IE, "888" },
  215.   { 890,  IE, "890" },
  216.   { 4000, IE, "MEMORY ALLOCATION ERROR" },
  217.   { 4001, IE, "Signal Definition Error" },
  218.   { 4005, IE, "Internal Error in NdbApi" },
  219.   { 4011, IE, "Internal Error in NdbApi" }, 
  220.   { 4107, IE, "Simple Transaction and Not Start" },
  221.   { 4108, IE, "Faulty operation type" },
  222.   { 4109, IE, "Faulty primary key attribute length" },
  223.   { 4110, IE, "Faulty length in ATTRINFO signal" },
  224.   { 4111, IE, "Status Error in NdbConnection" },
  225.   { 4113, IE, "Too many operations received" },
  226.   { 4320, IE, "Cannot use the same object twice to create table" },
  227.   { 4321, IE, "Trying to start two schema transactions" },
  228.   { 4344, IE, "Only DBDICT and TRIX can send requests to TRIX" },
  229.   { 4345, IE, "TRIX block is not available yet, probably due to node failure" },
  230.   { 4346, IE, "Internal error at index create/build" },
  231.   { 4347, IE, "Bad state at alter index" },
  232.   { 4348, IE, "Inconsistency detected at alter index" },
  233.   { 4349, IE, "Inconsistency detected at index usage" },
  234.   { 4350, IE, "Transaction already aborted" },
  235.   /**
  236.    * Application error
  237.    */
  238.   { 823,  AE, "Too much attrinfo from application in tuple manager" },
  239.   { 876,  AE, "876" },
  240.   { 877,  AE, "877" },
  241.   { 878,  AE, "878" },
  242.   { 879,  AE, "879" },
  243.   { 880,  AE, "Tried to read too much - too many getValue calls" },
  244.   { 884,  AE, "Stack overflow in interpreter" },
  245.   { 885,  AE, "Stack underflow in interpreter" },
  246.   { 886,  AE, "More than 65535 instructions executed in interpreter" },
  247.   { 897,  AE, "Update attempt of primary key via ndbcluster internal api (if this occurs via the MySQL server it is a bug, please report)" },
  248.   { 4256, AE, "Must call Ndb::init() before this function" },
  249.   { 4257, AE, "Tried to read too much - too many getValue calls" },
  250.   /** 
  251.    * Scan application errors
  252.    */
  253.   { 242,  AE, "Zero concurrency in scan"},
  254.   { 244,  AE, "Too high concurrency in scan"},
  255.   { 269,  AE, "No condition and attributes to read in scan"},
  256.   { 4600, AE, "Transaction is already started"},
  257.   { 4601, AE, "Transaction is not started"},
  258.   { 4602, AE, "You must call getNdbOperation before executeScan" },
  259.   { 4603, AE, "There can only be ONE operation in a scan transaction" },
  260.   { 4604, AE, "takeOverScanOp, opType must be UpdateRequest or DeleteRequest" },
  261.   { 4605, AE, "You may only call openScanRead or openScanExclusive once for each operation"},
  262.   { 4607, AE, "There may only be one operation in a scan transaction"},
  263.   { 4608, AE, "You can not takeOverScan unless you have used openScanExclusive"},
  264.   { 4609, AE, "You must call nextScanResult before trying to takeOverScan"},
  265.   { 4232, AE, "Parallelism can only be between 1 and 240" },
  266.   { 290,  AE, "Scan not started or has been closed by kernel due to timeout" },
  267.   /**
  268.    * SchemaError
  269.    */
  270.   { 701,  SE, "System busy with other schema operation" },
  271.   { 703,  SE, "Invalid table format" },
  272.   { 704,  SE, "Attribute name too long" },
  273.   { 705,  SE, "Table name too long" },
  274.   { 707,  SE, "No more table metadata records (increase MaxNoOfTables)" },  
  275.   { 708,  SE, "No more attribute metadata records (increase MaxNoOfAttributes)" },
  276.   { 709,  SE, "No such table existed" },
  277.   { 721,  SE, "Table or index with given name already exists" },
  278.   { 723,  SE, "No such table existed" },
  279.   { 736,  SE, "Wrong attribute size" },
  280.   { 737,  SE, "Attribute array size too big" },
  281.   { 738,  SE, "Record too big" },
  282.   { 739,  SE, "Unsupported primary key length" },
  283.   { 740,  SE, "Nullable primary key not supported" },
  284.   { 741,  SE, "Unsupported alter table" },
  285.   { 742,  SE, "Unsupported attribute type in index" },
  286.   { 743,  SE, "Unsupported character set in table or index" },
  287.   { 744,  SE, "Character string is invalid for given character set" },
  288.   { 761,  SE, "Unable to drop table as backup is in progress" },
  289.   { 762,  SE, "Unable to alter table as backup is in progress" },
  290.   { 241,  SE, "Invalid schema object version" },
  291.   { 283,  SE, "Table is being dropped" },
  292.   { 284,  SE, "Table not defined in transaction coordinator" },
  293.   { 285,  SE, "Unknown table error in transaction coordinator" },
  294.   { 881,  SE, "Unable to create table, out of data pages (increase DataMemory) " },
  295.   { 1225, SE, "Table not defined in local query handler" },
  296.   { 1226, SE, "Table is being dropped" },
  297.   { 1228, SE, "Cannot use drop table for drop index" },
  298.   { 1229, SE, "Too long frm data supplied" },
  299.   { 1231, SE, "Invalid table or index to scan" },
  300.   { 1232, SE, "Invalid table or index to scan" },
  301.   /**
  302.    * FunctionNotImplemented
  303.    */
  304.   { 4003, NI, "Function not implemented yet" },
  305.   /**
  306.    * Backup error codes
  307.    */ 
  308.   { 1300, IE, "Undefined error" },
  309.   { 1301, IE, "Backup issued to not master (reissue command to master)" },
  310.   { 1302, IE, "Out of backup record" },
  311.   { 1303, IS, "Out of resources" },
  312.   { 1304, IE, "Sequence failure" },
  313.   { 1305, IE, "Backup definition not implemented" },
  314.   { 1306, AE, "Backup not supported in diskless mode (change Diskless)" },
  315.   { 1321, IE, "Backup aborted by application" },
  316.   { 1322, IE, "Backup already completed" },
  317.   { 1323, IE, "1323" },
  318.   { 1324, IE, "Backup log buffer full" },
  319.   { 1325, IE, "File or scan error" },
  320.   { 1326, IE, "Backup abortet due to node failure" },
  321.   { 1327, IE, "1327" },
  322.   
  323.   { 1340, IE, "Backup undefined error" },
  324.   { 1342, AE, "Backup failed to allocate buffers (check configuration)" },
  325.   { 1343, AE, "Backup failed to setup fs buffers (check configuration)" },
  326.   { 1344, AE, "Backup failed to allocate tables (check configuration)" },
  327.   { 1345, AE, "Backup failed to insert file header (check configuration)" },
  328.   { 1346, AE, "Backup failed to insert table list (check configuration)" },
  329.   { 1347, AE, "Backup failed to allocate table memory (check configuration)" },
  330.   { 1348, AE, "Backup failed to allocate file record (check configuration)" },
  331.   { 1349, AE, "Backup failed to allocate attribute record (check configuration)" },
  332.   { 1329, AE, "Backup during software upgrade not supported" },
  333.   
  334.   /**
  335.    * Still uncategorized
  336.    */
  337.   { 720,  AE, "Attribute name reused in table definition" },
  338.   { 4004, AE, "Attribute name not found in the Table" },
  339.   
  340.   { 4100, AE, "Status Error in NDB" },
  341.   { 4101, AE, "No connections to NDB available and connect failed" },
  342.   { 4102, AE, "Type in NdbTamper not correct" },
  343.   { 4103, AE, "No schema connections to NDB available and connect failed" },
  344.   { 4104, AE, "Ndb Init in wrong state, destroy Ndb object and create a new" },
  345.   { 4105, AE, "Too many Ndb objects" },
  346.   { 4106, AE, "All Not NULL attribute have not been defined" },
  347.   { 4114, AE, "Transaction is already completed" },
  348.   { 4116, AE, "Operation was not defined correctly, probably missing a key" },
  349.   { 4117, AE, "Could not start transporter, configuration error"}, 
  350.   { 4118, AE, "Parameter error in API call" },
  351.   { 4300, AE, "Tuple Key Type not correct" },
  352.   { 4301, AE, "Fragment Type not correct" },
  353.   { 4302, AE, "Minimum Load Factor not correct" },
  354.   { 4303, AE, "Maximum Load Factor not correct" },
  355.   { 4304, AE, "Maximum Load Factor smaller than Minimum" },
  356.   { 4305, AE, "K value must currently be set to 6" },
  357.   { 4306, AE, "Memory Type not correct" },
  358.   { 4307, AE, "Invalid table name" },
  359.   { 4308, AE, "Attribute Size not correct" },
  360.   { 4309, AE, "Fixed array too large, maximum 64000 bytes" },
  361.   { 4310, AE, "Attribute Type not correct" },
  362.   { 4311, AE, "Storage Mode not correct" },
  363.   { 4312, AE, "Null Attribute Type not correct" },
  364.   { 4313, AE, "Index only storage for non-key attribute" },
  365.   { 4314, AE, "Storage Type of attribute not correct" },
  366.   { 4315, AE, "No more key attributes allowed after defining variable length key attribute" },
  367.   { 4316, AE, "Key attributes are not allowed to be NULL attributes" },
  368.   { 4317, AE, "Too many primary keys defined in table" },
  369.   { 4318, AE, "Invalid attribute name" },
  370.   { 4319, AE, "createAttribute called at erroneus place" },
  371.   { 4322, AE, "Attempt to define distribution key when not prepared to" },
  372.   { 4323, AE, "Distribution Key set on table but not defined on first attribute" },
  373.   { 4324, AE, "Attempt to define distribution group when not prepared to" },
  374.   { 4325, AE, "Distribution Group set on table but not defined on first attribute" },
  375.   { 4326, AE, "Distribution Group with erroneus number of bits" },
  376.   { 4327, AE, "Distribution Group with 1 byte attribute is not allowed" },
  377.   { 4328, AE, "Disk memory attributes not yet supported" },
  378.   { 4329, AE, "Variable stored attributes not yet supported" },
  379.   { 4400, AE, "Status Error in NdbSchemaCon" },
  380.   { 4401, AE, "Only one schema operation per schema transaction" },
  381.   { 4402, AE, "No schema operation defined before calling execute" },
  382.   { 4501, AE, "Insert in hash table failed when getting table information from Ndb" },
  383.   { 4502, AE, "GetValue not allowed in Update operation" },
  384.   { 4503, AE, "GetValue not allowed in Insert operation" },
  385.   { 4504, AE, "SetValue not allowed in Read operation" },
  386.   { 4505, AE, "NULL value not allowed in primary key search" },
  387.   { 4506, AE, "Missing getValue/setValue when calling execute" },
  388.   { 4507, AE, "Missing operation request when calling execute" },
  389.   { 4200, AE, "Status Error when defining an operation" },
  390.   { 4201, AE, "Variable Arrays not yet supported" },
  391.   { 4202, AE, "Set value on tuple key attribute is not allowed" },
  392.   { 4203, AE, "Trying to set a NOT NULL attribute to NULL" },
  393.   { 4204, AE, "Set value and Read/Delete Tuple is incompatible" },
  394.   { 4205, AE, "No Key attribute used to define tuple" },
  395.   { 4206, AE, "Not allowed to equal key attribute twice" },
  396.   { 4207, AE, "Key size is limited to 4092 bytes" },
  397.   { 4208, AE, "Trying to read a non-stored attribute" },
  398.   { 4209, AE, "Length parameter in equal/setValue is incorrect" },
  399.   { 4210, AE, "Ndb sent more info than the length he specified" },
  400.   { 4211, AE, "Inconsistency in list of NdbRecAttr-objects" },
  401.   { 4212, AE, "Ndb reports NULL value on Not NULL attribute" },
  402.   { 4213, AE, "Not all data of an attribute has been received" },
  403.   { 4214, AE, "Not all attributes have been received" },
  404.   { 4215, AE, "More data received than reported in TCKEYCONF message" },
  405.   { 4216, AE, "More than 8052 bytes in setValue cannot be handled" },
  406.   { 4217, AE, "It is not allowed to increment any other than unsigned ints" },
  407.   { 4218, AE, "Currently not allowed to increment NULL-able attributes" },
  408.   { 4219, AE, "Maximum size of interpretative attributes are 64 bits" },
  409.   { 4220, AE, "Maximum size of interpretative attributes are 64 bits" },
  410.   { 4221, AE, "Trying to jump to a non-defined label" },
  411.   { 4222, AE, "Label was not found, internal error" },
  412.   { 4223, AE, "Not allowed to create jumps to yourself" },
  413.   { 4224, AE, "Not allowed to jump to a label in a different subroutine" },
  414.   { 4225, AE, "All primary keys defined, call setValue/getValue"},
  415.   { 4226, AE, "Bad number when defining a label" },
  416.   { 4227, AE, "Bad number when defining a subroutine" },
  417.   { 4228, AE, "Illegal interpreter function in scan definition" },
  418.   { 4229, AE, "Illegal register in interpreter function definition" },
  419.   { 4230, AE, "Illegal state when calling getValue, probably not a read" },
  420.   { 4231, AE, "Illegal state when calling interpreter routine" },
  421.   { 4233, AE, "Calling execute (synchronous) when already prepared asynchronous transaction exists" },
  422.   { 4234, AE, "Illegal to call setValue in this state" },
  423.   { 4235, AE, "No callback from execute" },
  424.   { 4236, AE, "Trigger name too long" },
  425.   { 4237, AE, "Too many triggers" },
  426.   { 4238, AE, "Trigger not found" },
  427.   { 4239, AE, "Trigger with given name already exists"},
  428.   { 4240, AE, "Unsupported trigger type"},
  429.   { 4241, AE, "Index name too long" },
  430.   { 4242, AE, "Too many indexes" },
  431.   { 4243, AE, "Index not found" },
  432.   { 4244, AE, "Index or table with given name already exists" },
  433.   { 4245, AE, "Index attribute must be defined as stored, i.e. the StorageAttributeType must be defined as NormalStorageAttribute"},
  434.   { 4247, AE, "Illegal index/trigger create/drop/alter request" },
  435.   { 4248, AE, "Trigger/index name invalid" },
  436.   { 4249, AE, "Invalid table" },
  437.   { 4250, AE, "Invalid index type or index logging option" },
  438.   { 4251, AE, "Cannot create unique index, duplicate keys found" },
  439.   { 4252, AE, "Failed to allocate space for index" },
  440.   { 4253, AE, "Failed to create index table" },
  441.   { 4254, AE, "Table not an index table" },
  442.   { 4255, AE, "Hash index attributes must be specified in same order as table attributes" },
  443.   { 4258, AE, "Cannot create unique index, duplicate attributes found in definition" },
  444.   { 4259, AE, "Invalid set of range scan bounds" },
  445.   { 4260, UD, "NdbScanFilter: Operator is not defined in NdbScanFilter::Group"},
  446.   { 4261, UD, "NdbScanFilter: Column is NULL"},
  447.   { 4262, UD, "NdbScanFilter: Condition is out of bounds"},
  448.   { 4263, IE, "Invalid blob attributes or invalid blob parts table" },
  449.   { 4264, AE, "Invalid usage of blob attribute" },
  450.   { 4265, AE, "Method is not valid in current blob state" },
  451.   { 4266, AE, "Invalid blob seek position" },
  452.   { 4267, IE, "Corrupted blob value" },
  453.   { 4268, IE, "Error in blob head update forced rollback of transaction" },
  454.   { 4268, IE, "Unknown blob error" },
  455.   { 4269, IE, "No connection to ndb management server" },
  456.   { 4335, AE, "Only one autoincrement column allowed per table. Having a table without primary key uses an autoincremented hidden key, i.e. a table without a primary key can not have an autoincremented column" }
  457. };
  458. static
  459. const
  460. int NbErrorCodes = sizeof(ErrorCodes)/sizeof(ErrorBundle);
  461. typedef struct ErrorStatusMessage {
  462.   ndberror_status status;
  463.   const char * message;
  464. } ErrorStatusMessage;
  465. typedef struct ErrorStatusClassification {
  466.   ndberror_status status;
  467.   ndberror_classification classification;
  468.   const char * message;
  469. } ErrorStatusClassification;
  470. /**
  471.  * Mapping between classification and status
  472.  */
  473. static
  474. const
  475. ErrorStatusMessage StatusMessageMapping[] = {
  476.   { ST_S, "Success"},
  477.   { ST_P, "Permanent error"},
  478.   { ST_T, "Temporary error"},
  479.   { ST_U ,"Unknown result"}
  480. };
  481. static
  482. const
  483. int NbStatus = sizeof(StatusMessageMapping)/sizeof(ErrorStatusMessage);
  484. static
  485. const
  486. ErrorStatusClassification StatusClassificationMapping[] = {
  487.   { ST_S, NE, "No error"},
  488.   { ST_P, AE, "Application error"},
  489.   { ST_P, CE, "Configuration or application error"},
  490.   { ST_P, ND, "No data found"},
  491.   { ST_P, CV, "Constraint violation"},
  492.   { ST_P, SE, "Schema error"},
  493.   { ST_P, UD, "User defined error"},
  494.   { ST_P, IS, "Insufficient space"},
  495.   
  496.   { ST_T, TR, "Temporary Resource error"},
  497.   { ST_T, NR, "Node Recovery error"},
  498.   { ST_T, OL, "Overload error"},
  499.   { ST_T, TO, "Timeout expired"},
  500.   { ST_T, NS, "Node shutdown"},
  501.   
  502.   { ST_U , UR, "Unknown result error"},
  503.   { ST_U , UE, "Unknown error code"},
  504.   
  505.   { ST_P, IE, "Internal error"},
  506.   { ST_P, NI, "Function not implemented"}
  507. };
  508. static
  509. const
  510. int NbClassification = sizeof(StatusClassificationMapping)/sizeof(ErrorStatusClassification);
  511. #ifdef NOT_USED
  512. /**
  513.  * Complete all fields of an NdbError given the error code
  514.  * and details
  515.  */
  516. static
  517. void
  518. set(ndberror_struct * error, int code, const char * details, ...){
  519.   error->code = code;
  520.   {
  521.     va_list ap;
  522.     va_start(ap, details);
  523.     vsnprintf(error->details, sizeof(error->details), details, ap);
  524.     va_end(ap);
  525.   }
  526. }
  527. #endif
  528. void
  529. ndberror_update(ndberror_struct * error){
  530.   int found = 0;
  531.   int i;
  532.   for(i = 0; i<NbErrorCodes; i++){
  533.     if(ErrorCodes[i].code == error->code){
  534.       error->classification = ErrorCodes[i].classification;
  535.       error->message        = ErrorCodes[i].message;
  536.       found = 1;
  537.       break;
  538.     }
  539.   }
  540.   if(!found){
  541.     error->classification = UE;
  542.     error->message        = "Unknown error code";
  543.   }
  544.   found = 0;
  545.   for(i = 0; i<NbClassification; i++){
  546.     if(StatusClassificationMapping[i].classification == error->classification){
  547.       error->status = StatusClassificationMapping[i].status;
  548.       found = 1;
  549.       break;
  550.     }
  551.   }
  552.   if(!found){
  553.     error->status = ST_U;
  554.   }
  555.   error->details = 0;
  556. }
  557. int
  558. checkErrorCodes(){
  559.   int i, j;
  560.   for(i = 0; i<NbErrorCodes; i++)
  561.     for(j = i+1; j<NbErrorCodes; j++)
  562.       if(ErrorCodes[i].code == ErrorCodes[j].code){
  563. printf("ErrorCode %d is defined multiple times!!n", 
  564.  ErrorCodes[i].code);
  565. assert(0);
  566.       }
  567.   
  568.   return 1;
  569. }
  570. /*static const int a = checkErrorCodes();*/
  571. #if CHECK_ERRORCODES
  572. int main(void){
  573.   checkErrorCodes();
  574.   return 0;
  575. }
  576. #endif
  577. const char *ndberror_status_message(ndberror_status status)
  578. {
  579.   int i;
  580.   for (i= 0; i < NbStatus; i++)
  581.     if (StatusMessageMapping[i].status == status)
  582.       return StatusMessageMapping[i].message;
  583.   return empty_string;
  584. }
  585. const char *ndberror_classification_message(ndberror_classification classification)
  586. {
  587.   int i;
  588.   for (i= 0; i < NbClassification; i++)
  589.     if (StatusClassificationMapping[i].classification == classification)
  590.       return StatusClassificationMapping[i].message;
  591.   return empty_string;
  592. }
  593. int ndb_error_string(int err_no, char *str, unsigned int size)
  594. {
  595.   ndberror_struct error;
  596.   unsigned int len;
  597.   error.code = err_no;
  598.   ndberror_update(&error);
  599.   len =
  600.     my_snprintf(str, size-1, "%s: %s: %s", error.message,
  601. ndberror_status_message(error.status),
  602. ndberror_classification_message(error.classification));
  603.   str[size-1]= '';
  604.   
  605.   return len;
  606. }