45
class SchemaIdentifier;
47
44
extern std::string drizzle_tmpdir;
48
45
extern pid_t current_pid;
50
47
static const char hexchars[]= "0123456789abcdef";
49
static bool tablename_to_filename(const string &from, string &to);
53
52
Translate a cursor name to a table name (WL #1324).
209
208
bool conversion_error= false;
211
conversion_error= util::tablename_to_filename(in_db, in_path);
210
conversion_error= tablename_to_filename(in_db, in_path);
212
211
if (conversion_error)
214
213
errmsg_printf(ERRMSG_LVL_ERROR,
228
conversion_error= util::tablename_to_filename(in_table_name, in_path);
227
conversion_error= tablename_to_filename(in_table_name, in_path);
229
228
if (conversion_error)
231
230
errmsg_printf(ERRMSG_LVL_ERROR,
238
237
return in_path.length();
242
Translate a table name to a cursor name (WL #1324).
245
tablename_to_filename()
247
to OUT The cursor name
248
to_length The size of the cursor name buffer.
251
true if errors happen. false on success.
253
static bool tablename_to_filename(const string &from, string &to)
256
string::const_iterator iter= from.begin();
257
for (; iter != from.end(); ++iter)
261
if ((isdigit(*iter)) ||
273
to.push_back(tolower(*iter));
278
/* We need to escape this char in a way that can be reversed */
280
to.push_back(hexchars[(*iter >> 4) & 15]);
281
to.push_back(hexchars[(*iter) & 15]);
284
if (internal::check_if_legal_tablename(to.c_str()))
241
291
TableIdentifier::TableIdentifier(const drizzled::Table &table) :
242
292
SchemaIdentifier(table.getShare()->getSchemaName()),
243
293
type(table.getShare()->getTableType()),
272
322
util::insensitive_hash hasher;
273
323
hash_value= hasher(path);
275
std::string tb_name(getTableName());
276
std::transform(tb_name.begin(), tb_name.end(), tb_name.begin(), ::tolower);
278
key.set(getKeySize(), getSchemaName(), tb_name);
325
key.set(getKeySize(), getSchemaName(), getTableName());
287
void TableIdentifier::getSQLPath(std::string &sql_path) const // @todo this is just used for errors, we should find a way to optimize it
290
case message::Table::FUNCTION:
291
case message::Table::STANDARD:
292
sql_path.append(getSchemaName());
293
sql_path.append(".");
294
sql_path.append(table_name);
296
case message::Table::INTERNAL:
297
sql_path.append("temporary.");
298
sql_path.append(table_name);
300
case message::Table::TEMPORARY:
301
sql_path.append(getSchemaName());
302
sql_path.append(".#");
303
sql_path.append(table_name);
308
bool TableIdentifier::isValid() const
310
if (not SchemaIdentifier::isValid())
316
if (table_name.empty())
322
if (table_name.size() > NAME_LEN)
328
if (table_name.at(table_name.length() -1) == ' ')
334
if (table_name.at(0) == '.')
341
const CHARSET_INFO * const cs= &my_charset_utf8mb4_general_ci;
343
int well_formed_error;
344
uint32_t res= cs->cset->well_formed_len(cs, table_name.c_str(), table_name.c_str() + table_name.length(),
345
NAME_CHAR_LEN, &well_formed_error);
346
if (well_formed_error or table_name.length() != res)
359
my_error(ER_WRONG_TABLE_NAME, MYF(0), name.c_str());
334
const std::string &TableIdentifier::getSQLPath() // @todo this is just used for errors, we should find a way to optimize it
336
if (sql_path.empty())
339
case message::Table::FUNCTION:
340
case message::Table::STANDARD:
341
sql_path.append(getSchemaName());
342
sql_path.append(".");
343
sql_path.append(table_name);
345
case message::Table::INTERNAL:
346
sql_path.append("temporary.");
347
sql_path.append(table_name);
349
case message::Table::TEMPORARY:
350
sql_path.append(getSchemaName());
351
sql_path.append(".#");
352
sql_path.append(table_name);