1813
1809
xtPublic void myxt_get_column_name(XTOpenTablePtr ot, u_int col_idx, u_int len, char *col_name)
1815
STRUCT_TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1811
TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1818
field = GET_TABLE_FIELDS(table)[col_idx];
1814
field = table->field[col_idx];
1819
1815
xt_strcpy(len, col_name, field->field_name);
1822
1818
xtPublic void myxt_get_column_as_string(XTOpenTablePtr ot, char *buffer, u_int col_idx, u_int len, char *value)
1824
XTTableHPtr tab = ot->ot_table;
1825
XTThreadPtr self = ot->ot_thread;
1826
STRUCT_TABLE *table = tab->tab_dic.dic_my_table;
1827
Field *field = GET_TABLE_FIELDS(table)[col_idx];
1828
char buf_val[MAX_FIELD_WIDTH];
1829
String val(buf_val, sizeof(buf_val), &my_charset_bin);
1820
XTTableHPtr tab = ot->ot_table;
1821
XTThreadPtr self = ot->ot_thread;
1822
TABLE *table = tab->tab_dic.dic_my_table;
1823
Field *field = table->field[col_idx];
1824
char buf_val[MAX_FIELD_WIDTH];
1825
String val(buf_val, sizeof(buf_val), &my_charset_bin);
1831
if (mx_is_null_in_record(table, field, buffer))
1827
if (mx_is_null_in_record(field, buffer))
1832
1828
xt_strcpy(len, value, "NULL");
1837
1832
/* Required by store() - or an assertion will fail: */
1838
1833
if (table->read_set)
1839
1834
MX_BIT_SET(table->read_set, col_idx);
1842
1836
save = field->ptr;
1843
1837
xt_lock_mutex(self, &tab->tab_dic_field_lock);
1844
1838
pushr_(xt_unlock_mutex, &tab->tab_dic_field_lock);
1845
field->ptr = (byte *) buffer + field->offset(table->getDefaultValues());
1846
field->val_str_internal(&val);
1839
#if MYSQL_VERSION_ID < 50114
1840
field->ptr = (byte *) buffer + field->offset();
1842
field->ptr = (byte *) buffer + field->offset(field->table->record[0]);
1844
field->val_str(&val);
1847
1845
field->ptr = save; // Restore org row pointer
1848
1846
freer_(); // xt_unlock_mutex(&tab->tab_dic_field_lock)
1849
1847
xt_strcpy(len, value, val.c_ptr());
1853
1851
xtPublic xtBool myxt_set_column(XTOpenTablePtr ot, char *buffer, u_int col_idx, const char *value, u_int len)
1855
XTTableHPtr tab = ot->ot_table;
1856
XTThreadPtr self = ot->ot_thread;
1857
STRUCT_TABLE *table = tab->tab_dic.dic_my_table;
1858
Field *field = GET_TABLE_FIELDS(table)[col_idx];
1853
XTTableHPtr tab = ot->ot_table;
1854
XTThreadPtr self = ot->ot_thread;
1855
TABLE *table = tab->tab_dic.dic_my_table;
1856
Field *field = table->field[col_idx];
1863
1860
/* Required by store() - or an assertion will fail: */
1864
1861
if (table->write_set)
1865
1862
MX_BIT_SET(table->write_set, col_idx);
1868
mx_set_notnull_in_record(table, field, buffer);
1864
mx_set_notnull_in_record(field, buffer);
1870
1866
save = field->ptr;
1871
1867
xt_lock_mutex(self, &tab->tab_dic_field_lock);
1872
1868
pushr_(xt_unlock_mutex, &tab->tab_dic_field_lock);
1873
field->ptr = (byte *) buffer + field->offset(table->getDefaultValues());
1869
#if MYSQL_VERSION_ID < 50114
1870
field->ptr = (byte *) buffer + field->offset();
1872
field->ptr = (byte *) buffer + field->offset(field->table->record[0]);
1874
1874
error = field->store(value, len, &my_charset_utf8_general_ci);
1875
1875
field->ptr = save; // Restore org row pointer
1876
1876
freer_(); // xt_unlock_mutex(&tab->tab_dic_field_lock)
1987
1987
* MySQL Data Dictionary
1990
static void my_close_table(STRUCT_TABLE *share)
1990
#define TS(x) (x)->s
1992
static void my_close_table(TABLE *table)
1995
#if 0 // Removed by Brian
1998
share = (TABLE_SHARE *) ((char *) table + sizeof(TABLE));
1999
share->free_table_share();
2002
delete_table(table, true); // TODO: Q, why did Stewart remove this?
1996
2008
* This function returns NULL if the table cannot be opened
1997
2009
* because this is not a MySQL thread.
1999
static STRUCT_TABLE *my_open_table(XTThreadPtr self, XTDatabaseHPtr XT_UNUSED(db), XTPathStrPtr tab_path, xtWord1 table_type)
2011
static TABLE *my_open_table(XTThreadPtr self, XTDatabaseHPtr XT_UNUSED(db), XTPathStrPtr tab_path, xtWord1 table_type)
2001
2013
THD *thd = current_thd;
2002
char *tab_file_name;
2014
char path_buffer[PATH_MAX];
2003
2016
char database_name[XT_IDENTIFIER_NAME_SIZE];
2004
char tab_name[XT_IDENTIFIER_NAME_SIZE];
2005
uint32_t tab_name_len;
2018
char *buffer, *path, *db_name, *name;
2009
2023
/* If we have no MySQL thread, then we cannot open this table!
2010
2024
* What this means is the thread is probably the sweeper or the
2016
tab_file_name = xt_last_name_of_path(tab_path->ps_path);
2017
tab_name_len = TableIdentifier::filename_to_tablename(tab_file_name, tab_name, XT_IDENTIFIER_NAME_SIZE);
2019
xt_2nd_last_name_of_path(XT_IDENTIFIER_NAME_SIZE, database_name, tab_path->ps_path);
2030
/* GOTCHA: Check if the table name is a partitian,
2031
* if so we need to remove the partition
2032
* extension, in order for this to work!
2034
* Reason: the parts of a partition table do not
2037
xt_strcpy(PATH_MAX, path_buffer, tab_path->ps_path);
2038
table_name = xt_last_name_of_path(path_buffer);
2042
if ((ptr = strstr(table_name, "#P#")))
2046
xt_2nd_last_name_of_path(XT_IDENTIFIER_NAME_SIZE, database_name, path_buffer);
2048
size = sizeof(TABLE) + sizeof(TABLE_SHARE) +
2049
strlen(path_buffer) + 1 +
2050
strlen(database_name) + 1 + strlen(table_name) + 1;
2051
if (!(buffer = (char *) xt_malloc(self, size)))
2053
table = (TABLE *) buffer;
2054
buffer += sizeof(TABLE);
2055
share = (TABLE_SHARE *) buffer;
2056
buffer += sizeof(TABLE_SHARE);
2059
strcpy(path, path_buffer);
2060
buffer += strlen(path_buffer) + 1;
2062
strcpy(db_name, database_name);
2063
buffer += strlen(database_name) + 1;
2065
strcpy(name, table_name);
2067
/* Required to call 'open_table_from_share'! */
2068
LEX *old_lex, new_lex;
2071
thd->lex = &new_lex;
2072
new_lex.current_select= NULL;
2076
char tab_name[XT_IDENTIFIER_NAME_SIZE];
2078
uint32_t tab_name_len = filename_to_tablename(name, tab_name, XT_IDENTIFIER_NAME_SIZE);
2021
2080
TableIdentifier *ident = NULL;
2023
2081
if (table_type == XT_TABLE_TYPE_TEMPORARY) {
2024
2082
std::string tmp_path(drizzle_tmpdir);
2025
2083
tmp_path.append("/");
2026
tmp_path.append(tab_file_name);
2027
ident = new TableIdentifier(database_name, tab_name, tmp_path);
2029
else if (table_type == XT_TABLE_TYPE_STANDARD) {
2030
ident = new TableIdentifier(
2031
std::string(database_name),
2084
tmp_path.append(table_name);
2085
ident = new TableIdentifier(db_name, tab_name, tmp_path);
2086
} else if (table_type == XT_TABLE_TYPE_STANDARD) {
2087
ident = new TableIdentifier(
2088
std::string(db_name),
2032
2089
std::string(tab_name, tab_name_len),
2033
2090
message::Table::STANDARD);
2036
fs::path n(getDataHomeCatalog());
2039
ident = new TableIdentifier(database_name, tab_name, n.file_string());
2042
share = new TableShare(message::Table::STANDARD);
2043
if ((error = share->open_table_def(*thd, *ident))) {
2093
n.append(data_home);
2097
n.append(table_name);
2098
//ident = new TableIdentifier(
2099
// std::string(db_name),
2100
// std::string(tab_name, tab_name_len),
2101
// message::Table::INTERNAL);
2102
ident = new TableIdentifier(db_name, tab_name, n);
2104
share->init(db_name, 0, name, path);
2105
if ((error = share->open_table_def(*thd, *ident)) ||
2106
(error = share->open_table_from_share(thd, "", 0, 0, *table)))
2108
xt_free(self, table);
2044
2111
xt_throw_sulxterr(XT_CONTEXT, XT_ERR_LOADING_MYSQL_DIC, tab_path->ps_path, (u_long) error);
2117
#if MYSQL_VERSION_ID < 60000
2118
#if MYSQL_VERSION_ID < 50123
2119
init_tmp_table_share(share, db_name, 0, name, path);
2121
init_tmp_table_share(thd, share, db_name, 0, name, path);
2124
#if MYSQL_VERSION_ID < 60004
2125
init_tmp_table_share(share, db_name, 0, name, path);
2127
init_tmp_table_share(thd, share, db_name, 0, name, path);
2131
/* If MySQL shutsdown while we are just starting up, they
2132
* they kill the plugin sub-system before calling
2133
* shutdown for the engine!
2135
if (!ha_resolve_by_legacy_type(thd, DB_TYPE_PBXT)) {
2136
xt_free(self, table);
2139
xt_throw_xterr(XT_CONTEXT, XT_ERR_MYSQL_SHUTDOWN);
2143
if ((error = open_table_def(thd, share, 0))) {
2144
xt_free(self, table);
2147
xt_throw_sulxterr(XT_CONTEXT, XT_ERR_LOADING_MYSQL_DIC, tab_path->ps_path, (u_long) error);
2151
#if MYSQL_VERSION_ID >= 50404
2152
if ((error = open_table_from_share(thd, share, "", 0, (uint) READ_ALL, 0, table, OTM_OPEN)))
2154
if ((error = open_table_from_share(thd, share, "", 0, (uint) READ_ALL, 0, table, FALSE)))
2157
xt_free(self, table);
2160
xt_throw_sulxterr(XT_CONTEXT, XT_ERR_LOADING_MYSQL_DIC, tab_path->ps_path, (u_long) error);
2168
/* GOTCHA: I am the plug-in!!! Therefore, I should not hold
2169
* a reference to myself. By holding this reference I prevent
2170
* plugin_shutdown() and reap_plugins() in sql_plugin.cc
2171
* from doing their job on shutdown!
2174
plugin_unlock(NULL, table->s->db_plugin);
2175
table->s->db_plugin = NULL;
2054
2181
static bool my_match_index(XTDDIndex *ind, KEY *index)
2056
KEY_PART_INFO *key_part;
2057
KEY_PART_INFO *key_part_end;
2183
KeyPartInfo *key_part;
2184
KeyPartInfo *key_part_end;
2059
2186
XTDDColumnRef *cref;
2732
2848
xtPublic xtBool myxt_load_dictionary(XTThreadPtr self, XTDictionaryPtr dic, XTDatabaseHPtr db, XTPathStrPtr tab_path)
2734
STRUCT_TABLE *my_tab;
2736
2852
if (!(my_tab = my_open_table(self, db, tab_path, dic->dic_table_type)))
2738
2854
dic->dic_my_table = my_tab;
2739
2855
#ifdef DRIZZLED
2740
dic->dic_def_ave_row_size = (xtWord8) GET_TABLE_SHARE(my_tab)->getTableProto()->options().avg_row_length();
2856
dic->dic_def_ave_row_size = (xtWord8) my_tab->s->getTableProto()->options().avg_row_length();
2742
dic->dic_def_ave_row_size = (xtWord8) GET_TABLE_SHARE(my_tab)->avg_row_length;
2858
dic->dic_def_ave_row_size = (xtWord8) my_tab->s->avg_row_length;
2744
2860
myxt_setup_dictionary(self, dic);
2745
dic->dic_keys = (XTIndexPtr *) xt_calloc(self, sizeof(XTIndexPtr) * GET_TABLE_SHARE(my_tab)->keys);
2746
for (uint i=0; i<GET_TABLE_SHARE(my_tab)->keys; i++)
2747
dic->dic_keys[i] = my_create_index(self, my_tab, i, &my_tab->getKeyInfo(i));
2861
dic->dic_keys = (XTIndexPtr *) xt_calloc(self, sizeof(XTIndexPtr) * TS(my_tab)->keys);
2862
for (uint i=0; i<TS(my_tab)->keys; i++)
2863
dic->dic_keys[i] = my_create_index(self, my_tab, i, &my_tab->key_info[i]);
2749
2865
/* Check if any key is a subset of another: */
2750
2866
for (u_int i=0; i<dic->dic_key_count; i++)
3242
3340
#ifdef UNUSED_CODE
3243
3341
static void mx_put_int(TABLE *table, int column, int value)
3245
GET_TABLE_FIELDS(table)[column]->store(value, false);
3343
table->field[column]->store(value, false);
3248
3346
static void mx_put_real8(TABLE *table, int column, xtReal8 value)
3250
GET_TABLE_FIELDS(table)[column]->store(value);
3348
table->field[column]->store(value);
3253
3351
static void mx_put_string(TABLE *table, int column, const char *string, u_int len, charset_info_st *charset)
3255
GET_TABLE_FIELDS(table)[column]->store(string, len, charset);
3353
table->field[column]->store(string, len, charset);
3259
3357
static void mx_put_u_llong(TABLE *table, int column, u_llong value)
3261
GET_TABLE_FIELDS(table)[column]->store(value, false);
3359
table->field[column]->store(value, false);
3264
3362
static void mx_put_string(TABLE *table, int column, const char *string, charset_info_st *charset)
3266
GET_TABLE_FIELDS(table)[column]->store(string, strlen(string), charset);
3364
table->field[column]->store(string, strlen(string), charset);
3269
3367
xtPublic int myxt_statistics_fill_table(XTThreadPtr self, void *th, void *ta, void *, MX_CONST void *ch)