99
99
#include <drizzled/field.h>
100
100
#include "drizzled/field/timestamp.h" // needed for UPDATE NOW()
101
#include "drizzled/field/blob.h"
101
102
#include <drizzled/session.h>
103
104
using namespace std;
104
105
using namespace google;
105
106
using namespace drizzled;
107
int read_row_from_innodb(unsigned char* buf, ib_crsr_t cursor, ib_tpl_t tuple, Table* table, bool has_hidden_primary_key, uint64_t *hidden_pkey);
108
int read_row_from_innodb(unsigned char* buf, ib_crsr_t cursor, ib_tpl_t tuple, Table* table, bool has_hidden_primary_key, uint64_t *hidden_pkey, drizzled::memory::Root **blobroot= NULL);
108
109
static void fill_ib_search_tpl_from_drizzle_key(ib_tpl_t search_tuple,
109
110
const drizzled::KeyInfo *key_info,
110
111
const unsigned char *key_ptr,
1449
1459
(**field).setReadSet();
1450
1460
err= ib_tuple_write_u32(tuple, colnr, (*field)->val_int());
1462
else if ((**field).type() == DRIZZLE_TYPE_BLOB)
1464
Field_blob *blob= reinterpret_cast<Field_blob*>(*field);
1465
unsigned char* blob_ptr;
1466
uint32_t blob_length= blob->get_length();
1467
blob->get_ptr(&blob_ptr);
1468
err= ib_col_set_value(tuple, colnr, blob_ptr, blob_length);
1454
1472
err= ib_col_set_value(tuple, colnr, (*field)->ptr, (*field)->data_length());
1740
1754
if (err != DB_SUCCESS && err != DB_END_OF_INDEX)
1741
1755
return -1; // FIXME
1757
advance_cursor= false;
1746
int read_row_from_innodb(unsigned char* buf, ib_crsr_t cursor, ib_tpl_t tuple, Table* table, bool has_hidden_primary_key, uint64_t *hidden_pkey)
1762
int read_row_from_innodb(unsigned char* buf, ib_crsr_t cursor, ib_tpl_t tuple, Table* table, bool has_hidden_primary_key, uint64_t *hidden_pkey, drizzled::memory::Root **blobroot)
1749
1765
ptrdiff_t row_offset= buf - table->record[0];
1785
1805
err= ib_tuple_read_u32(tuple, colnr, &date_read);
1786
1806
(*field)->store(date_read);
1808
else if ((**field).type() == DRIZZLE_TYPE_BLOB)
1810
if (blobroot == NULL)
1811
(reinterpret_cast<Field_blob*>(*field))->set_ptr(length,
1812
(unsigned char*)ib_col_get_value(tuple,
1816
if (*blobroot == NULL)
1818
*blobroot= new drizzled::memory::Root();
1819
(**blobroot).init_alloc_root();
1822
unsigned char *blob_ptr= (unsigned char*)(**blobroot).alloc_root(length);
1823
memcpy(blob_ptr, ib_col_get_value(tuple, colnr), length);
1824
(reinterpret_cast<Field_blob*>(*field))->set_ptr(length, blob_ptr);
1790
1829
ib_col_copy_value(tuple, colnr, (*field)->ptr, (*field)->data_length());
1849
1891
err= ib_cursor_moveto(cursor, search_tuple, IB_CUR_GE, &res);
1850
1892
assert(err == DB_SUCCESS);
1851
1898
ib_tuple_delete(search_tuple);
1853
1900
tuple= ib_tuple_clear(tuple);
1854
ret= read_row_from_innodb(buf, cursor, tuple, table,
1855
share->has_hidden_primary_key,
1856
&hidden_autoinc_pkey_position);
1858
err= ib_cursor_next(cursor);
1903
ret= read_row_from_innodb(buf, cursor, tuple, table,
1904
share->has_hidden_primary_key,
1905
&hidden_autoinc_pkey_position);
1907
advance_cursor= true;
1863
1912
static void store_key_value_from_innodb(KeyInfo *key_info, unsigned char* ref, int ref_len, const unsigned char *record)
2079
2128
assert(buff == key_ptr + key_len);
2082
int EmbeddedInnoDBCursor::index_read(unsigned char *buf,
2083
const unsigned char *key_ptr,
2085
drizzled::ha_rkey_function find_flag)
2131
int EmbeddedInnoDBCursor::innodb_index_read(unsigned char *buf,
2132
const unsigned char *key_ptr,
2134
drizzled::ha_rkey_function find_flag,
2135
bool allocate_blobs)
2087
2137
ib_tpl_t search_tuple;
2104
2154
err= ib_cursor_moveto(cursor, search_tuple, search_mode, &res);
2105
2155
ib_tuple_delete(search_tuple);
2107
if (err == DB_RECORD_NOT_FOUND)
2108
return HA_ERR_END_OF_FILE;
2157
if ((err == DB_RECORD_NOT_FOUND || err == DB_END_OF_INDEX))
2159
table->status= STATUS_NOT_FOUND;
2160
return HA_ERR_KEY_NOT_FOUND;
2163
assert(err==DB_SUCCESS);
2110
2165
tuple= ib_tuple_clear(tuple);
2111
2166
ret= read_row_from_innodb(buf, cursor, tuple, table,
2112
2167
share->has_hidden_primary_key,
2113
&hidden_autoinc_pkey_position);
2114
err= ib_cursor_next(cursor);
2168
&hidden_autoinc_pkey_position,
2169
(allocate_blobs)? &blobroot : NULL);
2173
table->status= STATUS_NOT_FOUND;
2175
advance_cursor= true;
2180
int EmbeddedInnoDBCursor::index_read(unsigned char *buf,
2181
const unsigned char *key_ptr,
2183
drizzled::ha_rkey_function find_flag)
2185
return innodb_index_read(buf, key_ptr, key_len, find_flag, false);
2188
/* This is straight from cursor.cc, but it's private there :( */
2189
uint32_t EmbeddedInnoDBCursor::calculate_key_len(uint32_t key_position,
2190
key_part_map keypart_map_arg)
2192
/* works only with key prefixes */
2193
assert(((keypart_map_arg + 1) & keypart_map_arg) == 0);
2195
KeyInfo *key_info_found= table->s->key_info + key_position;
2196
KeyPartInfo *key_part_found= key_info_found->key_part;
2197
KeyPartInfo *end_key_part_found= key_part_found + key_info_found->key_parts;
2200
while (key_part_found < end_key_part_found && keypart_map_arg)
2202
length+= key_part_found->store_length;
2203
keypart_map_arg >>= 1;
2210
int EmbeddedInnoDBCursor::innodb_index_read_map(unsigned char * buf,
2211
const unsigned char *key,
2212
key_part_map keypart_map,
2213
enum ha_rkey_function find_flag,
2214
bool allocate_blobs)
2216
uint32_t key_len= calculate_key_len(active_index, keypart_map);
2217
return innodb_index_read(buf, key, key_len, find_flag, allocate_blobs);
2220
int EmbeddedInnoDBCursor::index_read_idx_map(unsigned char * buf,
2222
const unsigned char * key,
2223
key_part_map keypart_map,
2224
enum ha_rkey_function find_flag)
2227
error= doStartIndexScan(index, 0);
2230
error= innodb_index_read_map(buf, key, keypart_map, find_flag, true);
2231
error1= doEndIndexScan();
2233
return error ? error : error1;
2236
int EmbeddedInnoDBCursor::reset()
2239
blobroot->free_root(MYF(0));
2121
2246
int ret= HA_ERR_END_OF_FILE;
2123
if (next_innodb_error == DB_END_OF_INDEX)
2124
return HA_ERR_END_OF_FILE;
2250
ib_err_t err= ib_cursor_next(cursor);
2251
if (err == DB_END_OF_INDEX)
2252
return HA_ERR_END_OF_FILE;
2126
2255
tuple= ib_tuple_clear(tuple);
2127
2256
ret= read_row_from_innodb(buf, cursor, tuple, table,
2128
2257
share->has_hidden_primary_key,
2129
2258
&hidden_autoinc_pkey_position);
2130
next_innodb_error= ib_cursor_next(cursor);
2260
advance_cursor= true;
2144
2273
int ret= HA_ERR_END_OF_FILE;
2277
err= ib_cursor_prev(cursor);
2147
2279
if (active_index == 0)
2149
2281
tuple= ib_tuple_clear(tuple);
2150
2282
ret= read_row_from_innodb(buf, cursor, tuple, table,
2151
2283
share->has_hidden_primary_key,
2152
2284
&hidden_autoinc_pkey_position);
2153
err= ib_cursor_prev(cursor);
2287
advance_cursor= true;