blob: 6c5e51a629ae9a213d4d43f883a0df112030adc2 [file] [log] [blame]
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2016, Regents of the University of California.
Alexander Afanasyeva199f972013-01-02 19:37:26 -08004 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08005 * This file is part of ChronoShare, a decentralized file sharing application over NDN.
Alexander Afanasyeva199f972013-01-02 19:37:26 -08006 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08007 * ChronoShare is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
Alexander Afanasyeva199f972013-01-02 19:37:26 -080010 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -080011 * ChronoShare is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU General Public License for more details.
Alexander Afanasyeva199f972013-01-02 19:37:26 -080014 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -080015 * You should have received copies of the GNU General Public License along with
16 * ChronoShare, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ChronoShare authors and contributors.
Alexander Afanasyeva199f972013-01-02 19:37:26 -080019 */
20
21#ifndef ACTION_LOG_H
22#define ACTION_LOG_H
23
Alexander Afanasyevf4cde4e2016-12-25 13:42:57 -080024#include "db-helper.hpp"
25#include "file-state.hpp"
26#include "sync-log.hpp"
27#include "action-item.pb.hpp"
28#include "file-item.pb.hpp"
29#include "ccnx-wrapper.hpp"
30#include "ccnx-pco.hpp"
Alexander Afanasyev8e2104a2013-01-22 10:56:18 -080031
Alexander Afanasyev433ecda2013-01-02 22:13:45 -080032#include <boost/tuple/tuple.hpp>
Alexander Afanasyeva199f972013-01-02 19:37:26 -080033
Alexander Afanasyevb6bc01a2013-01-02 23:34:20 -080034class ActionLog;
35typedef boost::shared_ptr<ActionLog> ActionLogPtr;
Alexander Afanasyeva35756b2013-01-22 16:59:11 -080036typedef boost::shared_ptr<ActionItem> ActionItemPtr;
Alexander Afanasyevb6bc01a2013-01-02 23:34:20 -080037
Alexander Afanasyev8e2104a2013-01-22 10:56:18 -080038class ActionLog : public DbHelper
Alexander Afanasyeva199f972013-01-02 19:37:26 -080039{
40public:
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070041 typedef boost::function<void (std::string /*filename*/, Ndnx::Name /*device_name*/, sqlite3_int64 /*seq_no*/,
Alexander Afanasyevf9978f82013-01-23 16:30:31 -080042 HashPtr /*hash*/, time_t /*m_time*/, int /*mode*/, int /*seg_num*/)> OnFileAddedOrChangedCallback;
43
44 typedef boost::function<void (std::string /*filename*/)> OnFileRemovedCallback;
45
46public:
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070047 ActionLog (Ndnx::NdnxWrapperPtr ndnx, const boost::filesystem::path &path,
Alexander Afanasyev8e2104a2013-01-22 10:56:18 -080048 SyncLogPtr syncLog,
Alexander Afanasyev1d1cc832013-02-05 20:03:36 -080049 const std::string &sharedFolder, const std::string &appName,
Alexander Afanasyevf9978f82013-01-23 16:30:31 -080050 OnFileAddedOrChangedCallback onFileAddedOrChanged, OnFileRemovedCallback onFileRemoved);
Alexander Afanasyeva199f972013-01-02 19:37:26 -080051
Alexander Afanasyev0a30a0c2013-01-29 17:25:42 -080052 virtual ~ActionLog () { }
53
Alexander Afanasyev053e5ac2013-01-22 20:59:13 -080054 //////////////////////////
55 // Local operations //
56 //////////////////////////
Alexander Afanasyevf9978f82013-01-23 16:30:31 -080057 ActionItemPtr
Alexander Afanasyeva35756b2013-01-22 16:59:11 -080058 AddLocalActionUpdate (const std::string &filename,
59 const Hash &hash,
60 time_t wtime,
61 int mode,
62 int seg_num);
63
64 // void
65 // AddActionMove (const std::string &oldFile, const std::string &newFile);
Alexander Afanasyeva199f972013-01-02 19:37:26 -080066
Alexander Afanasyevf9978f82013-01-23 16:30:31 -080067 ActionItemPtr
Alexander Afanasyeva35756b2013-01-22 16:59:11 -080068 AddLocalActionDelete (const std::string &filename);
Alexander Afanasyev433ecda2013-01-02 22:13:45 -080069
Alexander Afanasyev053e5ac2013-01-22 20:59:13 -080070 //////////////////////////
71 // Remote operations //
72 //////////////////////////
73
Alexander Afanasyevf9978f82013-01-23 16:30:31 -080074 ActionItemPtr
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070075 AddRemoteAction (const Ndnx::Name &deviceName, sqlite3_int64 seqno, Ndnx::PcoPtr actionPco);
Alexander Afanasyev053e5ac2013-01-22 20:59:13 -080076
77 /**
78 * @brief Add remote action using just action's parsed content object
79 *
80 * This function extracts device name and sequence number from the content object's and calls the overloaded method
81 */
Alexander Afanasyevf9978f82013-01-23 16:30:31 -080082 ActionItemPtr
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070083 AddRemoteAction (Ndnx::PcoPtr actionPco);
Alexander Afanasyev053e5ac2013-01-22 20:59:13 -080084
85 ///////////////////////////
86 // General operations //
87 ///////////////////////////
88
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070089 Ndnx::PcoPtr
90 LookupActionPco (const Ndnx::Name &deviceName, sqlite3_int64 seqno);
Alexander Afanasyeva35756b2013-01-22 16:59:11 -080091
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070092 Ndnx::PcoPtr
93 LookupActionPco (const Ndnx::Name &actionName);
Alexander Afanasyeva35756b2013-01-22 16:59:11 -080094
95 ActionItemPtr
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070096 LookupAction (const Ndnx::Name &deviceName, sqlite3_int64 seqno);
Alexander Afanasyeva35756b2013-01-22 16:59:11 -080097
98 ActionItemPtr
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070099 LookupAction (const Ndnx::Name &actionName);
Alexander Afanasyeva35756b2013-01-22 16:59:11 -0800100
Alexander Afanasyev026eaf32013-02-23 16:37:14 -0800101 FileItemPtr
102 LookupAction (const std::string &filename, sqlite3_int64 version, const Hash &filehash);
Alexander Afanasyev7a647002013-01-30 11:54:52 -0800103
Alexander Afanasyev95f9f552013-02-26 23:05:20 -0800104 /**
105 * @brief Lookup up to [limit] actions starting [offset] in decreasing order (by timestamp) and calling visitor(device_name,seqno,action) for each action
106 */
Alexander Afanasyeve1c95042013-02-27 01:02:36 -0800107 bool
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700108 LookupActionsInFolderRecursively (const boost::function<void (const Ndnx::Name &name, sqlite3_int64 seq_no, const ActionItem &)> &visitor,
Alexander Afanasyev95f9f552013-02-26 23:05:20 -0800109 const std::string &folder, int offset=0, int limit=-1);
110
Alexander Afanasyev39dbc4b2013-03-01 10:39:23 -0800111 bool
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700112 LookupActionsForFile (const boost::function<void (const Ndnx::Name &name, sqlite3_int64 seq_no, const ActionItem &)> &visitor,
Alexander Afanasyev39dbc4b2013-03-01 10:39:23 -0800113 const std::string &file, int offset=0, int limit=-1);
114
Zhenkai Zhu25e13582013-02-27 15:33:01 -0800115 void
116 LookupRecentFileActions(const boost::function<void (const std::string &, int, int)> &visitor, int limit = 5);
117
Alexander Afanasyevd6364ef2013-02-06 13:13:07 -0800118 //
119 inline FileStatePtr
120 GetFileState ();
Alexander Afanasyev0a30a0c2013-01-29 17:25:42 -0800121
Alexander Afanasyeva35756b2013-01-22 16:59:11 -0800122public:
123 // for test purposes
124 sqlite3_int64
125 LogSize ();
126
Alexander Afanasyev433ecda2013-01-02 22:13:45 -0800127private:
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700128 boost::tuple<sqlite3_int64 /*version*/, Ndnx::NdnxCharbufPtr /*device name*/, sqlite3_int64 /*seq_no*/>
Alexander Afanasyev0995f322013-01-22 13:16:46 -0800129 GetLatestActionForFile (const std::string &filename);
Alexander Afanasyevee7e6132013-01-03 20:03:14 -0800130
131 static void
132 apply_action_xFun (sqlite3_context *context, int argc, sqlite3_value **argv);
Alexander Afanasyev8e2104a2013-01-22 10:56:18 -0800133
Alexander Afanasyevc9eb68f2013-01-07 13:40:00 -0800134private:
Alexander Afanasyev8e2104a2013-01-22 10:56:18 -0800135 SyncLogPtr m_syncLog;
Alexander Afanasyevd6364ef2013-02-06 13:13:07 -0800136 FileStatePtr m_fileState;
Alexander Afanasyev8e2104a2013-01-22 10:56:18 -0800137
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700138 Ndnx::NdnxWrapperPtr m_ndnx;
Alexander Afanasyeva35756b2013-01-22 16:59:11 -0800139 std::string m_sharedFolderName;
Alexander Afanasyev1d1cc832013-02-05 20:03:36 -0800140 std::string m_appName;
Alexander Afanasyevf9978f82013-01-23 16:30:31 -0800141
142 OnFileAddedOrChangedCallback m_onFileAddedOrChanged;
143 OnFileRemovedCallback m_onFileRemoved;
Alexander Afanasyeva199f972013-01-02 19:37:26 -0800144};
145
Alexander Afanasyev053e5ac2013-01-22 20:59:13 -0800146namespace Error {
147struct ActionLog : virtual boost::exception, virtual std::exception { };
148}
149
Alexander Afanasyevd6364ef2013-02-06 13:13:07 -0800150inline FileStatePtr
151ActionLog::GetFileState ()
152{
153 return m_fileState;
154}
155
Alexander Afanasyev053e5ac2013-01-22 20:59:13 -0800156
Alexander Afanasyeva199f972013-01-02 19:37:26 -0800157#endif // ACTION_LOG_H