void StorageFile::rename(const String & new_path_to_db, const String & /*new_database_name*/, const String & new_table_name) { if (!is_db_table) throw Exception("Can't rename table '" + table_name + "' binded to user-defined file (or FD)", ErrorCodes::DATABASE_ACCESS_DENIED); std::unique_lock<std::shared_mutex> lock(rwlock); std::string path_new = getTablePath(new_path_to_db, new_table_name, format_name); Poco::File(Poco::Path(path_new).parent()).createDirectories(); Poco::File(path).renameTo(path_new); path = std::move(path_new); }
StorageFile::StorageFile( const std::string & table_path_, int table_fd_, const std::string & db_dir_path, const std::string & table_name_, const std::string & format_name_, const ColumnsDescription & columns_, Context & context_) : IStorage(columns_), table_name(table_name_), format_name(format_name_), context_global(context_), table_fd(table_fd_) { if (table_fd < 0) /// Will use file { use_table_fd = false; if (!table_path_.empty()) /// Is user's file { Poco::Path poco_path = Poco::Path(table_path_); if (poco_path.isRelative()) poco_path = Poco::Path(db_dir_path, poco_path); path = poco_path.absolute().toString(); checkCreationIsAllowed(context_global, db_dir_path, path, table_fd); is_db_table = false; } else /// Is DB's file { if (db_dir_path.empty()) throw Exception("Storage " + getName() + " requires data path", ErrorCodes::INCORRECT_FILE_NAME); path = getTablePath(db_dir_path, table_name, format_name); is_db_table = true; Poco::File(Poco::Path(path).parent()).createDirectories(); } } else /// Will use FD { checkCreationIsAllowed(context_global, db_dir_path, path, table_fd); is_db_table = false; use_table_fd = true; /// Save initial offset, it will be used for repeating SELECTs /// If FD isn't seekable (lseek returns -1), then the second and subsequent SELECTs will fail. table_fd_init_offset = lseek(table_fd, 0, SEEK_CUR); } }
char * EXPORT_CALL lou_findTable(const char * query) { if (!tableIndex) { char * searchPath; List * tables; const char ** tablesArray; logMessage(LOG_WARN, "Tables have not been indexed yet. Indexing LOUIS_TABLEPATH."); searchPath = getTablePath(); tables = listFiles(searchPath); tablesArray = list_toArray(tables, NULL); lou_indexTables(tablesArray); free(searchPath); list_free(tables); free(tablesArray); } List * queryFeatures = parseQuery(query); int bestQuotient = 0; char * bestMatch = NULL; List * l; for (l = tableIndex; l; l = l->tail) { TableMeta * table = l->head; int q = matchFeatureLists(queryFeatures, table->features, 0); if (q > bestQuotient) { bestQuotient = q; bestMatch = strdup(table->name); } } if (bestMatch) { logMessage(LOG_INFO, "Best match: %s (%d)", bestMatch, bestQuotient); return bestMatch; } else { logMessage(LOG_INFO, "No table could be found for query '%s'", query); return NULL; } }