22
22
/*****************************************************************************
24
Copyright (c) 2000, 2009, MySQL AB & Innobase Oy. All Rights Reserved.
25
Copyright (c) 2008, 2009 Google Inc.
24
Copyright (C) 2000, 2009, MySQL AB & Innobase Oy. All Rights Reserved.
25
Copyright (C) 2008, 2009 Google Inc.
27
27
Portions of this file contain modifications contributed and copyrighted by
28
28
Google, Inc. Those modifications are gratefully acknowledged and are described
45
45
*****************************************************************************/
46
46
/***********************************************************************
48
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
49
Copyright (c) 2009, Percona Inc.
48
Copyright (C) 1995, 2009, Innobase Oy. All Rights Reserved.
49
Copyright (C) 2009, Percona Inc.
51
51
Portions of this file contain modifications contributed and copyrighted
52
52
by Percona Inc.. Those modifications are
818
821
int HailDBCursor::open(const char *name, int, uint32_t)
820
823
const char* haildb_table_name= table_path_to_haildb_name(name);
821
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);
822
825
bool has_hidden_primary_key= false;
825
828
if (err != DB_SUCCESS)
826
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);
828
837
err= ib_index_get_id(haildb_table_name, "HIDDEN_PRIMARY", &idx_id);
830
839
if (err == DB_SUCCESS)
1776
1785
return("BTREE");
1779
static ib_err_t write_row_to_haildb_tuple(Field **fields, ib_tpl_t tuple)
1788
static ib_err_t write_row_to_haildb_tuple(const unsigned char* buf,
1789
Field **fields, ib_tpl_t tuple)
1782
1792
ib_err_t err= DB_ERROR;
1793
ptrdiff_t row_offset= buf - (*fields)->getTable()->getInsertRecord();
1784
1795
for (Field **field= fields; *field; field++, colnr++)
1797
(**field).move_field_offset(row_offset);
1786
1799
if (! (**field).isWriteSet() && (**field).is_null())
1801
(**field).move_field_offset(-row_offset);
1789
1805
if ((**field).is_null())
1791
1807
err= ib_col_set_value(tuple, colnr, NULL, IB_SQL_NULL);
1792
1808
assert(err == DB_SUCCESS);
1809
(**field).move_field_offset(-row_offset);
1876
1895
tuple= ib_clust_read_tuple_create(cursor);
1878
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);
1880
1914
err= ib_cursor_first(cursor);
1881
1915
if (current_session->lex->sql_command == SQLCOM_CREATE_TABLE
1981
2015
tuple= ib_tuple_clear(tuple);
1982
2016
ib_tuple_delete(tuple);
1983
2018
err= ib_cursor_reset(cursor);
1988
int HailDBCursor::doUpdateRecord(const unsigned char *,
2023
int HailDBCursor::doUpdateRecord(const unsigned char *old_data,
2024
unsigned char *new_data)
1991
2026
ib_tpl_t update_tuple;
2028
bool created_tuple= false;
1994
2030
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;
1996
2076
err= ib_tuple_copy(update_tuple, tuple);
1997
2077
assert(err == DB_SUCCESS);
1999
write_row_to_haildb_tuple(getTable()->getFields(), update_tuple);
2079
write_row_to_haildb_tuple(new_data, getTable()->getFields(), update_tuple);
2001
2081
err= ib_cursor_update_row(cursor, tuple, update_tuple);
2003
2083
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);
2005
2094
advance_cursor= true;
2007
if (err == DB_SUCCESS)
2009
else if (err == DB_DUPLICATE_KEY)
2010
return HA_ERR_FOUND_DUPP_KEY;
2096
return ib_err_t_to_drizzle_error(err);
2015
2099
int HailDBCursor::doDeleteRecord(const unsigned char *)
2103
assert(ib_cursor_is_positioned(cursor) == IB_TRUE);
2019
2104
err= ib_cursor_delete_row(cursor);
2020
if (err != DB_SUCCESS)
2023
2106
advance_cursor= true;
2108
return ib_err_t_to_drizzle_error(err);
2027
2111
int HailDBCursor::delete_all_rows(void)
2029
2113
/* I *think* ib_truncate is non-transactional....
2030
2114
so only support TRUNCATE and not DELETE FROM t;
2031
(this is what ha_haildb does)
2115
(this is what ha_innodb does)
2033
2117
if (session_sql_command(getTable()->in_use) != SQLCOM_TRUNCATE)
2034
2118
return HA_ERR_WRONG_COMMAND;
2039
2123
ib_trx_t transaction= ib_trx_begin(IB_TRX_REPEATABLE_READ);
2041
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);
2043
2141
err= ib_schema_lock_exclusive(transaction);
2044
2142
if (err != DB_SUCCESS)
2091
2189
assert(transaction != NULL);
2093
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);
2095
2207
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2096
2208
assert(err == DB_SUCCESS); // FIXME
2380
2505
if (flag & HA_STATUS_AUTO)
2381
2506
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)
2385
2532
int HailDBCursor::doStartIndexScan(uint32_t keynr, bool)
2387
2535
ib_trx_t transaction= *get_trx(getTable()->in_use);
2389
2537
active_index= keynr;
2391
ib_cursor_attach_trx(cursor, transaction);
2393
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;
2395
2558
tuple= ib_clust_read_tuple_create(cursor);
2400
2562
ib_id_t index_id;
2401
2563
err= ib_index_get_id(table_path_to_haildb_name(getShare()->getPath()),
2402
2564
getShare()->getKeyInfo(keynr).name,
2404
2566
if (err != DB_SUCCESS)
2567
return ib_err_t_to_drizzle_error(err);
2407
2569
err= ib_cursor_close(cursor);
2408
2570
assert(err == DB_SUCCESS);
2409
2572
err= ib_cursor_open_index_using_id(index_id, transaction, &cursor);
2411
2574
if (err != DB_SUCCESS)
2575
return ib_err_t_to_drizzle_error(err);
2577
cursor_is_sec_index= true;
2414
2579
tuple= ib_clust_read_tuple_create(cursor);
2415
2580
ib_cursor_set_cluster_access(cursor);
2418
ib_err_t err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2583
err= ib_cursor_set_lock_mode(cursor, ib_lock_mode);
2419
2584
assert(err == DB_SUCCESS);
2421
2586
advance_cursor= false;
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);
2912
3096
static int haildb_init(drizzled::module::Context &context)