~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/myisam/mi_create.c

  • Committer: Brian Aker
  • Date: 2008-11-04 15:39:09 UTC
  • mfrom: (575.1.2 devel)
  • Revision ID: brian@tangent.org-20081104153909-c72hn65udxs1ccal
Merge of Monty's work

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
#include <mysys/queues.h>
21
21
#include <mysys/my_bit.h>
22
22
 
 
23
#include <drizzled/util/test.h>
23
24
 
24
25
/*
25
26
  Old options is used when recreating database, from myisamchk
26
27
*/
27
28
 
28
 
int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
29
 
              uint columns, MI_COLUMNDEF *recinfo,
30
 
              uint uniques, MI_UNIQUEDEF *uniquedefs,
31
 
              MI_CREATE_INFO *ci,uint flags)
 
29
int mi_create(const char *name,uint32_t keys,MI_KEYDEF *keydefs,
 
30
              uint32_t columns, MI_COLUMNDEF *recinfo,
 
31
              uint32_t uniques, MI_UNIQUEDEF *uniquedefs,
 
32
              MI_CREATE_INFO *ci,uint32_t flags)
32
33
{
33
 
  register uint i, j;
 
34
  register uint32_t i, j;
34
35
  File dfile= 0, file= 0;
35
36
  int errpos,save_errno, create_mode= O_RDWR | O_TRUNC;
36
37
  myf create_flag;
37
 
  uint fields,length,max_key_length,packed,pointer,real_length_diff,
 
38
  uint32_t fields,length,max_key_length,packed,pointer,real_length_diff,
38
39
       key_length,info_length,key_segs,options,min_key_length_skip,
39
40
       base_pos,long_varchar_count,varchar_length,
40
41
       max_key_block_length,unique_key_parts,fulltext_keys,offset;
41
 
  uint aligned_key_start, block_length;
 
42
  uint32_t aligned_key_start, block_length;
42
43
  ulong reclength, real_reclength,min_pack_length;
43
44
  char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr;
44
45
  ulong pack_reclength;
169
170
  if (flags & HA_CREATE_TMP_TABLE)
170
171
  {
171
172
    options|= HA_OPTION_TMP_TABLE;
172
 
    create_mode|= O_EXCL | O_NOFOLLOW;
 
173
    create_mode|= O_EXCL;
173
174
  }
174
175
  if (flags & HA_CREATE_CHECKSUM || (options & HA_OPTION_CHECKSUM))
175
176
  {
354
355
    block_length= (keydef->block_length ? 
355
356
                   my_round_up_to_next_power(keydef->block_length) :
356
357
                   myisam_block_size);
357
 
    block_length= max(block_length, MI_MIN_KEY_BLOCK_LENGTH);
358
 
    block_length= min(block_length, MI_MAX_KEY_BLOCK_LENGTH);
 
358
    block_length= cmax(block_length, MI_MIN_KEY_BLOCK_LENGTH);
 
359
    block_length= cmin(block_length, MI_MAX_KEY_BLOCK_LENGTH);
359
360
 
360
361
    keydef->block_length= (uint16_t) MI_BLOCK_SIZE(length-real_length_diff,
361
362
                                                 pointer,MI_MAX_KEYPTR_SIZE,
443
444
    got from MYI file header (see also myisampack.c:save_state)
444
445
  */
445
446
  share.base.key_reflength=
446
 
    mi_get_pointer_length(max(ci->key_file_length,tmp),3);
 
447
    mi_get_pointer_length(cmax(ci->key_file_length,tmp),3);
447
448
  share.base.keys= share.state.header.keys= keys;
448
449
  share.state.header.uniques= uniques;
449
450
  share.state.header.fulltext_keys= fulltext_keys;
476
477
  share.base.min_block_length=
477
478
    (share.base.pack_reclength+3 < MI_EXTEND_BLOCK_LENGTH &&
478
479
     ! share.base.blobs) ?
479
 
    max(share.base.pack_reclength,MI_MIN_BLOCK_LENGTH) :
 
480
    cmax(share.base.pack_reclength,MI_MIN_BLOCK_LENGTH) :
480
481
    MI_EXTEND_BLOCK_LENGTH;
481
482
  if (! (flags & HA_DONT_TOUCH_DATA))
482
483
    share.state.create_time= (long) time((time_t*) 0);
603
604
  /* Write key and keyseg definitions */
604
605
  for (i=0 ; i < share.base.keys - uniques; i++)
605
606
  {
606
 
    uint sp_segs= 0;
 
607
    uint32_t sp_segs= 0;
607
608
 
608
609
    if (mi_keydef_write(file, &keydefs[i]))
609
610
      goto err;
684
685
  pthread_mutex_unlock(&THR_LOCK_myisam);
685
686
  if (my_close(file,MYF(0)))
686
687
    goto err;
687
 
  my_free((char*) rec_per_key_part,MYF(0));
 
688
  free((char*) rec_per_key_part);
688
689
  return(0);
689
690
 
690
691
err:
692
693
  save_errno=my_errno;
693
694
  switch (errpos) {
694
695
  case 3:
695
 
    VOID(my_close(dfile,MYF(0)));
 
696
    my_close(dfile,MYF(0));
696
697
    /* fall through */
697
698
  case 2:
698
 
    /* QQ: T�nu should add a call to my_raid_delete() here */
699
699
  if (! (flags & HA_DONT_TOUCH_DATA))
700
700
    my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,
701
701
                                     MY_UNPACK_FILENAME | MY_APPEND_EXT),
702
702
                           MYF(0));
703
703
    /* fall through */
704
704
  case 1:
705
 
    VOID(my_close(file,MYF(0)));
 
705
    my_close(file,MYF(0));
706
706
    if (! (flags & HA_DONT_TOUCH_DATA))
707
707
      my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,
708
708
                                       MY_UNPACK_FILENAME | MY_APPEND_EXT),
709
709
                             MYF(0));
710
710
  }
711
 
  my_free((char*) rec_per_key_part, MYF(0));
 
711
  free((char*) rec_per_key_part);
712
712
  return(my_errno=save_errno);          /* return the fatal errno */
713
713
}
714
714
 
715
715
 
716
 
uint mi_get_pointer_length(uint64_t file_length, uint def)
 
716
uint32_t mi_get_pointer_length(uint64_t file_length, uint32_t def)
717
717
{
718
718
  assert(def >= 2 && def <= 7);
719
719
  if (file_length)                              /* If not default */