Drizzled Public API Documentation

sql_state.cc

00001 /* - mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
00002  *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
00003  *
00004  *  Copyright (C) 2008 Sun Microsystems, Inc.
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00019  */
00020 
00021 /* Functions to map drizzle errno to sql_state */
00022 #include <config.h>
00023 
00024 #include <algorithm>
00025 
00026 #include <drizzled/error.h>
00027 #include <drizzled/error/sql_state.h>
00028 
00029 using namespace std;
00030 
00031 namespace drizzled
00032 {
00033 
00034 namespace error
00035 {
00036 
00037 struct sql_state_t
00038 {
00039   drizzled::error_t drizzle_errno;
00040   const char *odbc_state;
00041   const char *jdbc_state;
00042 };
00043 
00044 sql_state_t sqlstate_map[]=
00045 {
00046   { ER_DUP_KEY                              ,"23000", "" },
00047   { ER_OUTOFMEMORY                          ,"HY001", "S1001" },
00048   { ER_OUT_OF_SORTMEMORY                    ,"HY001", "S1001" },
00049   { ER_CON_COUNT_ERROR                      ,"08004", "" },
00050   { ER_BAD_HOST_ERROR                       ,"08S01", "" },
00051   { ER_HANDSHAKE_ERROR                      ,"08S01", "" },
00052   { ER_DBACCESS_DENIED_ERROR                ,"42000", "" },
00053   { ER_ACCESS_DENIED_ERROR                  ,"28000", "" },
00054   { ER_NO_DB_ERROR                          ,"3D000", "" },
00055   { ER_UNKNOWN_COM_ERROR                    ,"08S01", "" },
00056   { ER_BAD_NULL_ERROR                       ,"23000", "" },
00057   { ER_BAD_DB_ERROR                         ,"42000", "" },
00058   { ER_TABLE_EXISTS_ERROR                   ,"42S01", "" },
00059   { ER_BAD_TABLE_ERROR                      ,"42S02", "" },
00060   { ER_NON_UNIQ_ERROR                       ,"23000", "" },
00061   { ER_SERVER_SHUTDOWN                      ,"08S01", "" },
00062   { ER_BAD_FIELD_ERROR                      ,"42S22", "S0022" },
00063   { ER_WRONG_FIELD_WITH_GROUP               ,"42000", "S1009" },
00064   { ER_WRONG_GROUP_FIELD                    ,"42000", "S1009" },
00065   { ER_WRONG_SUM_SELECT                     ,"42000", "S1009" },
00066   { ER_WRONG_VALUE_COUNT                    ,"21S01", "" },
00067   { ER_TOO_LONG_IDENT                       ,"42000", "S1009" },
00068   { ER_DUP_FIELDNAME                        ,"42S21", "S1009" },
00069   { ER_DUP_KEYNAME                          ,"42000", "S1009" },
00070   { ER_DUP_ENTRY                            ,"23000", "S1009" },
00071   { ER_WRONG_FIELD_SPEC                     ,"42000", "S1009" },
00072   { ER_PARSE_ERROR                          ,"42000", "s1009" },
00073   { ER_EMPTY_QUERY                          ,"42000", "" },
00074   { ER_NONUNIQ_TABLE                        ,"42000", "S1009" },
00075   { ER_INVALID_DEFAULT                      ,"42000", "S1009" },
00076   { ER_MULTIPLE_PRI_KEY                     ,"42000", "S1009" },
00077   { ER_TOO_MANY_KEYS                        ,"42000", "S1009" },
00078   { ER_TOO_MANY_KEY_PARTS                   ,"42000", "S1009" },
00079   { ER_TOO_LONG_KEY                         ,"42000", "S1009" },
00080   { ER_KEY_COLUMN_DOES_NOT_EXITS            ,"42000", "S1009" },
00081   { ER_BLOB_USED_AS_KEY                     ,"42000", "S1009" },
00082   { ER_TOO_BIG_FIELDLENGTH                  ,"42000", "S1009" },
00083   { ER_WRONG_AUTO_KEY                       ,"42000", "S1009" },
00084   { ER_FORCING_CLOSE                        ,"08S01", "" },
00085   { ER_IPSOCK_ERROR                         ,"08S01", "" },
00086   { ER_NO_SUCH_INDEX                        ,"42S12", "S1009" },
00087   { ER_WRONG_FIELD_TERMINATORS              ,"42000", "S1009" },
00088   { ER_BLOBS_AND_NO_TERMINATED              ,"42000", "S1009" },
00089   { ER_CANT_REMOVE_ALL_FIELDS               ,"42000", "" },
00090   { ER_CANT_DROP_FIELD_OR_KEY               ,"42000", "" },
00091   { ER_BLOB_CANT_HAVE_DEFAULT               ,"42000", "" },
00092   { ER_WRONG_DB_NAME                        ,"42000", "" },
00093   { ER_WRONG_TABLE_NAME                     ,"42000", "" },
00094   { ER_TOO_BIG_SELECT                       ,"42000", "" },
00095   { ER_UNKNOWN_PROCEDURE                    ,"42000", "" },
00096   { ER_WRONG_PARAMCOUNT_TO_PROCEDURE        ,"42000", "" },
00097   { ER_UNKNOWN_TABLE                        ,"42S02", "" },
00098   { ER_FIELD_SPECIFIED_TWICE                ,"42000", "" },
00099   { ER_UNSUPPORTED_EXTENSION                ,"42000", "" },
00100   { ER_TABLE_MUST_HAVE_COLUMNS              ,"42000", "" },
00101   { ER_TOO_BIG_ROWSIZE                      ,"42000", "" },
00102   { ER_WRONG_OUTER_JOIN                     ,"42000", "" },
00103   { ER_NULL_COLUMN_IN_INDEX                 ,"42000", "" },
00104   { ER_WRONG_VALUE_COUNT_ON_ROW             ,"21S01", "" },
00105   { ER_MIX_OF_GROUP_FUNC_AND_FIELDS         ,"42000", "" },
00106   { ER_TABLE_UNKNOWN                        ,"42S02", "" },
00107   { ER_SYNTAX_ERROR                         ,"42000", "" },
00108   { ER_NET_PACKET_TOO_LARGE                 ,"08S01", "" },
00109   { ER_NET_PACKETS_OUT_OF_ORDER             ,"08S01", "" },
00110   { ER_TABLE_CANT_HANDLE_BLOB               ,"42000", "" },
00111   { ER_TABLE_CANT_HANDLE_AUTO_INCREMENT     ,"42000", "" },
00112   { ER_WRONG_COLUMN_NAME                    ,"42000", "" },
00113   { ER_WRONG_KEY_COLUMN                     ,"42000", "" },
00114   { ER_DUP_UNIQUE                           ,"23000", "" },
00115   { ER_BLOB_KEY_WITHOUT_LENGTH              ,"42000", "" },
00116   { ER_PRIMARY_CANT_HAVE_NULL               ,"42000", "" },
00117   { ER_TOO_MANY_ROWS                        ,"42000", "" },
00118   { ER_REQUIRES_PRIMARY_KEY                 ,"42000", "" },
00119   { ER_KEY_DOES_NOT_EXITS                   ,"42000", "S1009" },
00120   { ER_CHECK_NO_SUCH_TABLE                  ,"42000", "" },
00121   { ER_CHECK_NOT_IMPLEMENTED                ,"42000", "" },
00122   { ER_NEW_ABORTING_CONNECTION              ,"08S01", "" },
00123   { ER_READ_ONLY_TRANSACTION                ,"25000", "" },
00124   { ER_LOCK_DEADLOCK                        ,"40001", "" },
00125   { ER_NO_REFERENCED_ROW                    ,"23000", "" },
00126   { ER_ROW_IS_REFERENCED                    ,"23000", "" },
00127   { ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT    ,"21000", "" },
00128   { ER_NO_DEFAULT                           ,"42000", "" },
00129   { ER_WRONG_VALUE_FOR_VAR                  ,"42000", "" },
00130   { ER_WRONG_TYPE_FOR_VAR                   ,"42000", "" },
00131   { ER_CANT_USE_OPTION_HERE                 ,"42000", "" },
00132   { ER_NOT_SUPPORTED_YET                    ,"42000", "" },
00133   { ER_WRONG_FK_DEF                         ,"42000", "" },
00134   { ER_OPERAND_COLUMNS                      ,"21000", "" },
00135   { ER_SUBQUERY_NO_1_ROW                    ,"21000", "" },
00136   { ER_ILLEGAL_REFERENCE                    ,"42S22", "" },
00137   { ER_DERIVED_MUST_HAVE_ALIAS              ,"42000", "" },
00138   { ER_SELECT_REDUCED                       ,"01000", "" },
00139   { ER_TABLENAME_NOT_ALLOWED_HERE           ,"42000", "" },
00140   { ER_SPATIAL_CANT_HAVE_NULL               ,"42000", "" },
00141   { ER_COLLATION_CHARSET_MISMATCH           ,"42000", "" },
00142   { ER_WARN_TOO_FEW_RECORDS                 ,"01000", "" },
00143   { ER_WARN_TOO_MANY_RECORDS                ,"01000", "" },
00144   { ER_WARN_NULL_TO_NOTNULL                 ,"22004", "" },
00145   { ER_WARN_DATA_OUT_OF_RANGE               ,"22003", "" },
00146   { ER_WARN_DATA_TRUNCATED                  ,"01000", "" },
00147   { ER_WRONG_NAME_FOR_INDEX                 ,"42000", "" },
00148   { ER_WRONG_NAME_FOR_CATALOG               ,"42000", "" },
00149   { ER_UNKNOWN_STORAGE_ENGINE               ,"42000", "" },
00150   { ER_TRUNCATED_WRONG_VALUE                ,"22007", "" },
00151   { ER_SP_DOES_NOT_EXIST                    ,"42000", "" },
00152   { ER_QUERY_INTERRUPTED                    ,"70100", "" },
00153   { ER_DIVISION_BY_ZERO                     ,"22012", "" },
00154   { ER_ILLEGAL_VALUE_FOR_TYPE               ,"22007", "" },
00155   { ER_XAER_RMFAIL                          ,"XAE07", "" },
00156   { ER_DATA_TOO_LONG                        ,"22001", "" },
00157   { ER_SP_NO_RETSET                         ,"0A000", "" },
00158   { ER_CANT_CREATE_GEOMETRY_OBJECT          ,"22003", "" },
00159   { ER_TOO_BIG_SCALE                        ,"42000", "S1009" },
00160   { ER_TOO_BIG_PRECISION                    ,"42000", "S1009" },
00161   { ER_M_BIGGER_THAN_D                      ,"42000", "S1009" },
00162   { ER_TOO_BIG_DISPLAYWIDTH                 ,"42000", "S1009" },
00163   { ER_DATETIME_FUNCTION_OVERFLOW           ,"22008", "" },
00164   { ER_ROW_IS_REFERENCED_2                  ,"23000", "" },
00165   { ER_NO_REFERENCED_ROW_2                  ,"23000", "" },
00166   { ER_NON_GROUPING_FIELD_USED              ,"42000", "" },
00167   { ER_FOREIGN_DUPLICATE_KEY                ,"23000", "S1009" },
00168   { ER_CANT_CHANGE_TX_ISOLATION             ,"25001", "" },
00169   { ER_WRONG_PARAMCOUNT_TO_FUNCTION         ,"42000", "" },
00170   { ER_WRONG_PARAMETERS_TO_NATIVE_FCT       ,"42000", "" },
00171   { ER_DUP_ENTRY_WITH_KEY_NAME              ,"23000", "S1009" },
00172 };
00173 
00174 static bool compare_errno_map(sql_state_t a,
00175                               sql_state_t b)
00176 {
00177   return (a.drizzle_errno < b.drizzle_errno);
00178 }
00179 
00180 const char *convert_to_sqlstate(drizzled::error_t drizzle_errno)
00181 {
00182 
00183   sql_state_t drizzle_err_state= {drizzle_errno, NULL, NULL};
00184   sql_state_t* result=
00185     lower_bound(&sqlstate_map[0],
00186                 &sqlstate_map[sizeof(sqlstate_map)/sizeof(*sqlstate_map)],
00187                 drizzle_err_state, compare_errno_map);
00188 
00189   if ((*result).drizzle_errno == drizzle_errno)
00190     return (*result).odbc_state;
00191 
00192   /* General error */
00193   return "HY000";
00194 }
00195 
00196 } /* namespace error */
00197 } /* namespace drizzled */