~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/myisam/mi_delete.c

MergedĀ fromĀ Mats.

Show diffs side-by-side

added added

removed removed

Lines of Context:
437
437
    buff_length=mi_getint(buff);
438
438
 
439
439
    /* find keys to make a big key-page */
440
 
    memcpy((uchar*) next_keypos-key_reflength,(uchar*) buff+2,
441
 
           key_reflength);
 
440
    memcpy(next_keypos - key_reflength, buff + 2, key_reflength);
442
441
    if (!_mi_get_last_key(info,keyinfo,anc_buff,anc_key,next_keypos,&length)
443
442
        || !_mi_get_last_key(info,keyinfo,leaf_buff,leaf_key,
444
443
                             leaf_buff+leaf_length,&length))
453
452
    endpos=buff+length+leaf_length+t_length;
454
453
    /* buff will always be larger than before !*/
455
454
    bmove_upp((uchar*) endpos, (uchar*) buff+buff_length,length);
456
 
    memcpy((uchar*) buff, (uchar*) leaf_buff,(size_t) leaf_length);
 
455
    memcpy(buff, leaf_buff, leaf_length);
457
456
    (*keyinfo->store_key)(keyinfo,buff+leaf_length,&s_temp);
458
457
    buff_length=(uint) (endpos-buff);
459
458
    mi_putint(buff,buff_length,nod_flag);
469
468
 
470
469
    if (buff_length <= keyinfo->block_length)
471
470
    {                                           /* Keys in one page */
472
 
      memcpy((uchar*) leaf_buff,(uchar*) buff,(size_t) buff_length);
 
471
      memcpy(leaf_buff, buff, buff_length);
473
472
      if (_mi_dispose(info,keyinfo,next_page,DFLT_INIT_HITS))
474
473
       goto err;
475
474
    }
483
482
                                       &key_length, &after_key)))
484
483
        goto err;
485
484
      length=(uint) (half_pos-buff);
486
 
      memcpy((uchar*) leaf_buff,(uchar*) buff,(size_t) length);
 
485
      memcpy(leaf_buff, buff, length);
487
486
      mi_putint(leaf_buff,length,nod_flag);
488
487
 
489
488
      /* Correct new keypointer to leaf_page */
506
505
 
507
506
        /* Store key first in new page */
508
507
      if (nod_flag)
509
 
        memcpy((uchar*) buff+2,(uchar*) half_pos-nod_flag,(size_t) nod_flag);
 
508
        memcpy(buff + 2, half_pos - nod_flag, nod_flag);
510
509
      if (!(*keyinfo->get_key)(keyinfo,nod_flag,&half_pos,leaf_key))
511
510
        goto err;
512
511
      t_length=(int) (*keyinfo->pack_key)(keyinfo, nod_flag, (uchar*) 0,
514
513
                                          leaf_key, &s_temp);
515
514
      /* t_length will always be > 0 for a new page !*/
516
515
      length=(uint) ((buff+mi_getint(buff))-half_pos);
517
 
      memcpy((uchar*) buff+p_length+t_length,(uchar*) half_pos,(size_t) length);
 
516
      memcpy(buff + p_length + t_length, half_pos, length);
518
517
      (*keyinfo->store_key)(keyinfo,buff+p_length,&s_temp);
519
518
      mi_putint(buff,length+t_length+p_length,nod_flag);
520
519
 
537
536
  endpos=buff+buff_length;
538
537
 
539
538
  /* find keys to make a big key-page */
540
 
  memcpy((uchar*) next_keypos - key_reflength,(uchar*) leaf_buff+2,
541
 
         key_reflength);
 
539
  memcpy(next_keypos - key_reflength, leaf_buff+2, key_reflength);
542
540
  next_keypos=keypos;
543
541
  if (!(*keyinfo->get_key)(keyinfo,key_reflength,&next_keypos,
544
542
                           anc_key))
554
552
                                prev_key, prev_key,
555
553
                                anc_key, &s_temp);
556
554
  if (t_length >= 0)
557
 
    memcpy((uchar*) endpos+t_length,(uchar*) leaf_buff+p_length,
558
 
           (size_t) (leaf_length-p_length));
 
555
    memcpy(endpos+t_length,leaf_buff+p_length, leaf_length-p_length);
559
556
  else                                          /* We gained space */
560
 
    memcpy((uchar*) endpos,(uchar*) leaf_buff+((int) p_length-t_length),
561
 
           (size_t) (leaf_length-p_length+t_length));
 
557
    memcpy(endpos, leaf_buff+((int) p_length-t_length),
 
558
           leaf_length - p_length + t_length);
562
559
 
563
560
  (*keyinfo->store_key)(keyinfo,endpos,&s_temp);
564
561
  buff_length=buff_length+leaf_length-p_length+t_length;
607
604
 
608
605
    /* Store first key on new page */
609
606
    if (nod_flag)
610
 
      memcpy((uchar*) leaf_buff+2,(uchar*) half_pos-nod_flag,(size_t) nod_flag);
 
607
      memcpy(leaf_buff+2, half_pos - nod_flag, nod_flag);
611
608
    if (!(length=(*keyinfo->get_key)(keyinfo,nod_flag,&half_pos,leaf_key)))
612
609
      goto err;
613
610
    t_length=(*keyinfo->pack_key)(keyinfo,nod_flag, (uchar*) 0,
614
611
                                  (uchar*) 0, (uchar*) 0, leaf_key, &s_temp);
615
612
    length=(uint) ((buff+buff_length)-half_pos);
616
 
    memcpy((uchar*) leaf_buff+p_length+t_length,(uchar*) half_pos,
617
 
          (size_t) length);
 
613
    memcpy(leaf_buff + p_length + t_length, half_pos, length);
618
614
    (*keyinfo->store_key)(keyinfo,leaf_buff+p_length,&s_temp);
619
615
    mi_putint(leaf_buff,length+t_length+p_length,nod_flag);
620
616
    if (_mi_write_keypage(info,keyinfo,leaf_page,DFLT_INIT_HITS,leaf_buff))
755
751
    }
756
752
  }
757
753
end:
758
 
  memcpy((uchar*) start,(uchar*) start+s_length,
759
 
         (uint) (page_end-start-s_length));
760
 
  return((uint) s_length);
 
754
  assert(page_end-start >= s_length);
 
755
  memcpy(start, start + s_length, page_end-start-s_length);
 
756
  return s_length;
761
757
} /* remove_key */