Adding version to FileState database (incompatible DB formats and protobuf FileItem messages!)
Change-Id: I12b785720b5f033e9f631d0b62eb9e7fdeea0270
diff --git a/src/file-state.cc b/src/file-state.cc
index 63647c4..6ace814 100644
--- a/src/file-state.cc
+++ b/src/file-state.cc
@@ -33,6 +33,7 @@
CREATE TABLE FileState ( \n\
type INTEGER NOT NULL, /* 0 - newest, 1 - oldest */ \n\
filename TEXT NOT NULL, \n\
+ version INTEGER, \n\
directory TEXT, \n\
device_name BLOB NOT NULL, \n\
seq_no INTEGER NOT NULL, \n\
@@ -63,13 +64,15 @@
}
void
-FileState::UpdateFile (const std::string &filename, const Hash &hash, const Ccnx::CcnxCharbuf &device_name, sqlite3_int64 seq_no,
+FileState::UpdateFile (const std::string &filename, sqlite3_int64 version,
+ const Hash &hash, const Ccnx::CcnxCharbuf &device_name, sqlite3_int64 seq_no,
time_t atime, time_t mtime, time_t ctime, int mode, int seg_num)
{
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (m_db, "UPDATE FileState "
"SET "
"device_name=?, seq_no=?, "
+ "version=?,"
"file_hash=?,"
"file_atime=datetime(?, 'unixepoch'),"
"file_mtime=datetime(?, 'unixepoch'),"
@@ -80,13 +83,14 @@
sqlite3_bind_blob (stmt, 1, device_name.buf (), device_name.length (), SQLITE_STATIC);
sqlite3_bind_int64 (stmt, 2, seq_no);
- sqlite3_bind_blob (stmt, 3, hash.GetHash (), hash.GetHashBytes (), SQLITE_STATIC);
- sqlite3_bind_int64 (stmt, 4, atime);
- sqlite3_bind_int64 (stmt, 5, mtime);
- sqlite3_bind_int64 (stmt, 6, ctime);
- sqlite3_bind_int (stmt, 7, mode);
- sqlite3_bind_int (stmt, 8, seg_num);
- sqlite3_bind_text (stmt, 9, filename.c_str (), -1, SQLITE_STATIC);
+ sqlite3_bind_int64 (stmt, 3, version);
+ sqlite3_bind_blob (stmt, 4, hash.GetHash (), hash.GetHashBytes (), SQLITE_STATIC);
+ sqlite3_bind_int64 (stmt, 5, atime);
+ sqlite3_bind_int64 (stmt, 6, mtime);
+ sqlite3_bind_int64 (stmt, 7, ctime);
+ sqlite3_bind_int (stmt, 8, mode);
+ sqlite3_bind_int (stmt, 9, seg_num);
+ sqlite3_bind_text (stmt, 10, filename.c_str (), -1, SQLITE_STATIC);
sqlite3_step (stmt);
@@ -100,22 +104,22 @@
{
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (m_db, "INSERT INTO FileState "
- "(type,filename,device_name,seq_no,file_hash,file_atime,file_mtime,file_ctime,file_chmod,file_seg_num) "
- "VALUES (0, ?, ?, ?, ?, "
+ "(type,filename,version,device_name,seq_no,file_hash,file_atime,file_mtime,file_ctime,file_chmod,file_seg_num) "
+ "VALUES (0, ?, ?, ?, ?, ?, "
"datetime(?, 'unixepoch'), datetime(?, 'unixepoch'), datetime(?, 'unixepoch'), ?, ?)", -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);
- sqlite3_bind_blob (stmt, 2, device_name.buf (), device_name.length (), SQLITE_STATIC);
- sqlite3_bind_int64 (stmt, 3, seq_no);
- sqlite3_bind_blob (stmt, 4, hash.GetHash (), hash.GetHashBytes (), SQLITE_STATIC);
- sqlite3_bind_int64 (stmt, 5, atime);
- sqlite3_bind_int64 (stmt, 6, mtime);
- sqlite3_bind_int64 (stmt, 7, ctime);
- sqlite3_bind_int (stmt, 8, mode);
- sqlite3_bind_int (stmt, 9, seg_num);
- // sqlite3_bind_text (stmt, 10, filename.c_str (), -1, SQLITE_STATIC);
+ sqlite3_bind_int64 (stmt, 2, version);
+ sqlite3_bind_blob (stmt, 3, device_name.buf (), device_name.length (), SQLITE_STATIC);
+ sqlite3_bind_int64 (stmt, 4, seq_no);
+ sqlite3_bind_blob (stmt, 5, hash.GetHash (), hash.GetHashBytes (), SQLITE_STATIC);
+ sqlite3_bind_int64 (stmt, 6, atime);
+ sqlite3_bind_int64 (stmt, 7, mtime);
+ sqlite3_bind_int64 (stmt, 8, ctime);
+ sqlite3_bind_int (stmt, 9, mode);
+ sqlite3_bind_int (stmt, 10, seg_num);
sqlite3_step (stmt);
_LOG_DEBUG_COND (sqlite3_errcode (m_db) != SQLITE_DONE,
@@ -175,7 +179,7 @@
{
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (m_db,
- "SELECT filename,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete "
+ "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));
@@ -186,13 +190,14 @@
{
retval = make_shared<FileItem> ();
retval->set_filename (reinterpret_cast<const char *> (sqlite3_column_text (stmt, 0)), sqlite3_column_bytes (stmt, 0));
- retval->set_device_name (sqlite3_column_blob (stmt, 1), sqlite3_column_bytes (stmt, 1));
- retval->set_seq_no (sqlite3_column_int64 (stmt, 2));
- retval->set_file_hash (sqlite3_column_blob (stmt, 3), sqlite3_column_bytes (stmt, 3));
- retval->set_mtime (sqlite3_column_int (stmt, 4));
- retval->set_mode (sqlite3_column_int (stmt, 5));
- retval->set_seg_num (sqlite3_column_int64 (stmt, 6));
- retval->set_is_complete (sqlite3_column_int (stmt, 7));
+ 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);
@@ -205,7 +210,7 @@
{
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (m_db,
- "SELECT filename,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete "
+ "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));
@@ -217,13 +222,14 @@
{
FileItem file;
file.set_filename (reinterpret_cast<const char *> (sqlite3_column_text (stmt, 0)), sqlite3_column_bytes (stmt, 0));
- file.set_device_name (sqlite3_column_blob (stmt, 1), sqlite3_column_bytes (stmt, 1));
- file.set_seq_no (sqlite3_column_int64 (stmt, 2));
- file.set_file_hash (sqlite3_column_blob (stmt, 3), sqlite3_column_bytes (stmt, 3));
- file.set_mtime (sqlite3_column_int (stmt, 4));
- file.set_mode (sqlite3_column_int (stmt, 5));
- file.set_seg_num (sqlite3_column_int64 (stmt, 6));
- file.set_is_complete (sqlite3_column_int (stmt, 7));
+ 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);
}
@@ -239,7 +245,7 @@
{
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (m_db,
- "SELECT filename,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete "
+ "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);
@@ -255,13 +261,14 @@
{
FileItem file;
file.set_filename (reinterpret_cast<const char *> (sqlite3_column_text (stmt, 0)), sqlite3_column_bytes (stmt, 0));
- file.set_device_name (sqlite3_column_blob (stmt, 1), sqlite3_column_bytes (stmt, 1));
- file.set_seq_no (sqlite3_column_int64 (stmt, 2));
- file.set_file_hash (sqlite3_column_blob (stmt, 3), sqlite3_column_bytes (stmt, 3));
- file.set_mtime (sqlite3_column_int (stmt, 4));
- file.set_mode (sqlite3_column_int (stmt, 5));
- file.set_seg_num (sqlite3_column_int64 (stmt, 6));
- file.set_is_complete (sqlite3_column_int (stmt, 7));
+ 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);
}
@@ -280,20 +287,24 @@
return retval;
}
-FileItemsPtr
+bool
FileState::LookupFilesInFolderRecursively (const boost::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,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete "
+ "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_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));
@@ -306,9 +317,10 @@
else
{
sqlite3_prepare_v2 (m_db,
- "SELECT filename,device_name,seq_no,file_hash,strftime('%s', file_mtime),file_chmod,file_seg_num,is_complete "
+ "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);
@@ -318,22 +330,29 @@
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_device_name (sqlite3_column_blob (stmt, 1), sqlite3_column_bytes (stmt, 1));
- file.set_seq_no (sqlite3_column_int64 (stmt, 2));
- file.set_file_hash (sqlite3_column_blob (stmt, 3), sqlite3_column_bytes (stmt, 3));
- file.set_mtime (sqlite3_column_int (stmt, 4));
- file.set_mode (sqlite3_column_int (stmt, 5));
- file.set_seg_num (sqlite3_column_int64 (stmt, 6));
- file.set_is_complete (sqlite3_column_int (stmt, 7));
+ 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);
}
FileItemsPtr