821
818
int HailDBCursor::open(const char *name, int, uint32_t)
823
820
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);
821
ib_err_t err= ib_cursor_open_table(haildb_table_name, NULL, &cursor);
825
822
bool has_hidden_primary_key= false;
828
825
if (err != DB_SUCCESS)
829
826
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
828
err= ib_index_get_id(haildb_table_name, "HIDDEN_PRIMARY", &idx_id);
839
830
if (err == DB_SUCCESS)
1785
1776
return("BTREE");
1788
static ib_err_t write_row_to_haildb_tuple(const unsigned char* buf,
1789
Field **fields, ib_tpl_t tuple)
1779
static ib_err_t write_row_to_haildb_tuple(Field **fields, ib_tpl_t tuple)
1792
1782
ib_err_t err= DB_ERROR;
1793
ptrdiff_t row_offset= buf - (*fields)->getTable()->getInsertRecord();
1795
1784
for (Field **field= fields; *field; field++, colnr++)
1797
(**field).move_field_offset(row_offset);
1799
1786
if (! (**field).isWriteSet() && (**field).is_null())
1801
(**field).move_field_offset(-row_offset);
1805
1789
if ((**field).is_null())
1807
1791
err= ib_col_set_value(tuple, colnr, NULL, IB_SQL_NULL);
1808
1792
assert(err == DB_SUCCESS);
1809
(**field).move_field_offset(-row_offset);
1895
1876
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);
1878
ib_cursor_attach_trx(cursor, transaction);
1914
1880
err= ib_cursor_first(cursor);
1915
1881
if (current_session->lex->sql_command == SQLCOM_CREATE_TABLE
2015
1981
tuple= ib_tuple_clear(tuple);
2016
1982
ib_tuple_delete(tuple);
2018
1983
err= ib_cursor_reset(cursor);
2023
int HailDBCursor::doUpdateRecord(const unsigned char *old_data,
2024
unsigned char *new_data)
1988
int HailDBCursor::doUpdateRecord(const unsigned char *,
2026
1991
ib_tpl_t update_tuple;
2028
bool created_tuple= false;
2030
1994
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
1996
err= ib_tuple_copy(update_tuple, tuple);
2077
1997
assert(err == DB_SUCCESS);
2079
write_row_to_haildb_tuple(new_data, getTable()->getFields(), update_tuple);
1999
write_row_to_haildb_tuple(getTable()->getFields(), update_tuple);
2081
2001
err= ib_cursor_update_row(cursor, tuple, update_tuple);
2083
2003
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
2005
advance_cursor= true;
2096
return ib_err_t_to_drizzle_error(err);
2007
if (err == DB_SUCCESS)
2009
else if (err == DB_DUPLICATE_KEY)
2010
return HA_ERR_FOUND_DUPP_KEY;
2099
2015
int HailDBCursor::doDeleteRecord(const unsigned char *)
2103
assert(ib_cursor_is_positioned(cursor) == IB_TRUE);
2104
2019
err= ib_cursor_delete_row(cursor);
2020
if (err != DB_SUCCESS)
2106
2023
advance_cursor= true;
2108
return ib_err_t_to_drizzle_error(err);
2111
2027
int HailDBCursor::delete_all_rows(void)
2113
2029
/* I *think* ib_truncate is non-transactional....
2114
2030
so only support TRUNCATE and not DELETE FROM t;
2115
(this is what ha_innodb does)
2031
(this is what ha_haildb does)
2117
2033
if (session_sql_command(getTable()->in_use) != SQLCOM_TRUNCATE)
2118
2034
return HA_ERR_WRONG_COMMAND;
2123
2039
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);
2041
ib_cursor_attach_trx(cursor, transaction);
2141
2043
err= ib_schema_lock_exclusive(transaction);
2142
2044
if (err != DB_SUCCESS)
2189
2091
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);
2093
ib_cursor_attach_trx(cursor, transaction);
2207
2095
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2208
2096
assert(err == DB_SUCCESS); // FIXME
2505
2380
if (flag & HA_STATUS_AUTO)
2506
2381
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
2385
int HailDBCursor::doStartIndexScan(uint32_t keynr, bool)
2535
2387
ib_trx_t transaction= *get_trx(getTable()->in_use);
2537
2389
active_index= keynr;
2391
ib_cursor_attach_trx(cursor, transaction);
2539
2393
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
2395
tuple= ib_clust_read_tuple_create(cursor);
2562
2400
ib_id_t index_id;
2563
2401
err= ib_index_get_id(table_path_to_haildb_name(getShare()->getPath()),
2564
2402
getShare()->getKeyInfo(keynr).name,
2566
2404
if (err != DB_SUCCESS)
2567
return ib_err_t_to_drizzle_error(err);
2569
2407
err= ib_cursor_close(cursor);
2570
2408
assert(err == DB_SUCCESS);
2572
2409
err= ib_cursor_open_index_using_id(index_id, transaction, &cursor);
2574
2411
if (err != DB_SUCCESS)
2575
return ib_err_t_to_drizzle_error(err);
2577
cursor_is_sec_index= true;
2579
2414
tuple= ib_clust_read_tuple_create(cursor);
2580
2415
ib_cursor_set_cluster_access(cursor);
2583
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2418
ib_err_t err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2584
2419
assert(err == DB_SUCCESS);
2586
2421
advance_cursor= false;
3000
2835
static additional_mem_pool_constraint innobase_additional_mem_pool_size;
3001
2836
static bool innobase_use_checksums= true;
3002
2837
typedef constrained_check<unsigned int, UINT_MAX, 100> io_capacity_constraint;
3003
typedef constrained_check<uint32_t, 2, 0> trinary_constraint;
2838
typedef constrained_check<uint16_t, 2, 0> trinary_constraint;
3004
2839
static trinary_constraint innobase_fast_shutdown;
3005
2840
static trinary_constraint srv_flush_log_at_trx_commit;
3006
typedef constrained_check<uint32_t, 6, 0> force_recovery_constraint;
2841
typedef constrained_check<uint16_t, 6, 0> force_recovery_constraint;
3007
2842
static force_recovery_constraint innobase_force_recovery;
3008
2843
typedef constrained_check<int64_t, INT64_MAX, 1024*1024, 1024*1024> log_file_constraint;
3009
2844
static log_file_constraint haildb_log_file_size;
3076
extern "C" int haildb_errmsg_callback(ib_msg_stream_t, const char *fmt, ...);
3079
extern bool volatile shutdown_in_progress;
3082
extern "C" int haildb_errmsg_callback(ib_msg_stream_t, const char *fmt, ...)
3086
va_start(args, fmt);
3087
if (! shutdown_in_progress)
3088
r= plugin::ErrorMessage::vprintf(NULL, ERRMSG_LVL_WARN, fmt, args);
3090
vfprintf(stderr, fmt, args);
3096
2912
static int haildb_init(drizzled::module::Context &context)
3298
3113
context.registerVariable(new sys_var_const_string_val("data_home_dir",
3299
3114
vm["data-home-dir"].as<string>()));
3300
3115
context.registerVariable(new sys_var_constrained_value_readonly<unsigned int>("io_capacity", srv_io_capacity));
3301
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("fast_shutdown", innobase_fast_shutdown));
3116
context.registerVariable(new sys_var_constrained_value_readonly<uint16_t>("fast_shutdown", innobase_fast_shutdown));
3302
3117
context.registerVariable(new sys_var_bool_ptr_readonly("file_per_table",
3303
3118
&srv_file_per_table));
3304
3119
context.registerVariable(new sys_var_bool_ptr_readonly("rollback_on_timeout",
3313
3128
context.registerVariable(new sys_var_std_string("file_format",
3314
3129
innobase_file_format_name,
3315
3130
haildb_file_format_name_validate));
3316
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("flush_log_at_trx_commit", srv_flush_log_at_trx_commit));
3131
context.registerVariable(new sys_var_constrained_value_readonly<uint16_t>("flush_log_at_trx_commit", srv_flush_log_at_trx_commit));
3317
3132
context.registerVariable(new sys_var_const_string_val("flush_method",
3318
3133
vm.count("flush-method") ? vm["flush-method"].as<string>() : ""));
3319
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("force_recovery", innobase_force_recovery));
3134
context.registerVariable(new sys_var_constrained_value_readonly<uint16_t>("force_recovery", innobase_force_recovery));
3320
3135
context.registerVariable(new sys_var_const_string_val("log_group_home_dir",
3321
3136
vm.count("log-group-home-dir") ? vm["log-group-home-dir"].as<string>() : ""));
3322
3137
context.registerVariable(new sys_var_constrained_value<int64_t>("log_file_size", haildb_log_file_size));