655
void Cursor::print_keydup_error(uint32_t key_nr, const char *msg)
657
/* Write the duplicated key in the error message */
658
char key[MAX_KEY_LENGTH];
659
String str(key,sizeof(key),system_charset_info);
661
if (key_nr == MAX_KEY)
664
str.copy("", 0, system_charset_info);
665
my_printf_error(ER_DUP_ENTRY, msg, MYF(0), str.c_ptr(), "*UNKNOWN*");
669
/* Table is opened and defined at this point */
670
key_unpack(&str,table,(uint32_t) key_nr);
671
uint32_t max_length=DRIZZLE_ERRMSG_SIZE-(uint32_t) strlen(msg);
672
if (str.length() >= max_length)
674
str.length(max_length-4);
675
str.append(STRING_WITH_LEN("..."));
677
my_printf_error(ER_DUP_ENTRY, msg,
678
MYF(0), str.c_ptr(), table->key_info[key_nr].name);
684
Print error that we got from Cursor function.
687
In case of delete table it's only safe to use the following parts of
688
the 'table' structure:
692
void Cursor::print_error(int error, myf errflag)
694
int textno= ER_GET_ERRNO;
697
textno=ER_OPEN_AS_READONLY;
703
textno=ER_FILE_NOT_FOUND;
705
case HA_ERR_KEY_NOT_FOUND:
706
case HA_ERR_NO_ACTIVE_RECORD:
707
case HA_ERR_END_OF_FILE:
708
textno=ER_KEY_NOT_FOUND;
710
case HA_ERR_WRONG_MRG_TABLE_DEF:
711
textno=ER_WRONG_MRG_TABLE;
713
case HA_ERR_FOUND_DUPP_KEY:
715
uint32_t key_nr=get_dup_key(error);
716
if ((int) key_nr >= 0)
718
print_keydup_error(key_nr, ER(ER_DUP_ENTRY_WITH_KEY_NAME));
724
case HA_ERR_FOREIGN_DUPLICATE_KEY:
726
uint32_t key_nr= get_dup_key(error);
727
if ((int) key_nr >= 0)
730
/* Write the key in the error message */
731
char key[MAX_KEY_LENGTH];
732
String str(key,sizeof(key),system_charset_info);
733
/* Table is opened and defined at this point */
734
key_unpack(&str,table,(uint32_t) key_nr);
735
max_length= (DRIZZLE_ERRMSG_SIZE-
736
(uint32_t) strlen(ER(ER_FOREIGN_DUPLICATE_KEY)));
737
if (str.length() >= max_length)
739
str.length(max_length-4);
740
str.append(STRING_WITH_LEN("..."));
742
my_error(ER_FOREIGN_DUPLICATE_KEY, MYF(0), table_share->table_name.str,
743
str.c_ptr(), key_nr+1);
749
case HA_ERR_FOUND_DUPP_UNIQUE:
750
textno=ER_DUP_UNIQUE;
752
case HA_ERR_RECORD_CHANGED:
756
textno=ER_NOT_KEYFILE;
758
case HA_ERR_WRONG_IN_RECORD:
759
textno= ER_CRASHED_ON_USAGE;
761
case HA_ERR_CRASHED_ON_USAGE:
762
textno=ER_CRASHED_ON_USAGE;
764
case HA_ERR_NOT_A_TABLE:
767
case HA_ERR_CRASHED_ON_REPAIR:
768
textno=ER_CRASHED_ON_REPAIR;
770
case HA_ERR_OUT_OF_MEM:
771
textno=ER_OUT_OF_RESOURCES;
773
case HA_ERR_WRONG_COMMAND:
774
textno=ER_ILLEGAL_HA;
776
case HA_ERR_OLD_FILE:
777
textno=ER_OLD_KEYFILE;
779
case HA_ERR_UNSUPPORTED:
780
textno=ER_UNSUPPORTED_EXTENSION;
782
case HA_ERR_RECORD_FILE_FULL:
783
case HA_ERR_INDEX_FILE_FULL:
784
textno=ER_RECORD_FILE_FULL;
786
case HA_ERR_LOCK_WAIT_TIMEOUT:
787
textno=ER_LOCK_WAIT_TIMEOUT;
789
case HA_ERR_LOCK_TABLE_FULL:
790
textno=ER_LOCK_TABLE_FULL;
792
case HA_ERR_LOCK_DEADLOCK:
793
textno=ER_LOCK_DEADLOCK;
795
case HA_ERR_READ_ONLY_TRANSACTION:
796
textno=ER_READ_ONLY_TRANSACTION;
798
case HA_ERR_CANNOT_ADD_FOREIGN:
799
textno=ER_CANNOT_ADD_FOREIGN;
801
case HA_ERR_ROW_IS_REFERENCED:
804
get_error_message(error, &str);
805
my_error(ER_ROW_IS_REFERENCED_2, MYF(0), str.c_ptr_safe());
808
case HA_ERR_NO_REFERENCED_ROW:
811
get_error_message(error, &str);
812
my_error(ER_NO_REFERENCED_ROW_2, MYF(0), str.c_ptr_safe());
815
case HA_ERR_TABLE_DEF_CHANGED:
816
textno=ER_TABLE_DEF_CHANGED;
818
case HA_ERR_NO_SUCH_TABLE:
819
my_error(ER_NO_SUCH_TABLE, MYF(0), table_share->db.str,
820
table_share->table_name.str);
822
case HA_ERR_RBR_LOGGING_FAILED:
823
textno= ER_BINLOG_ROW_LOGGING_FAILED;
825
case HA_ERR_DROP_INDEX_FK:
827
const char *ptr= "???";
828
uint32_t key_nr= get_dup_key(error);
829
if ((int) key_nr >= 0)
830
ptr= table->key_info[key_nr].name;
831
my_error(ER_DROP_INDEX_FK, MYF(0), ptr);
834
case HA_ERR_TABLE_NEEDS_UPGRADE:
835
textno=ER_TABLE_NEEDS_UPGRADE;
837
case HA_ERR_TABLE_READONLY:
838
textno= ER_OPEN_AS_READONLY;
840
case HA_ERR_AUTOINC_READ_FAILED:
841
textno= ER_AUTOINC_READ_FAILED;
843
case HA_ERR_AUTOINC_ERANGE:
844
textno= ER_WARN_DATA_OUT_OF_RANGE;
846
case HA_ERR_LOCK_OR_ACTIVE_TRANSACTION:
847
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
848
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
853
The error was "unknown" to this function.
854
Ask Cursor if it has got a message for this error
856
bool temporary= false;
858
temporary= get_error_message(error, &str);
861
const char* engine_name= engine->getName().c_str();
863
my_error(ER_GET_TEMPORARY_ERRMSG, MYF(0), error, str.ptr(),
866
my_error(ER_GET_ERRMSG, MYF(0), error, str.ptr(), engine_name);
870
my_error(ER_GET_ERRNO,errflag,error);
875
my_error(textno, errflag, table_share->table_name.str, error);
880
Return an error message specific to this Cursor.
882
@param error error code previously returned by Cursor
883
@param buf pointer to String where to add error message
886
Returns true if this is a temporary error
888
bool Cursor::get_error_message(int , String* )
894
/* Code left, but Drizzle has no legacy yet (while MySQL did) */
895
int Cursor::check_old_types()
902
key if error because of duplicated keys
904
uint32_t Cursor::get_dup_key(int error)
906
table->cursor->errkey = (uint32_t) -1;
907
if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOREIGN_DUPLICATE_KEY ||
908
error == HA_ERR_FOUND_DUPP_UNIQUE ||
909
error == HA_ERR_DROP_INDEX_FK)
910
info(HA_STATUS_ERRKEY | HA_STATUS_NO_LOCK);
911
return(table->cursor->errkey);
914
653
void Cursor::drop_table(const char *)