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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 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. /* Return error-text for system error messages and nisam messages */
  14. #define PERROR_VERSION "2.10"
  15. #include <my_global.h>
  16. #include <my_sys.h>
  17. #include <m_string.h>
  18. #include <errno.h>
  19. #include <my_getopt.h>
  20. #ifdef HAVE_NDBCLUSTER_DB
  21. #include "../ndb/src/ndbapi/ndberror.c"
  22. #endif
  23. static my_bool verbose, print_all_codes;
  24. #ifdef HAVE_NDBCLUSTER_DB
  25. static my_bool ndb_code;
  26. static char ndb_string[1024];
  27. #endif
  28. static struct my_option my_long_options[] =
  29. {
  30.   {"help", '?', "Displays this help and exits.", 0, 0, 0, GET_NO_ARG,
  31.    NO_ARG, 0, 0, 0, 0, 0, 0},
  32.   {"info", 'I', "Synonym for --help.",  0, 0, 0, GET_NO_ARG,
  33.    NO_ARG, 0, 0, 0, 0, 0, 0},
  34. #ifdef HAVE_NDBCLUSTER_DB
  35.   {"ndb", 257, "Ndbcluster storage engine specific error codes.",  (gptr*) &ndb_code,
  36.    (gptr*) &ndb_code, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
  37. #endif
  38. #ifdef HAVE_SYS_ERRLIST
  39.   {"all", 'a', "Print all the error messages and the number.",
  40.    (gptr*) &print_all_codes, (gptr*) &print_all_codes, 0, GET_BOOL, NO_ARG,
  41.    0, 0, 0, 0, 0, 0},
  42. #endif
  43.   {"silent", 's', "Only print the error message.", 0, 0, 0, GET_NO_ARG, NO_ARG,
  44.    0, 0, 0, 0, 0, 0},
  45.   {"verbose", 'v', "Print error code and message (default).", (gptr*) &verbose,
  46.    (gptr*) &verbose, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
  47.   {"version", 'V', "Displays version information and exits.",
  48.    0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  49.   {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  50. };
  51. typedef struct ha_errors {
  52.   int errcode;
  53.   const char *msg;
  54. } HA_ERRORS;
  55. static HA_ERRORS ha_errlist[]=
  56. {
  57.   { 120,"Didn't find key on read or update" },
  58.   { 121,"Duplicate key on write or update" },
  59.   { 123,"Someone has changed the row since it was read (while the table was locked to prevent it)" },
  60.   { 124,"Wrong index given to function" },
  61.   { 126,"Index file is crashed" },
  62.   { 127,"Record-file is crashed" },
  63.   { 128,"Out of memory" },
  64.   { 130,"Incorrect file format" },
  65.   { 131,"Command not supported by database" },
  66.   { 132,"Old database file" },
  67.   { 133,"No record read before update" },
  68.   { 134,"Record was already deleted (or record file crashed)" },
  69.   { 135,"No more room in record file" },
  70.   { 136,"No more room in index file" },
  71.   { 137,"No more records (read after end of file)" },
  72.   { 138,"Unsupported extension used for table" },
  73.   { 139,"Too big row"},
  74.   { 140,"Wrong create options"},
  75.   { 141,"Duplicate unique key or constraint on write or update"},
  76.   { 142,"Unknown character set used"},
  77.   { 143,"Conflicting table definitions in sub-tables of MERGE table"},
  78.   { 144,"Table is crashed and last repair failed"},
  79.   { 145,"Table was marked as crashed and should be repaired"},
  80.   { 146,"Lock timed out; Retry transaction"},
  81.   { 147,"Lock table is full;  Restart program with a larger locktable"},
  82.   { 148,"Updates are not allowed under a read only transactions"},
  83.   { 149,"Lock deadlock; Retry transaction"},
  84.   { 150,"Foreign key constraint is incorrectly formed"},
  85.   { 151,"Cannot add a child row"},
  86.   { 152,"Cannot delete a parent row"},
  87.   { -30999, "DB_INCOMPLETE: Sync didn't finish"},
  88.   { -30998, "DB_KEYEMPTY: Key/data deleted or never created"},
  89.   { -30997, "DB_KEYEXIST: The key/data pair already exists"},
  90.   { -30996, "DB_LOCK_DEADLOCK: Deadlock"},
  91.   { -30995, "DB_LOCK_NOTGRANTED: Lock unavailable"},
  92.   { -30994, "DB_NOSERVER: Server panic return"},
  93.   { -30993, "DB_NOSERVER_HOME: Bad home sent to server"},
  94.   { -30992, "DB_NOSERVER_ID: Bad ID sent to server"},
  95.   { -30991, "DB_NOTFOUND: Key/data pair not found (EOF)"},
  96.   { -30990, "DB_OLD_VERSION: Out-of-date version"},
  97.   { -30989, "DB_RUNRECOVERY: Panic return"},
  98.   { -30988, "DB_VERIFY_BAD: Verify failed; bad format"},
  99.   { 0,NullS },
  100. };
  101. #include <help_start.h>
  102. static void print_version(void)
  103. {
  104.   printf("%s Ver %s, for %s (%s)n",my_progname,PERROR_VERSION,
  105.  SYSTEM_TYPE,MACHINE_TYPE);
  106. }
  107. static void usage(void)
  108. {
  109.   print_version();
  110.   puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,nand you are welcome to modify and redistribute it under the GPL licensen");
  111.   printf("Print a description for a system error code or an error code fromna MyISAM/ISAM/BDB table handler.n");
  112.   printf("If you want to get the error for a negative error code, you should usen-- before the first error code to tell perror that there was no more options.nn");
  113.   printf("Usage: %s [OPTIONS] [ERRORCODE [ERRORCODE...]]n",my_progname);
  114.   my_print_help(my_long_options);
  115.   my_print_variables(my_long_options);
  116. }
  117. #include <help_end.h>
  118. static my_bool
  119. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  120.        char *argument __attribute__((unused)))
  121. {
  122.   switch (optid) {
  123.   case 's':
  124.     verbose=0;
  125.     break;
  126.   case 'V':
  127.     print_version();
  128.     exit(0);
  129.     break;
  130.   case 'I':
  131.   case '?':
  132.     usage();
  133.     exit(0);
  134.     break;
  135.   }
  136.   return 0;
  137. }
  138. static int get_options(int *argc,char ***argv)
  139. {
  140.   int ho_error;
  141.   if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
  142.     exit(ho_error);
  143.   if (!*argc && !print_all_codes)
  144.   {
  145.     usage();
  146.     return 1;
  147.   }
  148.   return 0;
  149. } /* get_options */
  150. static const char *get_ha_error_msg(int code)
  151. {
  152.   HA_ERRORS *ha_err_ptr;
  153.   for (ha_err_ptr=ha_errlist ; ha_err_ptr->errcode ;ha_err_ptr++)
  154.     if (ha_err_ptr->errcode == code)
  155.       return ha_err_ptr->msg;
  156.   return NullS;
  157. }
  158. int main(int argc,char *argv[])
  159. {
  160.   int error,code,found;
  161.   const char *msg;
  162.   char *unknown_error = 0;
  163.   MY_INIT(argv[0]);
  164.   if (get_options(&argc,&argv))
  165.     exit(1);
  166.   error=0;
  167. #ifdef HAVE_SYS_ERRLIST
  168.   if (print_all_codes)
  169.   {
  170.     HA_ERRORS *ha_err_ptr;
  171.     for (code=1 ; code < sys_nerr ; code++)
  172.     {
  173.       if (sys_errlist[code][0])
  174.       { /* Skip if no error-text */
  175. printf("%3d = %sn",code,sys_errlist[code]);
  176.       }
  177.     }
  178.     for (ha_err_ptr=ha_errlist ; ha_err_ptr->errcode ;ha_err_ptr++)
  179.       printf("%3d = %sn",ha_err_ptr->errcode,ha_err_ptr->msg);
  180.   }
  181.   else
  182. #endif
  183.   {
  184.     /*
  185.       On some system, like NETWARE, strerror(unknown_error) returns a
  186.       string 'Unknown Error'.  To avoid printing it we try to find the
  187.       error string by asking for an impossible big error message.
  188.     */
  189.     msg= strerror(10000);
  190.     /*
  191.       Allocate a buffer for unknown_error since strerror always returns
  192.       the same pointer on some platforms such as Windows
  193.     */
  194.     unknown_error= malloc(strlen(msg)+1);
  195.     strmov(unknown_error, msg);
  196.     for ( ; argc-- > 0 ; argv++)
  197.     {
  198.       found=0;
  199.       code=atoi(*argv);
  200. #ifdef HAVE_NDBCLUSTER_DB
  201.       if (ndb_code)
  202.       {
  203. if (ndb_error_string(code, ndb_string,  sizeof(ndb_string)) < 0)
  204.   msg= 0;
  205. else
  206.   msg= ndb_string;
  207.       }
  208.       else 
  209. #endif
  210. msg = strerror(code);
  211.       /*
  212.         We don't print the OS error message if it is the same as the
  213.         unknown_error message we retrieved above, or it starts with
  214.         'Unknown Error' (without regard to case).
  215.       */
  216.       if (msg &&
  217.           my_strnncoll(&my_charset_latin1, msg, 13, "Unknown Error", 13) &&
  218.           (!unknown_error || strcmp(msg, unknown_error)))
  219.       {
  220. found=1;
  221. if (verbose)
  222.   printf("OS error code %3d:  %sn",code,msg);
  223. else
  224.   puts(msg);
  225.       }
  226.       if (!(msg=get_ha_error_msg(code)))
  227.       {
  228. if (!found)
  229. {
  230.   fprintf(stderr,"Illegal error code: %dn",code);
  231.   error=1;
  232. }
  233.       }
  234.       else
  235.       {
  236. if (verbose)
  237.   printf("MySQL error code %3d: %sn",code,msg);
  238. else
  239.   puts(msg);
  240.       }
  241.     }
  242.   }
  243.   /* if we allocated a buffer for unknown_error, free it now */
  244.   if (unknown_error)
  245.     free(unknown_error);
  246.   exit(error);
  247.   return error;
  248. }