Stefan Pranger
3 years ago
3 changed files with 113 additions and 0 deletions
@ -0,0 +1,79 @@ |
|||
#include <db/FSWatcher.h>
|
|||
|
|||
#include <fstream>
|
|||
#include <string>
|
|||
#include <filesystem>
|
|||
|
|||
#include <io/debug.h>
|
|||
#include <db/db.h>
|
|||
#include <db/update.h>
|
|||
#include <util/calendar_parsing.h>
|
|||
|
|||
bool is_ics(const std::filesystem::path filepath) { |
|||
return filepath.extension() == ".ics"; |
|||
} |
|||
|
|||
namespace db { |
|||
|
|||
FSWatcher::FSWatcher(sql::Database *db, const std::string &directory) : m_db(db), m_directory(directory) {} |
|||
|
|||
void FSWatcher::run() { |
|||
// Parse the directory to watch
|
|||
std::filesystem::path path(m_directory); |
|||
|
|||
// Set the event handler which will be used to process particular events
|
|||
auto create_entry = [&](inotify::Notification notification) { |
|||
create_event(notification.path); |
|||
}; |
|||
|
|||
auto modify_entry = [&](inotify::Notification notification) { |
|||
modify_event(notification.path); |
|||
}; |
|||
|
|||
auto remove_entry = [&](inotify::Notification notification) { |
|||
delete_event(notification.path); |
|||
}; |
|||
|
|||
/*
|
|||
auto handleUnexpectedNotification = [](inotify::Notification notification) { |
|||
std::cout << "Event " << notification.event << " on " << notification.path << " at " |
|||
<< notification.time.time_since_epoch().count() |
|||
<< " was triggered, but was not expected" << std::endl; |
|||
}; |
|||
*/ |
|||
|
|||
auto file_creation = { inotify::Event::create }; |
|||
auto file_deletion = { inotify::Event::remove }; |
|||
auto file_modification = { inotify::Event::moved_to }; |
|||
|
|||
// The notifier is configured to watch the parsed path for the defined events. Particular files
|
|||
// or paths can be ignored(once).
|
|||
auto notifier = inotify::BuildNotifier() |
|||
.watchPathRecursively(path) |
|||
.onEvents(file_creation, create_entry) |
|||
.onEvents(file_modification, modify_entry) |
|||
.onEvents(file_deletion, remove_entry); |
|||
|
|||
// The event loop is started in a separate thread context.
|
|||
notifier.run(); |
|||
} |
|||
|
|||
void FSWatcher::create_event(const std::string event_file) { |
|||
if(!is_ics(event_file)) return; |
|||
ical::IcalObject* object = new ical::IcalObject(); |
|||
util::parse_main_component(object, util::parse_ics_file(event_file)); |
|||
db::insert_events(m_db, object); |
|||
DEBUG << "Created Event " << event_file; |
|||
|
|||
} |
|||
|
|||
void FSWatcher::modify_event(const std::string event_file) { |
|||
if(!is_ics(event_file)) return; |
|||
DEBUG << "Modified Event " << event_file; |
|||
} |
|||
|
|||
void FSWatcher::delete_event(const std::string event_file) { |
|||
if(!is_ics(event_file)) return; |
|||
DEBUG << "Removing Event " << event_file; |
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
#pragma once |
|||
|
|||
#include <inotify-cpp/NotifierBuilder.h> |
|||
#include <filesystem> |
|||
#include <iostream> |
|||
#include <thread> |
|||
#include <chrono> |
|||
|
|||
#include <db/db.h> |
|||
|
|||
namespace db { |
|||
class FSWatcher { |
|||
public: |
|||
FSWatcher(sql::Database *db, const std::string &directory); |
|||
|
|||
void run(); |
|||
|
|||
void create_event(const std::string event_file); |
|||
void modify_event(const std::string event_file); |
|||
void delete_event(const std::string event_file); |
|||
private: |
|||
sql::Database* m_db; |
|||
const std::string m_directory; |
|||
}; |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue