354
354
isolation_level= tx_isolation_to_ib_trx_level((enum_tx_isolation)session_tx_isolation(session));
355
355
*transaction= ib_trx_begin(isolation_level);
357
return *transaction == NULL;
360
360
void HailDBEngine::doStartStatement(Session *session)
821
821
int HailDBCursor::open(const char *name, int, uint32_t)
823
823
const char* haildb_table_name= table_path_to_haildb_name(name);
824
ib_err_t err= ib_cursor_open_table(haildb_table_name, NULL, &cursor);
824
ib_err_t err= ib_table_get_id(haildb_table_name, &table_id);
825
825
bool has_hidden_primary_key= false;
828
828
if (err != DB_SUCCESS)
829
829
return ib_err_t_to_drizzle_error(err);
831
err= ib_cursor_open_table_using_id(table_id, NULL, &cursor);
832
cursor_is_sec_index= false;
834
if (err != DB_SUCCESS)
835
return ib_err_t_to_drizzle_error(err);
831
837
err= ib_index_get_id(haildb_table_name, "HIDDEN_PRIMARY", &idx_id);
833
839
if (err == DB_SUCCESS)
1889
1895
tuple= ib_clust_read_tuple_create(cursor);
1891
ib_cursor_attach_trx(cursor, transaction);
1897
if (cursor_is_sec_index)
1899
err= ib_cursor_close(cursor);
1900
assert(err == DB_SUCCESS);
1902
err= ib_cursor_open_table_using_id(table_id, transaction, &cursor);
1904
if (err != DB_SUCCESS)
1905
return ib_err_t_to_drizzle_error(err);
1907
cursor_is_sec_index= false;
1911
ib_cursor_attach_trx(cursor, transaction);
1893
1914
err= ib_cursor_first(cursor);
1894
1915
if (current_session->lex->sql_command == SQLCOM_CREATE_TABLE
2011
2032
if (tuple == NULL)
2013
2034
ib_trx_t transaction= *get_trx(getTable()->in_use);
2014
ib_cursor_attach_trx(cursor, transaction);
2036
if (cursor_is_sec_index)
2038
err= ib_cursor_close(cursor);
2039
assert(err == DB_SUCCESS);
2041
err= ib_cursor_open_table_using_id(table_id, transaction, &cursor);
2043
if (err != DB_SUCCESS)
2044
return ib_err_t_to_drizzle_error(err);
2045
cursor_is_sec_index= false;
2049
ib_cursor_attach_trx(cursor, transaction);
2016
2052
store_key_value_from_haildb(getTable()->key_info + getTable()->getShare()->getPrimaryKey(),
2017
2053
ref, ref_length, old_data);
2058
2094
advance_cursor= true;
2060
if (err == DB_SUCCESS)
2062
else if (err == DB_DUPLICATE_KEY)
2063
return HA_ERR_FOUND_DUPP_KEY;
2096
return ib_err_t_to_drizzle_error(err);
2068
2099
int HailDBCursor::doDeleteRecord(const unsigned char *)
2103
assert(ib_cursor_is_positioned(cursor) == IB_TRUE);
2072
2104
err= ib_cursor_delete_row(cursor);
2073
if (err != DB_SUCCESS)
2076
2106
advance_cursor= true;
2108
return ib_err_t_to_drizzle_error(err);
2080
2111
int HailDBCursor::delete_all_rows(void)
2082
2113
/* I *think* ib_truncate is non-transactional....
2083
2114
so only support TRUNCATE and not DELETE FROM t;
2084
(this is what ha_haildb does)
2115
(this is what ha_innodb does)
2086
2117
if (session_sql_command(getTable()->in_use) != SQLCOM_TRUNCATE)
2087
2118
return HA_ERR_WRONG_COMMAND;
2092
2123
ib_trx_t transaction= ib_trx_begin(IB_TRX_REPEATABLE_READ);
2094
ib_cursor_attach_trx(cursor, transaction);
2125
if (cursor_is_sec_index)
2127
err= ib_cursor_close(cursor);
2128
assert(err == DB_SUCCESS);
2130
err= ib_cursor_open_table_using_id(table_id, transaction, &cursor);
2132
if (err != DB_SUCCESS)
2133
return ib_err_t_to_drizzle_error(err);
2134
cursor_is_sec_index= false;
2138
ib_cursor_attach_trx(cursor, transaction);
2096
2141
err= ib_schema_lock_exclusive(transaction);
2097
2142
if (err != DB_SUCCESS)
2127
2172
ib_schema_unlock(transaction);
2128
2173
ib_err_t rollback_err= ib_trx_rollback(transaction);
2129
2174
assert(rollback_err == DB_SUCCESS);
2175
return ib_err_t_to_drizzle_error(err);
2133
2178
int HailDBCursor::doStartTableScan(bool)
2180
ib_err_t err= DB_SUCCESS;
2136
2181
ib_trx_t transaction;
2138
2183
if (in_table_scan)
2144
2189
assert(transaction != NULL);
2146
ib_cursor_attach_trx(cursor, transaction);
2191
if (cursor_is_sec_index)
2193
err= ib_cursor_close(cursor);
2194
assert(err == DB_SUCCESS);
2196
err= ib_cursor_open_table_using_id(table_id, transaction, &cursor);
2197
cursor_is_sec_index= false;
2201
ib_cursor_attach_trx(cursor, transaction);
2204
if (err != DB_SUCCESS)
2205
return ib_err_t_to_drizzle_error(err);
2148
2207
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2149
2208
assert(err == DB_SUCCESS); // FIXME
2172
2231
err= ib_cursor_read_row(cursor, tuple);
2174
if (err != DB_SUCCESS) // FIXME
2233
if (err == DB_RECORD_NOT_FOUND)
2175
2234
return HA_ERR_END_OF_FILE;
2235
if (err != DB_SUCCESS)
2236
return ib_err_t_to_drizzle_error(err);
2183
2244
for (Field **field= table->getFields() ; *field ; field++, colnr++)
2185
2246
if (! (**field).isReadSet())
2247
(**field).setReadSet(); /* Fucking broken API screws us royally. */
2188
2249
(**field).move_field_offset(row_offset);
2256
2319
return previous_error;
2258
2321
if (advance_cursor)
2259
2323
err= ib_cursor_next(cursor);
2324
if (err != DB_SUCCESS)
2325
return ib_err_t_to_drizzle_error(err);
2261
2328
tuple= ib_tuple_clear(tuple);
2262
2329
ret= read_row_from_haildb(buf, cursor, tuple, getTable(),
2292
2359
err= ib_col_set_value(search_tuple, 0,
2293
2360
((uint64_t*)(pos)), sizeof(uint64_t));
2361
if (err != DB_SUCCESS)
2362
return ib_err_t_to_drizzle_error(err);
2308
2377
err= ib_cursor_moveto(cursor, search_tuple, IB_CUR_GE, &res);
2309
assert(err == DB_SUCCESS);
2378
if (err != DB_SUCCESS)
2379
return ib_err_t_to_drizzle_error(err);
2311
2381
assert(res==0);
2462
2532
int HailDBCursor::doStartIndexScan(uint32_t keynr, bool)
2464
2535
ib_trx_t transaction= *get_trx(getTable()->in_use);
2466
2537
active_index= keynr;
2468
ib_cursor_attach_trx(cursor, transaction);
2470
2539
if (active_index == 0 && ! share->has_hidden_primary_key)
2541
if (cursor_is_sec_index)
2543
err= ib_cursor_close(cursor);
2544
assert(err == DB_SUCCESS);
2546
err= ib_cursor_open_table_using_id(table_id, transaction, &cursor);
2548
if (err != DB_SUCCESS)
2549
return ib_err_t_to_drizzle_error(err);
2554
ib_cursor_attach_trx(cursor, transaction);
2557
cursor_is_sec_index= false;
2472
2558
tuple= ib_clust_read_tuple_create(cursor);
2477
2562
ib_id_t index_id;
2478
2563
err= ib_index_get_id(table_path_to_haildb_name(getShare()->getPath()),
2479
2564
getShare()->getKeyInfo(keynr).name,
2481
2566
if (err != DB_SUCCESS)
2567
return ib_err_t_to_drizzle_error(err);
2484
2569
err= ib_cursor_close(cursor);
2485
2570
assert(err == DB_SUCCESS);
2486
2572
err= ib_cursor_open_index_using_id(index_id, transaction, &cursor);
2488
2574
if (err != DB_SUCCESS)
2575
return ib_err_t_to_drizzle_error(err);
2577
cursor_is_sec_index= true;
2491
2579
tuple= ib_clust_read_tuple_create(cursor);
2492
2580
ib_cursor_set_cluster_access(cursor);
2495
ib_err_t err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2583
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2496
2584
assert(err == DB_SUCCESS);
2498
2586
advance_cursor= false;