16
16
/* Create a MyISAM table */
18
#include "myisamdef.h"
19
#include <mysys/my_tree.h>
20
#include <mysys/my_bit.h>
22
#include <drizzled/util/test.h>
18
#include "myisam_priv.h"
19
#include "drizzled/internal/my_bit.h"
20
#include "drizzled/internal/my_sys.h"
22
#include "drizzled/util/test.h"
23
#include "drizzled/global_charset_info.h"
24
#include "drizzled/error.h"
24
27
#include <algorithm>
26
29
using namespace std;
30
using namespace drizzled;
29
33
Old options is used when recreating database, from myisamchk
35
39
MI_CREATE_INFO *ci,uint32_t flags)
37
41
register uint32_t i, j;
38
File dfile= 0, file= 0;
42
int dfile= 0, file= 0;
39
43
int errpos,save_errno, create_mode= O_RDWR | O_TRUNC;
41
45
uint32_t fields,length,max_key_length,packed,pointer,real_length_diff,
54
58
HA_KEYSEG *keyseg,tmp_keyseg;
56
60
ulong *rec_per_key_part;
57
my_off_t key_root[HA_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
61
internal::my_off_t key_root[HA_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
58
62
MI_CREATE_INFO tmp_create_info;
232
236
/* Test if prefix compression */
233
237
if (keydef->flag & HA_PACK_KEY)
235
/* Can't use space_compression on number keys */
236
if ((keydef->seg[0].flag & HA_SPACE_PACK) &&
237
keydef->seg[0].type == (int) HA_KEYTYPE_NUM)
238
keydef->seg[0].flag&= ~HA_SPACE_PACK;
240
239
/* Only use HA_PACK_KEY when first segment is a variable length key */
241
240
if (!(keydef->seg[0].flag & (HA_SPACE_PACK | HA_BLOB_PART |
242
241
HA_VAR_LENGTH_PART)))
262
261
/* numbers are stored with high by first to make compression easier */
263
262
switch (keyseg->type) {
264
case HA_KEYTYPE_SHORT_INT:
265
263
case HA_KEYTYPE_LONG_INT:
266
case HA_KEYTYPE_FLOAT:
267
264
case HA_KEYTYPE_DOUBLE:
268
case HA_KEYTYPE_USHORT_INT:
269
265
case HA_KEYTYPE_ULONG_INT:
270
266
case HA_KEYTYPE_LONGLONG:
271
267
case HA_KEYTYPE_ULONGLONG:
272
case HA_KEYTYPE_INT24:
273
268
case HA_KEYTYPE_UINT24:
274
case HA_KEYTYPE_INT8:
275
269
keyseg->flag|= HA_SWAP_KEY;
277
271
case HA_KEYTYPE_VARTEXT1:
356
350
if (keydef->block_length > MI_MAX_KEY_BLOCK_LENGTH ||
357
351
length >= MI_MAX_KEY_BUFF)
359
my_errno=HA_WRONG_CREATE_OPTION;
353
errno=HA_WRONG_CREATE_OPTION;
362
356
set_if_bigger(max_key_block_length,(uint32_t)keydef->block_length);
402
396
my_printf_error(0, "MyISAM table '%s' has too many columns and/or "
403
397
"indexes and/or unique constraints.",
404
MYF(0), name + dirname_length(name));
405
my_errno= HA_WRONG_CREATE_OPTION;
398
MYF(0), name + internal::dirname_length(name));
399
errno= HA_WRONG_CREATE_OPTION;
465
459
/* max_data_file_length and max_key_file_length are recalculated on open */
466
460
if (options & HA_OPTION_TMP_TABLE)
467
share.base.max_data_file_length=(my_off_t) ci->data_file_length;
461
share.base.max_data_file_length=(internal::my_off_t) ci->data_file_length;
469
463
share.base.min_block_length=
470
464
(share.base.pack_reclength+3 < MI_EXTEND_BLOCK_LENGTH &&
490
484
/* chop off the table name, tempory tables use generated name */
491
485
if ((path= strrchr((char *)ci->index_file_name, FN_LIBCHAR)))
493
fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
487
internal::fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
494
488
MY_REPLACE_DIR | MY_UNPACK_FILENAME |
495
489
MY_RETURN_REAL_PATH | MY_APPEND_EXT);
499
fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
493
internal::fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
500
494
MY_UNPACK_FILENAME | MY_RETURN_REAL_PATH |
501
495
(have_iext ? MY_REPLACE_EXT : MY_APPEND_EXT));
503
fn_format(linkname, name, "", MI_NAME_IEXT,
497
internal::fn_format(linkname, name, "", MI_NAME_IEXT,
504
498
MY_UNPACK_FILENAME|MY_APPEND_EXT);
505
499
linkname_ptr=linkname;
514
508
char *iext= strrchr((char *)name, '.');
515
509
int have_iext= iext && !strcmp(iext, MI_NAME_IEXT);
516
fn_format(filename, name, "", MI_NAME_IEXT,
510
internal::fn_format(filename, name, "", MI_NAME_IEXT,
517
511
MY_UNPACK_FILENAME | MY_RETURN_REAL_PATH |
518
512
(have_iext ? MY_REPLACE_EXT : MY_APPEND_EXT));
536
530
my_printf_error(0, "MyISAM table '%s' is in use "
537
531
"(most likely by a MERGE table). Try FLUSH TABLES.",
538
MYF(0), name + dirname_length(name));
539
my_errno= HA_ERR_TABLE_EXIST;
532
MYF(0), name + internal::dirname_length(name));
533
errno= HA_ERR_TABLE_EXIST;
543
if ((file= my_create_with_symlink(linkname_ptr, filename, 0, create_mode,
544
MYF(MY_WME | create_flag))) < 0)
537
if ((file= internal::my_create_with_symlink(linkname_ptr,
541
MYF(MY_WME | create_flag))) < 0)
559
556
/* chop off the table name, tempory tables use generated name */
560
557
if ((path= strrchr((char *)ci->data_file_name, FN_LIBCHAR)))
562
fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
559
internal::fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
563
560
MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_APPEND_EXT);
567
fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
564
internal::fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
568
565
MY_UNPACK_FILENAME |
569
566
(have_dext ? MY_REPLACE_EXT : MY_APPEND_EXT));
572
fn_format(linkname, name, "",MI_NAME_DEXT,
569
internal::fn_format(linkname, name, "",MI_NAME_DEXT,
573
570
MY_UNPACK_FILENAME | MY_APPEND_EXT);
574
571
linkname_ptr=linkname;
579
fn_format(filename,name,"", MI_NAME_DEXT,
576
internal::fn_format(filename,name,"", MI_NAME_DEXT,
580
577
MY_UNPACK_FILENAME | MY_APPEND_EXT);
582
579
create_flag=(flags & HA_CREATE_KEEP_FILES) ? 0 : MY_DELETE_OLD;
585
my_create_with_symlink(linkname_ptr, filename, 0, create_mode,
586
MYF(MY_WME | create_flag))) < 0)
581
if ((dfile= internal::my_create_with_symlink(linkname_ptr,
582
filename, 0, create_mode,
583
MYF(MY_WME | create_flag))) < 0)
673
if (my_close(dfile,MYF(0)))
670
if (internal::my_close(dfile,MYF(0)))
677
674
pthread_mutex_unlock(&THR_LOCK_myisam);
678
if (my_close(file,MYF(0)))
675
if (internal::my_close(file,MYF(0)))
680
677
free((char*) rec_per_key_part);
684
681
pthread_mutex_unlock(&THR_LOCK_myisam);
686
683
switch (errpos) {
688
my_close(dfile,MYF(0));
685
internal::my_close(dfile,MYF(0));
689
686
/* fall through */
691
688
if (! (flags & HA_DONT_TOUCH_DATA))
692
my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,
689
internal::my_delete_with_symlink(internal::fn_format(filename,name,"",MI_NAME_DEXT,
693
690
MY_UNPACK_FILENAME | MY_APPEND_EXT),
695
692
/* fall through */
697
my_close(file,MYF(0));
694
internal::my_close(file,MYF(0));
698
695
if (! (flags & HA_DONT_TOUCH_DATA))
699
my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,
696
internal::my_delete_with_symlink(internal::fn_format(filename,name,"",MI_NAME_IEXT,
700
697
MY_UNPACK_FILENAME | MY_APPEND_EXT),
703
700
free((char*) rec_per_key_part);
704
return(my_errno=save_errno); /* return the fatal errno */
701
return(errno=save_errno); /* return the fatal errno */