12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
16
/* Create a MyISAM table */
18
#include "myisam_priv.h"
19
#include <drizzled/internal/my_bit.h>
20
#include <drizzled/internal/my_sys.h>
18
#include "myisamdef.h"
19
#include <mysys/my_tree.h>
20
#include <mysys/my_bit.h>
22
22
#include <drizzled/util/test.h>
23
#include <drizzled/charset.h>
24
#include <drizzled/error.h>
27
24
#include <algorithm>
29
26
using namespace std;
30
using namespace drizzled;
33
29
Old options is used when recreating database, from myisamchk
39
35
MI_CREATE_INFO *ci,uint32_t flags)
41
37
register uint32_t i, j;
42
int dfile= 0, file= 0;
38
File dfile= 0, file= 0;
43
39
int errpos,save_errno, create_mode= O_RDWR | O_TRUNC;
45
41
uint32_t fields,length,max_key_length,packed,pointer,real_length_diff,
58
54
HA_KEYSEG *keyseg,tmp_keyseg;
60
56
ulong *rec_per_key_part;
61
internal::my_off_t key_root[HA_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
57
my_off_t key_root[HA_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
62
58
MI_CREATE_INFO tmp_create_info;
236
232
/* Test if prefix compression */
237
233
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;
239
240
/* Only use HA_PACK_KEY when first segment is a variable length key */
240
241
if (!(keydef->seg[0].flag & (HA_SPACE_PACK | HA_BLOB_PART |
241
242
HA_VAR_LENGTH_PART)))
261
262
/* numbers are stored with high by first to make compression easier */
262
263
switch (keyseg->type) {
264
case HA_KEYTYPE_SHORT_INT:
263
265
case HA_KEYTYPE_LONG_INT:
266
case HA_KEYTYPE_FLOAT:
264
267
case HA_KEYTYPE_DOUBLE:
268
case HA_KEYTYPE_USHORT_INT:
265
269
case HA_KEYTYPE_ULONG_INT:
266
270
case HA_KEYTYPE_LONGLONG:
267
271
case HA_KEYTYPE_ULONGLONG:
272
case HA_KEYTYPE_INT24:
273
case HA_KEYTYPE_UINT24:
274
case HA_KEYTYPE_INT8:
268
275
keyseg->flag|= HA_SWAP_KEY;
270
277
case HA_KEYTYPE_VARTEXT1:
349
356
if (keydef->block_length > MI_MAX_KEY_BLOCK_LENGTH ||
350
357
length >= MI_MAX_KEY_BUFF)
352
errno=HA_WRONG_CREATE_OPTION;
359
my_errno=HA_WRONG_CREATE_OPTION;
355
362
set_if_bigger(max_key_block_length,(uint32_t)keydef->block_length);
392
399
/* There are only 16 bits for the total header length. */
393
400
if (info_length > 65535)
395
my_printf_error(EE_OK, "MyISAM table '%s' has too many columns and/or "
402
my_printf_error(0, "MyISAM table '%s' has too many columns and/or "
396
403
"indexes and/or unique constraints.",
397
MYF(0), name + internal::dirname_length(name));
398
errno= HA_WRONG_CREATE_OPTION;
404
MYF(0), name + dirname_length(name));
405
my_errno= HA_WRONG_CREATE_OPTION;
458
465
/* max_data_file_length and max_key_file_length are recalculated on open */
459
466
if (options & HA_OPTION_TMP_TABLE)
460
share.base.max_data_file_length=(internal::my_off_t) ci->data_file_length;
467
share.base.max_data_file_length=(my_off_t) ci->data_file_length;
462
469
share.base.min_block_length=
463
470
(share.base.pack_reclength+3 < MI_EXTEND_BLOCK_LENGTH &&
467
474
if (! (flags & HA_DONT_TOUCH_DATA))
468
475
share.state.create_time= (long) time((time_t*) 0);
470
THR_LOCK_myisam.lock();
477
pthread_mutex_lock(&THR_LOCK_myisam);
473
480
NOTE: For test_if_reopen() we need a real path name. Hence we need
474
MY_RETURN_REAL_PATH for every internal::fn_format(filename, ...).
481
MY_RETURN_REAL_PATH for every fn_format(filename, ...).
476
483
if (ci->index_file_name)
483
490
/* chop off the table name, tempory tables use generated name */
484
491
if ((path= strrchr((char *)ci->index_file_name, FN_LIBCHAR)))
486
internal::fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
493
fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
487
494
MY_REPLACE_DIR | MY_UNPACK_FILENAME |
488
495
MY_RETURN_REAL_PATH | MY_APPEND_EXT);
492
internal::fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
499
fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
493
500
MY_UNPACK_FILENAME | MY_RETURN_REAL_PATH |
494
501
(have_iext ? MY_REPLACE_EXT : MY_APPEND_EXT));
496
internal::fn_format(linkname, name, "", MI_NAME_IEXT,
503
fn_format(linkname, name, "", MI_NAME_IEXT,
497
504
MY_UNPACK_FILENAME|MY_APPEND_EXT);
498
505
linkname_ptr=linkname;
507
514
char *iext= strrchr((char *)name, '.');
508
515
int have_iext= iext && !strcmp(iext, MI_NAME_IEXT);
509
internal::fn_format(filename, name, "", MI_NAME_IEXT,
516
fn_format(filename, name, "", MI_NAME_IEXT,
510
517
MY_UNPACK_FILENAME | MY_RETURN_REAL_PATH |
511
518
(have_iext ? MY_REPLACE_EXT : MY_APPEND_EXT));
527
534
if (test_if_reopen(filename))
529
my_printf_error(EE_OK, "MyISAM table '%s' is in use "
536
my_printf_error(0, "MyISAM table '%s' is in use "
530
537
"(most likely by a MERGE table). Try FLUSH TABLES.",
531
MYF(0), name + internal::dirname_length(name));
532
errno= HA_ERR_TABLE_EXIST;
538
MYF(0), name + dirname_length(name));
539
my_errno= HA_ERR_TABLE_EXIST;
536
if ((file= internal::my_create_with_symlink(linkname_ptr,
540
MYF(MY_WME | create_flag))) < 0)
543
if ((file= my_create_with_symlink(linkname_ptr, filename, 0, create_mode,
544
MYF(MY_WME | create_flag))) < 0)
555
559
/* chop off the table name, tempory tables use generated name */
556
560
if ((path= strrchr((char *)ci->data_file_name, FN_LIBCHAR)))
558
internal::fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
562
fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
559
563
MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_APPEND_EXT);
563
internal::fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
567
fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
564
568
MY_UNPACK_FILENAME |
565
569
(have_dext ? MY_REPLACE_EXT : MY_APPEND_EXT));
568
internal::fn_format(linkname, name, "",MI_NAME_DEXT,
572
fn_format(linkname, name, "",MI_NAME_DEXT,
569
573
MY_UNPACK_FILENAME | MY_APPEND_EXT);
570
574
linkname_ptr=linkname;
575
internal::fn_format(filename,name,"", MI_NAME_DEXT,
579
fn_format(filename,name,"", MI_NAME_DEXT,
576
580
MY_UNPACK_FILENAME | MY_APPEND_EXT);
578
582
create_flag=(flags & HA_CREATE_KEEP_FILES) ? 0 : MY_DELETE_OLD;
580
if ((dfile= internal::my_create_with_symlink(linkname_ptr,
581
filename, 0, create_mode,
582
MYF(MY_WME | create_flag))) < 0)
585
my_create_with_symlink(linkname_ptr, filename, 0, create_mode,
586
MYF(MY_WME | create_flag))) < 0)
669
if (internal::my_close(dfile,MYF(0)))
673
if (my_close(dfile,MYF(0)))
673
THR_LOCK_myisam.unlock();
674
if (internal::my_close(file,MYF(0)))
677
pthread_mutex_unlock(&THR_LOCK_myisam);
678
if (my_close(file,MYF(0)))
676
680
free((char*) rec_per_key_part);
680
THR_LOCK_myisam.unlock();
684
pthread_mutex_unlock(&THR_LOCK_myisam);
682
686
switch (errpos) {
684
internal::my_close(dfile,MYF(0));
688
my_close(dfile,MYF(0));
685
689
/* fall through */
687
691
if (! (flags & HA_DONT_TOUCH_DATA))
688
internal::my_delete_with_symlink(internal::fn_format(filename,name,"",MI_NAME_DEXT,
692
my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,
689
693
MY_UNPACK_FILENAME | MY_APPEND_EXT),
691
695
/* fall through */
693
internal::my_close(file,MYF(0));
697
my_close(file,MYF(0));
694
698
if (! (flags & HA_DONT_TOUCH_DATA))
695
internal::my_delete_with_symlink(internal::fn_format(filename,name,"",MI_NAME_IEXT,
699
my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,
696
700
MY_UNPACK_FILENAME | MY_APPEND_EXT),
699
703
free((char*) rec_per_key_part);
700
return(errno=save_errno); /* return the fatal errno */
704
return(my_errno=save_errno); /* return the fatal errno */