537
537
else if (strcmp(name, "type") == 0) {
538
538
u_long lvalue = 0;
540
sscanf(value, "%lu", &lvalue);
541
td->td_tab_type = (xtWord1) lvalue;
540
sscanf(value, "%lu", &lvalue);
541
td->td_tab_type = (xtWord1) lvalue;
543
543
else if (strcmp(name, "[table]") == 0)
1582
static void tab_init_row_file(XTThreadPtr self, XTOpenFilePtr of_row, XTTableHPtr tab, XTDictionaryPtr)
1582
static void tab_init_row_file(XTThreadPtr self, XTOpenFilePtr of_row, XTTableHPtr tab, XTDictionaryPtr XT_UNUSED(dic))
1584
1584
XTTabRowHeadDRec row_head;
4442
4442
u_int next_off_page = 0;
4445
static xtBool tab_write_ext_record(XTOpenTablePtr XT_UNUSED(ot), XTTableHPtr tab, XTTabRecInfoPtr rec_info, xtRecordID rec_id, xtLogID log_id, xtLogOffset log_offset, XTThreadPtr thread)
4447
xtWord1 tmp_buffer[offsetof(XTactExtRecEntryDRec, er_data)];
4450
memcpy(tmp_buffer, rec_info->ri_log_buf, sizeof(tmp_buffer));
4451
rec_info->ri_log_buf->er_status_1 = XT_LOG_ENT_EXT_REC_OK;
4452
XT_SET_DISK_4(rec_info->ri_log_buf->er_data_size_4, rec_info->ri_log_data_size);
4453
XT_SET_DISK_4(rec_info->ri_log_buf->er_tab_id_4, tab->tab_id);
4454
XT_SET_DISK_4(rec_info->ri_log_buf->er_rec_id_4, rec_id);
4455
if (tab->tab_dic.dic_tab_flags & XT_TF_MEMORY_TABLE)
4456
ok = xt_tab_save_ext_record(tab, log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info->ri_log_data_size, (xtWord1 *) rec_info->ri_log_buf);
4458
ok = thread->st_dlog_buf.dlb_append_log(log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info->ri_log_data_size, (xtWord1 *) rec_info->ri_log_buf, thread);
4459
memcpy(rec_info->ri_log_buf, tmp_buffer, sizeof(tmp_buffer));
4445
4463
static xtBool tab_add_record(XTOpenTablePtr ot, XTTabRecInfoPtr rec_info, u_int status)
4447
4465
register XTTableHPtr tab = ot->ot_table;
4549
4567
read = ((rec_id - 1) % tab->tab_recs.tci_rows_per_page) != 0;
4551
if (!tab->tab_recs.xt_tc_write(ot->ot_rec_file, rec_id, 0, rec_info->ri_rec_buf_size, (xtWord1 *) rec_info->ri_fix_rec_buf, &op_seq, read, ot->ot_thread)) {
4569
if (!tab->tab_recs.xt_tc_write(ot->ot_rec_file, rec_id, 0, rec_info->ri_rec_buf_size, (xtWord1 *) rec_info->ri_fix_rec_buf, &op_seq, read, thread)) {
4552
4570
xt_unlock_mutex_ns(&tab->tab_rec_lock);
4556
4574
xt_unlock_mutex_ns(&tab->tab_rec_lock);
4558
if (!xt_xlog_modify_table(tab->tab_id, status, op_seq, 0, next_rec_id, rec_id, rec_info->ri_rec_buf_size, (xtWord1 *) rec_info->ri_fix_rec_buf, ot->ot_thread))
4576
if (!xt_xlog_modify_table(tab->tab_id, status, op_seq, 0, next_rec_id, rec_id, rec_info->ri_rec_buf_size, (xtWord1 *) rec_info->ri_fix_rec_buf, thread))
4561
4579
if (rec_info->ri_ext_rec) {
4562
4580
/* Write the log buffer overflow: */
4563
rec_info->ri_log_buf->er_status_1 = XT_LOG_ENT_EXT_REC_OK;
4564
XT_SET_DISK_4(rec_info->ri_log_buf->er_data_size_4, rec_info->ri_log_data_size);
4565
XT_SET_DISK_4(rec_info->ri_log_buf->er_tab_id_4, tab->tab_id);
4566
XT_SET_DISK_4(rec_info->ri_log_buf->er_rec_id_4, rec_id);
4567
if (tab->tab_dic.dic_tab_flags & XT_TF_MEMORY_TABLE) {
4568
if (!xt_tab_save_ext_record(tab, log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info->ri_log_data_size, (xtWord1 *) rec_info->ri_log_buf))
4572
if (!thread->st_dlog_buf.dlb_append_log(log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info->ri_log_data_size, (xtWord1 *) rec_info->ri_log_buf, ot->ot_thread)) {
4573
/* Failed to write the overflow, free the record allocated above: */
4581
if (!tab_write_ext_record(ot, tab, rec_info, rec_id, log_id, log_offset, thread))
4579
4585
XT_DISABLED_TRACE(("new rec tx=%d val=%d\n", (int) thread->st_xact_data->xd_start_xn_id, (int) rec_id));
4584
static void tab_delete_record_on_fail(XTOpenTablePtr ot, xtRowID row_id, xtRecordID rec_id, XTTabRecHeadDPtr row_ptr, xtWord1 *rec_data, u_int key_count)
4590
static void tab_delete_record_on_fail(XTOpenTablePtr ot, xtRowID row_id, xtRecordID rec_id, XTTabRecHeadDPtr XT_UNUSED(row_ptr), xtWord1 *rec_data, u_int key_count)
4586
4592
XTExceptionRec e;
4587
4593
xtBool log_err = TRUE;
4618
/* This is not required because the extended record will be free
4619
* later when the record is freed!
4612
4620
if (row_ptr->tr_rec_type_1 == XT_TAB_STATUS_EXT_DLOG || row_ptr->tr_rec_type_1 == XT_TAB_STATUS_EXT_CLEAN)
4613
4621
tab_free_ext_record_on_fail(ot, rec_id, (XTTabRecExtDPtr) row_ptr, log_err);
4615
4624
rec_info.ri_fix_rec_buf = (XTTabRecFixDPtr) ot->ot_row_wbuffer;
4616
4625
rec_info.ri_rec_buf_size = offsetof(XTTabRecFixDRec, rf_data);
5026
if (!thread->st_dlog_buf.dlb_get_log_offset(&log_id, &log_offset, rec_info->ri_log_data_size + offsetof(XTactExtRecEntryDRec, er_data), ot->ot_thread))
5039
if (!thread->st_dlog_buf.dlb_get_log_offset(&log_id, &log_offset, rec_info->ri_log_data_size + offsetof(XTactExtRecEntryDRec, er_data), thread))
5029
5042
XT_SET_LOG_REF(rec_info->ri_ext_rec, log_id, log_offset);
5035
5048
if (rec_info->ri_ext_rec) {
5036
5049
/* Write the log buffer overflow: */
5037
rec_info->ri_log_buf->er_status_1 = XT_LOG_ENT_EXT_REC_OK;
5038
XT_SET_DISK_4(rec_info->ri_log_buf->er_data_size_4, rec_info->ri_log_data_size);
5039
XT_SET_DISK_4(rec_info->ri_log_buf->er_tab_id_4, tab->tab_id);
5040
XT_SET_DISK_4(rec_info->ri_log_buf->er_rec_id_4, rec_id);
5042
if (tab->tab_dic.dic_tab_flags & XT_TF_MEMORY_TABLE) {
5043
if (!xt_tab_save_ext_record(tab, log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info->ri_log_data_size, (xtWord1 *) rec_info->ri_log_buf))
5047
if (!thread->st_dlog_buf.dlb_append_log(log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info->ri_log_data_size, (xtWord1 *) rec_info->ri_log_buf, ot->ot_thread))
5050
if (!tab_write_ext_record(ot, tab, rec_info, rec_id, log_id, log_offset, thread))
5052
5054
/* Put the index entries back: */
5097
if (!self->st_dlog_buf.dlb_get_log_offset(&log_id, &log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info.ri_log_data_size, ot->ot_thread))
5103
if (!self->st_dlog_buf.dlb_get_log_offset(&log_id, &log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info.ri_log_data_size, self))
5100
5106
XT_SET_LOG_REF(rec_info.ri_ext_rec, log_id, log_offset);
5122
5128
if (rec_info.ri_ext_rec) {
5123
5129
/* Write the log buffer overflow: */
5124
rec_info.ri_log_buf->er_status_1 = XT_LOG_ENT_EXT_REC_OK;
5125
XT_SET_DISK_4(rec_info.ri_log_buf->er_data_size_4, rec_info.ri_log_data_size);
5126
XT_SET_DISK_4(rec_info.ri_log_buf->er_tab_id_4, tab->tab_id);
5127
XT_SET_DISK_4(rec_info.ri_log_buf->er_rec_id_4, rec_id);
5128
if (tab->tab_dic.dic_tab_flags & XT_TF_MEMORY_TABLE) {
5129
if (!xt_tab_save_ext_record(tab, log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info.ri_log_data_size, (xtWord1 *) rec_info.ri_log_buf))
5133
if (!self->st_dlog_buf.dlb_append_log(log_id, log_offset, offsetof(XTactExtRecEntryDRec, er_data) + rec_info.ri_log_data_size, (xtWord1 *) rec_info.ri_log_buf, ot->ot_thread))
5130
if (!tab_write_ext_record(ot, tab, &rec_info, rec_id, log_id, log_offset, self))
5138
5134
/* Add the index references that have changed: */
5247
5243
row_id = ot->ot_curr_row_id;
5248
5244
self = ot->ot_thread;
5246
/* A non-temporary table has been updated: */
5247
if (!XT_IS_TEMP_TABLE(tab->tab_dic.dic_tab_flags))
5248
self->st_non_temp_updated = TRUE;
5250
5250
if (!myxt_store_row(ot, &rec_info, (char *) after_buf))
5262
5262
/* Link the new variation into the list: */
5263
XT_TAB_ROW_WRITE_LOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], ot->ot_thread);
5263
XT_TAB_ROW_WRITE_LOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], self);
5265
5265
if (!xt_tab_get_row(ot, row_id, &curr_var_rec_id))
5287
5287
XT_DISABLED_TRACE(("set upd tx=%d row=%d rec=%d\n", (int) self->st_xact_data->xd_start_xn_id, (int) row_id, (int) rec_info.ri_rec_id));
5289
XT_TAB_ROW_UNLOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], ot->ot_thread);
5289
XT_TAB_ROW_UNLOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], self);
5291
5291
/* Add the index references: */
5292
5292
for (idx_cnt=0, ind=tab->tab_dic.dic_keys; idx_cnt<tab->tab_dic.dic_key_count; idx_cnt++, ind++) {
5318
5318
xtPublic xtBool xt_tab_delete_record(XTOpenTablePtr ot, xtWord1 *rec_buf)
5320
5320
register XTTableHPtr tab = ot->ot_table;
5321
register XTThreadPtr thread = ot->ot_thread;
5321
5322
xtRowID row_id = ot->ot_curr_row_id;
5322
5323
xtRecordID curr_var_rec_id;
5323
5324
XTTabRecInfoRec rec_info;
5326
/* A non-temporary table has been updated: */
5327
if (!XT_IS_TEMP_TABLE(tab->tab_dic.dic_tab_flags))
5328
thread->st_non_temp_updated = TRUE;
5325
5330
/* Setup a delete record: */
5326
5331
rec_info.ri_fix_rec_buf = (XTTabRecFixDPtr) ot->ot_row_wbuffer;
5327
5332
rec_info.ri_rec_buf_size = offsetof(XTTabRecFixDRec, rf_data);
5330
5335
rec_info.ri_fix_rec_buf->tr_stat_id_1 = 0;
5331
5336
XT_SET_DISK_4(rec_info.ri_fix_rec_buf->tr_row_id_4, row_id);
5332
5337
XT_SET_DISK_4(rec_info.ri_fix_rec_buf->tr_prev_rec_id_4, ot->ot_curr_rec_id);
5333
XT_SET_DISK_4(rec_info.ri_fix_rec_buf->tr_xact_id_4, ot->ot_thread->st_xact_data->xd_start_xn_id);
5338
XT_SET_DISK_4(rec_info.ri_fix_rec_buf->tr_xact_id_4, thread->st_xact_data->xd_start_xn_id);
5335
5340
if (!tab_add_record(ot, &rec_info, XT_LOG_ENT_DELETE))
5338
XT_TAB_ROW_WRITE_LOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], ot->ot_thread);
5343
XT_TAB_ROW_WRITE_LOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], thread);
5340
5345
if (!xt_tab_get_row(ot, row_id, &curr_var_rec_id))
5348
5353
#ifdef TRACE_VARIATIONS
5349
xt_ttracef(ot->ot_thread, "update: row=%d rec=%d T%d\n", (int) row_id, (int) rec_info.ri_rec_id, (int) ot->ot_thread->st_xact_data->xd_start_xn_id);
5354
xt_ttracef(thread, "update: row=%d rec=%d T%d\n", (int) row_id, (int) rec_info.ri_rec_id, (int) thread->st_xact_data->xd_start_xn_id);
5351
5356
if (!xt_tab_set_row(ot, XT_LOG_ENT_ROW_ADD_REC, row_id, rec_info.ri_rec_id))
5353
XT_DISABLED_TRACE(("del row tx=%d row=%d rec=%d\n", (int) ot->ot_thread->st_xact_data->xd_start_xn_id, (int) row_id, (int) rec_info.ri_rec_id));
5358
XT_DISABLED_TRACE(("del row tx=%d row=%d rec=%d\n", (int) thread->st_xact_data->xd_start_xn_id, (int) row_id, (int) rec_info.ri_rec_id));
5355
XT_TAB_ROW_UNLOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], ot->ot_thread);
5360
XT_TAB_ROW_UNLOCK(&tab->tab_row_rwlock[row_id % XT_ROW_RWLOCKS], thread);
5357
5362
if (ot->ot_table->tab_dic.dic_table->dt_trefs) {
5358
5363
if (!ot->ot_table->tab_dic.dic_table->deleteRow(ot, rec_buf))
5362
ot->ot_thread->st_statistics.st_row_delete++;
5367
thread->st_statistics.st_row_delete++;
5880
5885
* EXTENDED DATA FOR RAM TABLES
5883
xtPublic xtBool xt_tab_get_ext_slot(XTTableHPtr tab, xtLogID *log_id, xtLogOffset *log_offset, size_t /*req_size*/)
5888
xtPublic xtBool xt_tab_get_ext_slot(XTTableHPtr tab, xtLogID *log_id, xtLogOffset *log_offset, size_t XT_UNUSED(req_size))
5885
5890
size_t new_slot;