821
820
int HailDBCursor::open(const char *name, int, uint32_t)
823
822
const char* haildb_table_name= table_path_to_haildb_name(name);
824
ib_err_t err= ib_table_get_id(haildb_table_name, &table_id);
823
ib_err_t err= ib_cursor_open_table(haildb_table_name, NULL, &cursor);
825
824
bool has_hidden_primary_key= false;
828
827
if (err != DB_SUCCESS)
829
828
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);
837
830
err= ib_index_get_id(haildb_table_name, "HIDDEN_PRIMARY", &idx_id);
839
832
if (err == DB_SUCCESS)
1785
1778
return("BTREE");
1788
static ib_err_t write_row_to_haildb_tuple(const unsigned char* buf,
1789
Field **fields, ib_tpl_t tuple)
1781
static ib_err_t write_row_to_haildb_tuple(Field **fields, ib_tpl_t tuple)
1792
1784
ib_err_t err= DB_ERROR;
1793
ptrdiff_t row_offset= buf - (*fields)->getTable()->getInsertRecord();
1795
1786
for (Field **field= fields; *field; field++, colnr++)
1797
(**field).move_field_offset(row_offset);
1799
1788
if (! (**field).isWriteSet() && (**field).is_null())
1801
(**field).move_field_offset(-row_offset);
1805
1791
if ((**field).is_null())
1807
1793
err= ib_col_set_value(tuple, colnr, NULL, IB_SQL_NULL);
1808
1794
assert(err == DB_SUCCESS);
1809
(**field).move_field_offset(-row_offset);
1895
1878
tuple= ib_clust_read_tuple_create(cursor);
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);
1880
ib_cursor_attach_trx(cursor, transaction);
1914
1882
err= ib_cursor_first(cursor);
1915
1883
if (current_session->lex->sql_command == SQLCOM_CREATE_TABLE
2015
1983
tuple= ib_tuple_clear(tuple);
2016
1984
ib_tuple_delete(tuple);
2018
1985
err= ib_cursor_reset(cursor);
2023
int HailDBCursor::doUpdateRecord(const unsigned char *old_data,
2024
unsigned char *new_data)
1990
int HailDBCursor::doUpdateRecord(const unsigned char *,
2026
1993
ib_tpl_t update_tuple;
2028
bool created_tuple= false;
2030
1996
update_tuple= ib_clust_read_tuple_create(cursor);
2034
ib_trx_t transaction= *get_trx(getTable()->in_use);
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);
2052
store_key_value_from_haildb(getTable()->key_info + getTable()->getShare()->getPrimaryKey(),
2053
ref, ref_length, old_data);
2055
ib_tpl_t search_tuple= ib_clust_search_tuple_create(cursor);
2057
fill_ib_search_tpl_from_drizzle_key(search_tuple,
2058
getTable()->key_info + 0,
2061
err= ib_cursor_set_lock_mode(cursor, IB_LOCK_X);
2062
assert(err == DB_SUCCESS);
2065
err= ib_cursor_moveto(cursor, search_tuple, IB_CUR_GE, &res);
2066
assert(err == DB_SUCCESS);
2068
tuple= ib_clust_read_tuple_create(cursor);
2070
err= ib_cursor_read_row(cursor, tuple);
2071
assert(err == DB_SUCCESS);// FIXME
2073
created_tuple= true;
2076
1998
err= ib_tuple_copy(update_tuple, tuple);
2077
1999
assert(err == DB_SUCCESS);
2079
write_row_to_haildb_tuple(new_data, getTable()->getFields(), update_tuple);
2001
write_row_to_haildb_tuple(getTable()->getFields(), update_tuple);
2081
2003
err= ib_cursor_update_row(cursor, tuple, update_tuple);
2083
2005
ib_tuple_delete(update_tuple);
2087
ib_err_t ib_err= ib_cursor_reset(cursor); //fixme check error
2088
assert(ib_err == DB_SUCCESS);
2089
tuple= ib_tuple_clear(tuple);
2090
ib_tuple_delete(tuple);
2094
2007
advance_cursor= true;
2096
return ib_err_t_to_drizzle_error(err);
2009
if (err == DB_SUCCESS)
2011
else if (err == DB_DUPLICATE_KEY)
2012
return HA_ERR_FOUND_DUPP_KEY;
2099
2017
int HailDBCursor::doDeleteRecord(const unsigned char *)
2103
assert(ib_cursor_is_positioned(cursor) == IB_TRUE);
2104
2021
err= ib_cursor_delete_row(cursor);
2022
if (err != DB_SUCCESS)
2106
2025
advance_cursor= true;
2108
return ib_err_t_to_drizzle_error(err);
2111
2029
int HailDBCursor::delete_all_rows(void)
2113
2031
/* I *think* ib_truncate is non-transactional....
2114
2032
so only support TRUNCATE and not DELETE FROM t;
2115
(this is what ha_innodb does)
2033
(this is what ha_haildb does)
2117
2035
if (session_sql_command(getTable()->in_use) != SQLCOM_TRUNCATE)
2118
2036
return HA_ERR_WRONG_COMMAND;
2123
2041
ib_trx_t transaction= ib_trx_begin(IB_TRX_REPEATABLE_READ);
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);
2043
ib_cursor_attach_trx(cursor, transaction);
2141
2045
err= ib_schema_lock_exclusive(transaction);
2142
2046
if (err != DB_SUCCESS)
2189
2093
assert(transaction != NULL);
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);
2095
ib_cursor_attach_trx(cursor, transaction);
2207
2097
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2208
2098
assert(err == DB_SUCCESS); // FIXME
2505
2382
if (flag & HA_STATUS_AUTO)
2506
2383
stats.auto_increment_value= 1;
2508
if (flag & HA_STATUS_ERRKEY) {
2509
const char *err_table_name;
2510
const char *err_index_name;
2512
ib_trx_t transaction= *get_trx(getTable()->in_use);
2514
err= ib_get_duplicate_key(transaction, &err_table_name, &err_index_name);
2518
for (unsigned int i = 0; i < getTable()->getShare()->keys; i++)
2520
if (strcmp(err_index_name, getTable()->key_info[i].name) == 0)
2532
2387
int HailDBCursor::doStartIndexScan(uint32_t keynr, bool)
2535
2389
ib_trx_t transaction= *get_trx(getTable()->in_use);
2537
2391
active_index= keynr;
2393
ib_cursor_attach_trx(cursor, transaction);
2539
2395
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;
2558
2397
tuple= ib_clust_read_tuple_create(cursor);
2562
2402
ib_id_t index_id;
2563
2403
err= ib_index_get_id(table_path_to_haildb_name(getShare()->getPath()),
2564
2404
getShare()->getKeyInfo(keynr).name,
2566
2406
if (err != DB_SUCCESS)
2567
return ib_err_t_to_drizzle_error(err);
2569
2409
err= ib_cursor_close(cursor);
2570
2410
assert(err == DB_SUCCESS);
2572
2411
err= ib_cursor_open_index_using_id(index_id, transaction, &cursor);
2574
2413
if (err != DB_SUCCESS)
2575
return ib_err_t_to_drizzle_error(err);
2577
cursor_is_sec_index= true;
2579
2416
tuple= ib_clust_read_tuple_create(cursor);
2580
2417
ib_cursor_set_cluster_access(cursor);
2583
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2420
ib_err_t err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2584
2421
assert(err == DB_SUCCESS);
2586
2423
advance_cursor= false;