@@ -187,7 +187,7 @@ int32_t get_pagesize(byte page_size_exp) {
187187uint16_t acquire_last_pos (struct uls_write_context * wctx , byte * ptr ) {
188188 uint16_t last_pos = read_uint16 (ptr + 5 );
189189 if (last_pos == 0 ) {
190- uls_append_row (wctx );
190+ uls_append_empty_row (wctx );
191191 last_pos = read_uint16 (ptr + 5 );
192192 }
193193 return last_pos ;
@@ -482,7 +482,7 @@ int form_page1(struct uls_write_context *wctx, char *table_name, char *table_scr
482482 int orig_col_count = wctx -> col_count ;
483483 wctx -> cur_write_page = 0 ;
484484 wctx -> col_count = 5 ;
485- uls_append_row (wctx );
485+ uls_append_empty_row (wctx );
486486 uls_set_col_val (wctx , 0 , ULS_TYPE_TEXT , "table" , 5 );
487487 if (table_name == NULL )
488488 table_name = default_table_name ;
@@ -596,23 +596,23 @@ int uls_write_init(struct uls_write_context *wctx) {
596596// Checks space for appending new row
597597// If space not available, writes current buffer to disk and
598598// initializes buffer as new page
599- uint16_t check_space_for_new_row (struct uls_write_context * wctx , int32_t page_size ,
600- int rec_count , uint16_t len_of_rec_len_rowid , uint16_t new_rec_len ) {
599+ uint16_t make_space_for_new_row (struct uls_write_context * wctx , int32_t page_size ,
600+ uint16_t len_of_rec_len_rowid , uint16_t new_rec_len ) {
601601 byte * ptr = wctx -> buf + (wctx -> buf [0 ] == 13 ? 0 : 100 );
602602 uint16_t last_pos = read_uint16 (ptr + 5 );
603+ int rec_count = read_uint16 (ptr + 3 ) + 1 ;
603604 if (last_pos == 0 )
604605 last_pos = page_size - wctx -> page_resv_bytes - new_rec_len - len_of_rec_len_rowid ;
605606 else {
606607 last_pos -= new_rec_len ;
607608 last_pos -= len_of_rec_len_rowid ;
608- if (last_pos < (ptr - wctx -> buf ) + 9 + CHKSUM_LEN + rec_count * 2 ) {
609+ if (last_pos < (( ptr - wctx -> buf ) + 9 + CHKSUM_LEN + ( rec_count * 2 )) ) {
609610 int res = write_page (wctx , wctx -> cur_write_page , page_size );
610611 if (res )
611612 return res ;
612613 wctx -> cur_write_page ++ ;
613614 init_bt_tbl_leaf (wctx -> buf );
614615 last_pos = page_size - wctx -> page_resv_bytes - new_rec_len - len_of_rec_len_rowid ;
615- rec_count = 1 ;
616616 }
617617 }
618618 return last_pos ;
@@ -657,21 +657,23 @@ int uls_append_row_with_values(struct uls_write_context *wctx,
657657
658658 wctx -> cur_write_rowid ++ ;
659659 byte * ptr = wctx -> buf + (wctx -> buf [0 ] == 13 ? 0 : 100 );
660- int rec_count = read_uint16 (ptr + 3 ) + 1 ;
661660 int32_t page_size = get_pagesize (wctx -> page_size_exp );
662661 uint16_t len_of_rec_len_rowid = LEN_OF_REC_LEN + get_vlen_of_uint32 (wctx -> cur_write_rowid );
663- uint16_t new_rec_len = LEN_OF_HDR_LEN ;
662+ uint16_t new_rec_len = 0 ;
663+ uint16_t hdr_len = LEN_OF_HDR_LEN ;
664664 for (int i = 0 ; i < wctx -> col_count ; i ++ ) {
665665 if (values [i ] != NULL )
666- new_rec_len += lengths [i ];
666+ new_rec_len += ( types [ i ] == ULS_TYPE_REAL ? 8 : lengths [i ]) ;
667667 uint32_t col_type = derive_col_type_or_len (types [i ], values [i ], lengths [i ]);
668- new_rec_len += get_vlen_of_uint32 (col_type );
668+ hdr_len += get_vlen_of_uint32 (col_type );
669669 }
670- uint16_t last_pos = check_space_for_new_row (wctx , page_size ,
671- rec_count , len_of_rec_len_rowid , new_rec_len );
670+ new_rec_len += hdr_len ;
671+ uint16_t last_pos = make_space_for_new_row (wctx , page_size ,
672+ len_of_rec_len_rowid , new_rec_len );
673+ int rec_count = read_uint16 (ptr + 3 ) + 1 ;
672674
673675 write_rec_len_rowid_hdr_len (wctx -> buf + last_pos , new_rec_len ,
674- wctx -> cur_write_rowid , wctx -> col_count + LEN_OF_HDR_LEN );
676+ wctx -> cur_write_rowid , hdr_len );
675677 byte * rec_ptr = wctx -> buf + last_pos + len_of_rec_len_rowid + LEN_OF_HDR_LEN ;
676678 for (int i = 0 ; i < wctx -> col_count ; i ++ ) {
677679 uint32_t col_type = derive_col_type_or_len (types [i ], values [i ], lengths [i ]);
@@ -691,17 +693,17 @@ int uls_append_row_with_values(struct uls_write_context *wctx,
691693}
692694
693695// See .h file for API description
694- int uls_append_row (struct uls_write_context * wctx ) {
696+ int uls_append_empty_row (struct uls_write_context * wctx ) {
695697
696698 wctx -> cur_write_rowid ++ ;
697699 byte * ptr = wctx -> buf + (wctx -> buf [0 ] == 13 ? 0 : 100 );
698- int rec_count = read_uint16 (ptr + 3 ) + 1 ;
699700 int32_t page_size = get_pagesize (wctx -> page_size_exp );
700701 uint16_t len_of_rec_len_rowid = LEN_OF_REC_LEN + get_vlen_of_uint32 (wctx -> cur_write_rowid );
701702 uint16_t new_rec_len = wctx -> col_count ;
702703 new_rec_len += LEN_OF_HDR_LEN ;
703- uint16_t last_pos = check_space_for_new_row (wctx , page_size ,
704- rec_count , len_of_rec_len_rowid , new_rec_len );
704+ uint16_t last_pos = make_space_for_new_row (wctx , page_size ,
705+ len_of_rec_len_rowid , new_rec_len );
706+ int rec_count = read_uint16 (ptr + 3 ) + 1 ;
705707
706708 memset (wctx -> buf + last_pos , '\0' , new_rec_len + len_of_rec_len_rowid );
707709 write_rec_len_rowid_hdr_len (wctx -> buf + last_pos , new_rec_len ,
@@ -931,7 +933,7 @@ int uls_init_for_append(struct uls_write_context *wctx) {
931933 res = read_bytes_wctx (wctx , wctx -> buf , wctx -> cur_write_page * page_size , page_size );
932934 if (res )
933935 return res ;
934- res = uls_append_row (wctx );
936+ res = uls_append_empty_row (wctx );
935937 if (res )
936938 return res ;
937939 return ULS_RES_OK ;
0 commit comments