/** * @todo Implement checking modification time and permissions */ FileItemPtr FileState::LookupFile(const std::string& filename) { 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 filename = ?", -1, &stmt, 0); _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); sqlite3_bind_text(stmt, 1, filename.c_str(), -1, SQLITE_STATIC); FileItemPtr retval; if (sqlite3_step(stmt) == SQLITE_ROW) { retval = make_shared<FileItem>(); retval->set_filename(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes(stmt, 0)); retval->set_version(sqlite3_column_int64(stmt, 1)); retval->set_device_name(sqlite3_column_blob(stmt, 2), sqlite3_column_bytes(stmt, 2)); retval->set_seq_no(sqlite3_column_int64(stmt, 3)); retval->set_file_hash(sqlite3_column_blob(stmt, 4), sqlite3_column_bytes(stmt, 4)); retval->set_mtime(sqlite3_column_int(stmt, 5)); retval->set_mode(sqlite3_column_int(stmt, 6)); retval->set_seg_num(sqlite3_column_int64(stmt, 7)); retval->set_is_complete(sqlite3_column_int(stmt, 8)); } _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_DONE, sqlite3_errmsg(m_db)); sqlite3_finalize(stmt); return retval; }
void Dispatcher::Did_LocalFile_AddOrModify_Execute(filesystem::path relativeFilePath) { _LOG_DEBUG(m_localUserName << " calls LocalFile_AddOrModify_Execute"); filesystem::path absolutePath = m_rootDir / relativeFilePath; if (!filesystem::exists(absolutePath)) { //BOOST_THROW_EXCEPTION (Error::Dispatcher() << error_info_str("Update non exist file: " + absolutePath.string() )); _LOG_DEBUG("Update non exist file: " << absolutePath.string()); return; } FileItemPtr currentFile = m_fileState->LookupFile(relativeFilePath.generic_string()); if (currentFile && *Hash::FromFileContent(absolutePath) == Hash(currentFile->file_hash().c_str(), currentFile->file_hash().size()) // The following two are commented out to prevent front end from reporting intermediate files // should enable it if there is other way to prevent this // && last_write_time (absolutePath) == currentFile->mtime () // && status (absolutePath).permissions () == static_cast<filesystem::perms> (currentFile->mode ()) ) { _LOG_ERROR("Got notification about the same file [" << relativeFilePath << "]"); return; } if (currentFile && !currentFile->is_complete()) { _LOG_ERROR("Got notification about incomplete file [" << relativeFilePath << "]"); return; } int seg_num; HashPtr hash; tie(hash, seg_num) = m_objectManager.localFileToObjects(absolutePath, m_localUserName); try { m_actionLog->AddLocalActionUpdate(relativeFilePath.generic_string(), *hash, last_write_time(absolutePath), #if BOOST_VERSION >= 104900 status(absolutePath).permissions(), #else 0, #endif seg_num); // notify SyncCore to propagate the change m_core->localStateChangedDelayed(); } catch (filesystem::filesystem_error& error) { _LOG_ERROR("File operations failed on [" << relativeFilePath << "] (ignoring)"); } }
FileItemPtr ActionLog::LookupAction(const std::string& filename, sqlite3_int64 version, const Buffer& filehash) { sqlite3_stmt* stmt; sqlite3_prepare_v2(m_db, "SELECT device_name, seq_no, strftime('%s', file_mtime), file_chmod, file_seg_num, file_hash " " FROM ActionLog " " WHERE action = 0 AND " " filename=? AND " " version=? AND " " is_prefix(?, file_hash)=1", -1, &stmt, 0); _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); sqlite3_bind_text(stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); sqlite3_bind_int64(stmt, 2, version); sqlite3_bind_blob(stmt, 3, filehash.buf(), filehash.size(), SQLITE_STATIC); FileItemPtr fileItem; if (sqlite3_step(stmt) == SQLITE_ROW) { fileItem = make_shared<FileItem>(); fileItem->set_filename(filename); fileItem->set_device_name(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0)); fileItem->set_seq_no(sqlite3_column_int64(stmt, 1)); fileItem->set_mtime(sqlite3_column_int64(stmt, 2)); fileItem->set_mode(sqlite3_column_int64(stmt, 3)); fileItem->set_seg_num(sqlite3_column_int64(stmt, 4)); fileItem->set_file_hash(sqlite3_column_blob(stmt, 5), sqlite3_column_bytes(stmt, 5)); } _LOG_DEBUG_COND(sqlite3_errcode(m_db) != SQLITE_DONE || sqlite3_errcode(m_db) != SQLITE_ROW || sqlite3_errcode(m_db) != SQLITE_OK, sqlite3_errmsg(m_db)); return fileItem; }