FileItemsPtr FileState::LookupFilesForHash(const Buffer& hash) { sqlite3_stmt* stmt; sqlite3_prepare_v2(m_db, "SELECT filename,version,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete " " FROM FileState " " WHERE type = 0 AND file_hash = ?", -1, &stmt, 0); _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); sqlite3_bind_blob(stmt, 1, hash.buf(), hash.size(), SQLITE_STATIC); _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); FileItemsPtr retval = make_shared<FileItems>(); while (sqlite3_step(stmt) == SQLITE_ROW) { FileItem file; file.set_filename(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes(stmt, 0)); file.set_version(sqlite3_column_int64(stmt, 1)); file.set_device_name(sqlite3_column_blob(stmt, 2), sqlite3_column_bytes(stmt, 2)); file.set_seq_no(sqlite3_column_int64(stmt, 3)); file.set_file_hash(sqlite3_column_blob(stmt, 4), sqlite3_column_bytes(stmt, 4)); file.set_mtime(sqlite3_column_int(stmt, 5)); file.set_mode(sqlite3_column_int(stmt, 6)); file.set_seg_num(sqlite3_column_int64(stmt, 7)); file.set_is_complete(sqlite3_column_int(stmt, 8)); retval->push_back(file); } _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_DONE, sqlite3_errmsg(m_db)); sqlite3_finalize(stmt); return retval; }
void FileState::LookupFilesInFolder(const function<void(const FileItem&)>& visitor, const std::string& folder, int offset /*=0*/, int limit /*=-1*/) { sqlite3_stmt* stmt; sqlite3_prepare_v2(m_db, "SELECT filename,version,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete " " FROM FileState " " WHERE type = 0 AND directory = ?" " LIMIT ? OFFSET ?", -1, &stmt, 0); if (folder.size() == 0) sqlite3_bind_null(stmt, 1); else sqlite3_bind_text(stmt, 1, folder.c_str(), folder.size(), SQLITE_STATIC); sqlite3_bind_int(stmt, 2, limit); sqlite3_bind_int(stmt, 3, offset); while (sqlite3_step(stmt) == SQLITE_ROW) { FileItem file; file.set_filename(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes(stmt, 0)); file.set_version(sqlite3_column_int64(stmt, 1)); file.set_device_name(sqlite3_column_blob(stmt, 2), sqlite3_column_bytes(stmt, 2)); file.set_seq_no(sqlite3_column_int64(stmt, 3)); file.set_file_hash(sqlite3_column_blob(stmt, 4), sqlite3_column_bytes(stmt, 4)); file.set_mtime(sqlite3_column_int(stmt, 5)); file.set_mode(sqlite3_column_int(stmt, 6)); file.set_seg_num(sqlite3_column_int64(stmt, 7)); file.set_is_complete(sqlite3_column_int(stmt, 8)); visitor(file); } _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_DONE, sqlite3_errmsg(m_db)); sqlite3_finalize(stmt); }
bool FileState::LookupFilesInFolderRecursively(const function<void(const FileItem&)>& visitor, const std::string& folder, int offset /*=0*/, int limit /*=-1*/) { _LOG_DEBUG("LookupFilesInFolderRecursively: [" << folder << "]"); if (limit >= 0) limit++; sqlite3_stmt* stmt; if (folder != "") { /// @todo Do something to improve efficiency of this query. Right now it is basically scanning the whole database sqlite3_prepare_v2(m_db, "SELECT filename,version,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete " " FROM FileState " " WHERE type = 0 AND is_dir_prefix(?, directory)=1 " " ORDER BY filename " " LIMIT ? OFFSET ?", -1, &stmt, 0); // there is a small ambiguity with is_prefix matching, but should be ok for now _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); sqlite3_bind_text(stmt, 1, folder.c_str(), folder.size(), SQLITE_STATIC); _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); sqlite3_bind_int(stmt, 2, limit); sqlite3_bind_int(stmt, 3, offset); } else { sqlite3_prepare_v2(m_db, "SELECT filename,version,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete " " FROM FileState " " WHERE type = 0" " ORDER BY filename " " LIMIT ? OFFSET ?", -1, &stmt, 0); sqlite3_bind_int(stmt, 1, limit); sqlite3_bind_int(stmt, 2, offset); } _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); while (sqlite3_step(stmt) == SQLITE_ROW) { if (limit == 1) break; FileItem file; file.set_filename(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes(stmt, 0)); file.set_version(sqlite3_column_int64(stmt, 1)); file.set_device_name(sqlite3_column_blob(stmt, 2), sqlite3_column_bytes(stmt, 2)); file.set_seq_no(sqlite3_column_int64(stmt, 3)); file.set_file_hash(sqlite3_column_blob(stmt, 4), sqlite3_column_bytes(stmt, 4)); file.set_mtime(sqlite3_column_int(stmt, 5)); file.set_mode(sqlite3_column_int(stmt, 6)); file.set_seg_num(sqlite3_column_int64(stmt, 7)); file.set_is_complete(sqlite3_column_int(stmt, 8)); visitor(file); limit--; } _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_DONE, sqlite3_errmsg(m_db)); sqlite3_finalize(stmt); return (limit == 1); }