summaryrefslogtreecommitdiffstats
path: root/reader/src/database/booksdb/runnables
diff options
context:
space:
mode:
Diffstat (limited to 'reader/src/database/booksdb/runnables')
-rw-r--r--reader/src/database/booksdb/runnables/ClearBooksDBRunnable.cpp46
-rw-r--r--reader/src/database/booksdb/runnables/DeleteBookRunnable.cpp37
-rw-r--r--reader/src/database/booksdb/runnables/DeleteFileEntriesRunnable.cpp60
-rw-r--r--reader/src/database/booksdb/runnables/FindFileIdRunnable.cpp123
-rw-r--r--reader/src/database/booksdb/runnables/InitBooksDBRunnable.cpp40
-rw-r--r--reader/src/database/booksdb/runnables/LoadFileEntriesRunnable.cpp68
-rw-r--r--reader/src/database/booksdb/runnables/LoadRecentBooksRunnable.cpp51
-rw-r--r--reader/src/database/booksdb/runnables/SaveAuthorsRunnable.cpp75
-rw-r--r--reader/src/database/booksdb/runnables/SaveBookRunnable.cpp43
-rw-r--r--reader/src/database/booksdb/runnables/SaveBookStateStackRunnable.cpp56
-rw-r--r--reader/src/database/booksdb/runnables/SaveRecentBooksRunnable.cpp49
-rw-r--r--reader/src/database/booksdb/runnables/SaveSeriesRunnable.cpp58
-rw-r--r--reader/src/database/booksdb/runnables/SaveTableBookRunnable.cpp80
13 files changed, 786 insertions, 0 deletions
diff --git a/reader/src/database/booksdb/runnables/ClearBooksDBRunnable.cpp b/reader/src/database/booksdb/runnables/ClearBooksDBRunnable.cpp
new file mode 100644
index 0000000..c0c9063
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/ClearBooksDBRunnable.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+bool ClearBooksDBRunnable::run() {
+ shared_ptr<DBCommand> cmd;
+
+ cmd = SQLiteFactory::createCommand(BooksDBQuery::CLEAR_DATABASE, myConnection);
+ if (!cmd->execute()) {
+ return false;
+ }
+
+ cmd = SQLiteFactory::createCommand(BooksDBQuery::INIT_DATABASE, myConnection);
+ if (!cmd->execute()) {
+ return false;
+ }
+
+ cmd = SQLiteFactory::createCommand(BooksDBQuery::SECOND_INIT_DATABASE, myConnection);
+ if (!cmd->execute()) {
+ return false;
+ }
+
+ return true;
+}
+
+
diff --git a/reader/src/database/booksdb/runnables/DeleteBookRunnable.cpp b/reader/src/database/booksdb/runnables/DeleteBookRunnable.cpp
new file mode 100644
index 0000000..e9e2c14
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/DeleteBookRunnable.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+DeleteBookRunnable::DeleteBookRunnable(DBConnection &connection) {
+ myFindFileId = new FindFileIdRunnable(connection);
+ myDeleteFile = SQLiteFactory::createCommand(BooksDBQuery::DELETE_FILE, connection, "@file_id", DBValue::DBINT);
+}
+
+bool DeleteBookRunnable::run() {
+ myFindFileId->setFileName(myFileName, true);
+ if (!myFindFileId->run()) {
+ return false;
+ }
+
+ (DBIntValue &) *myDeleteFile->parameter("@file_id").value() = myFindFileId->fileId();
+ return myDeleteFile->execute();
+}
+
diff --git a/reader/src/database/booksdb/runnables/DeleteFileEntriesRunnable.cpp b/reader/src/database/booksdb/runnables/DeleteFileEntriesRunnable.cpp
new file mode 100644
index 0000000..065a4c2
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/DeleteFileEntriesRunnable.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+DeleteFileEntriesRunnable::DeleteFileEntriesRunnable(DBConnection &connection) {
+ myDeleteFileEntries = SQLiteFactory::createCommand(BooksDBQuery::DELETE_FILE_ENTRIES, connection, "@file_id", DBValue::DBINT);
+ myLoadFileEntryIds = SQLiteFactory::createCommand(BooksDBQuery::LOAD_FILE_ENTRY_IDS, connection, "@file_id", DBValue::DBINT);
+}
+
+bool DeleteFileEntriesRunnable::run() {
+ return doDelete(myFileId);
+}
+
+bool DeleteFileEntriesRunnable::doDelete(int fileId) {
+ (DBIntValue &) *myLoadFileEntryIds->parameter("@file_id").value() = fileId;
+ shared_ptr<DBDataReader> reader = myLoadFileEntryIds->executeReader();
+ if (reader.isNull()) {
+ return false;
+ }
+
+ std::vector<int> fileIds;
+ while (reader->next()) {
+ if (reader->type(0) != DBValue::DBINT /* file_id */ ) {
+ reader->close();
+ return false;
+ }
+ fileIds.push_back(reader->intValue(0));
+ }
+ reader->close();
+
+ if (fileIds.empty()) {
+ return true;
+ }
+ for (std::vector<int>::const_iterator it = fileIds.begin(); it != fileIds.end(); ++it) {
+ if (!doDelete(*it)) {
+ return false;
+ }
+ }
+ (DBIntValue &) *myDeleteFileEntries->parameter("@file_id").value() = fileId;
+ return myDeleteFileEntries->execute();
+}
+
diff --git a/reader/src/database/booksdb/runnables/FindFileIdRunnable.cpp b/reader/src/database/booksdb/runnables/FindFileIdRunnable.cpp
new file mode 100644
index 0000000..4461c4f
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/FindFileIdRunnable.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include <ZLibrary.h>
+#include <ZLFile.h>
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+static const std::string FIND_FILE_ID =
+ "SELECT file_id FROM Files" \
+ " WHERE name = @name AND coalesce(parent_id, 0) = @parent_id;";
+
+static const std::string ADD_FILE =
+ "INSERT INTO Files (name, parent_id, size)" \
+ " VALUES(@name, nullif(@parent_id, 0), nullif(@size, 0));" \
+ " SELECT last_insert_rowid() AS file_id;";
+
+FindFileIdRunnable::FindFileIdRunnable(DBConnection &connection) {
+ myFindFileId = SQLiteFactory::createCommand(FIND_FILE_ID, connection, "@name", DBValue::DBTEXT, "@parent_id", DBValue::DBINT);
+ myAddFile = SQLiteFactory::createCommand(ADD_FILE, connection, "@name", DBValue::DBTEXT, "@parent_id", DBValue::DBINT, "@size", DBValue::DBINT);
+}
+
+bool FindFileIdRunnable::run() {
+ const std::string resolvedPath = ZLFile(myFileName).resolvedPath();
+ const std::string physPath = ZLFile(resolvedPath).physicalFilePath();
+ const std::string dirName = physPath.substr(0, physPath.rfind(ZLibrary::FileNameDelimiter));
+
+ DBTextValue &findName = (DBTextValue &) *myFindFileId->parameter("@name").value();
+ DBIntValue &findParent = (DBIntValue &) *myFindFileId->parameter("@parent_id").value();
+
+ DBTextValue &addName = (DBTextValue &) *myAddFile->parameter("@name").value();
+ DBIntValue &addParent = (DBIntValue &) *myAddFile->parameter("@parent_id").value();
+ ((DBIntValue &) *myAddFile->parameter("@size").value()) = 0;
+
+ std::size_t index = dirName.length() + 1;
+ findName = dirName;
+ findParent = 0;
+ while (true) {
+ shared_ptr<DBValue> physId = myFindFileId->executeScalar();
+ if (physId.isNull() || physId->type() != DBValue::DBINT || ((DBIntValue &) *physId).value() == 0) {
+ if (!myAdd) {
+ return false;
+ }
+ addName = findName.value();
+ addParent = findParent.value();
+ physId = myAddFile->executeScalar();
+ if (physId.isNull() || physId->type() != DBValue::DBINT || ((DBIntValue &) *physId).value() == 0) {
+ return false;
+ }
+ }
+ if (index == 0) {
+ myFileId = ((DBIntValue &) *physId).value();
+ return true;
+ }
+ std::size_t index2 = resolvedPath.find(BooksDBQuery::ArchiveEntryDelimiter, index);
+ findName = resolvedPath.substr(index, index2 - index);
+ index = index2 + 1;
+ findParent = ((DBIntValue &) *physId).value();
+ }
+}
+
+void FindFileIdRunnable::setFileName(const std::string &fileName, bool add) {
+ myFileName = fileName;
+ myAdd = add;
+ myFileId = 0;
+}
+
+int FindFileIdRunnable::fileId() const {
+ return myFileId;
+}
+
+SaveFileEntriesRunnable::SaveFileEntriesRunnable(DBConnection &connection) {
+ myAddFile = SQLiteFactory::createCommand(ADD_FILE, connection, "@name", DBValue::DBTEXT, "@parent_id", DBValue::DBINT, "@size", DBValue::DBINT);
+
+ myFindFileId = new FindFileIdRunnable(connection);
+ myDeleteFileEntries = new DeleteFileEntriesRunnable(connection);
+}
+
+bool SaveFileEntriesRunnable::run() {
+ myFindFileId->setFileName(myFileName, true);
+ if (!myFindFileId->run()) {
+ return false;
+ }
+
+ myDeleteFileEntries->setFileId(myFindFileId->fileId());
+ if (!myDeleteFileEntries->run()) {
+ return false;
+ }
+
+ DBTextValue &addName = (DBTextValue &) *myAddFile->parameter("@name").value();
+ ((DBIntValue &) *myAddFile->parameter("@parent_id").value()) = myFindFileId->fileId();
+ ((DBIntValue &) *myAddFile->parameter("@size").value()) = 0;
+
+ for (std::vector<std::string>::const_iterator it = myEntries.begin(); it != myEntries.end(); ++it) {
+ const std::string &entry = (*it);
+ if (entry.empty()) {
+ continue;
+ }
+ addName = entry;
+ if (!myAddFile->execute()) {
+ return false;
+ }
+ }
+ return true;
+}
+
diff --git a/reader/src/database/booksdb/runnables/InitBooksDBRunnable.cpp b/reader/src/database/booksdb/runnables/InitBooksDBRunnable.cpp
new file mode 100644
index 0000000..b8a4b01
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/InitBooksDBRunnable.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+bool InitBooksDBRunnable::run() {
+ shared_ptr<DBCommand> cmd;
+ cmd = SQLiteFactory::createCommand(BooksDBQuery::INIT_DATABASE, myConnection);
+ if (!cmd->execute()) {
+ return false;
+ }
+
+ cmd = SQLiteFactory::createCommand(BooksDBQuery::SECOND_INIT_DATABASE, myConnection);
+ if (!cmd->execute()) {
+ return false;
+ }
+
+ return true;
+}
+
+
diff --git a/reader/src/database/booksdb/runnables/LoadFileEntriesRunnable.cpp b/reader/src/database/booksdb/runnables/LoadFileEntriesRunnable.cpp
new file mode 100644
index 0000000..3668b83
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/LoadFileEntriesRunnable.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+LoadFileEntriesRunnable::LoadFileEntriesRunnable(DBConnection &connection) {
+ myLoadFileEntries = SQLiteFactory::createCommand(BooksDBQuery::LOAD_FILE_ENTRIES, connection, "@file_id", DBValue::DBINT);
+
+ myFindFileId = new FindFileIdRunnable(connection);
+}
+
+bool LoadFileEntriesRunnable::run() {
+ DBCommand &cmd = *myLoadFileEntries;
+
+ myFindFileId->setFileName(myFileName);
+ if (!myFindFileId->run()) {
+ return false;
+ }
+ ((DBIntValue &) *cmd.parameter("@file_id").value()) = myFindFileId->fileId();
+
+ shared_ptr<DBDataReader> reader = cmd.executeReader();
+
+ if (reader.isNull()) {
+ return false;
+ }
+
+ myEntries.clear();
+
+ bool res = true;
+ while (reader->next()) {
+ if (reader->type(0) != DBValue::DBTEXT /* name */) {
+ res = false;
+ continue;
+ }
+ myEntries.push_back(
+ myFileName + BooksDBQuery::ArchiveEntryDelimiter +
+ reader->textValue(0, std::string())
+ );
+ }
+ reader->close();
+ return res;
+}
+
+void LoadFileEntriesRunnable::setFileName(const std::string &fileName) {
+ myFileName = fileName;
+}
+
+void LoadFileEntriesRunnable::collectEntries(std::vector<std::string> &entries) {
+ myEntries.swap(entries);
+ myEntries.clear();
+}
diff --git a/reader/src/database/booksdb/runnables/LoadRecentBooksRunnable.cpp b/reader/src/database/booksdb/runnables/LoadRecentBooksRunnable.cpp
new file mode 100644
index 0000000..06e6f79
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/LoadRecentBooksRunnable.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../../library/Author.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+LoadRecentBooksRunnable::LoadRecentBooksRunnable(DBConnection &connection) {
+ myLoadRecentBooks = SQLiteFactory::createCommand(BooksDBQuery::LOAD_RECENT_BOOKS, connection);
+}
+
+bool LoadRecentBooksRunnable::run() {
+ shared_ptr<DBDataReader> reader = myLoadRecentBooks->executeReader();
+ if (reader.isNull()) {
+ return false;
+ }
+ myFileIds.clear();
+
+ bool res = true;
+ while (reader->next()) {
+ if (reader->type(0) != DBValue::DBINT /* file_id */) {
+ res = false;
+ continue;
+ }
+ const int fileId = reader->intValue(0);
+ myFileIds.push_back(fileId);
+ }
+ reader->close();
+ return res;
+}
+
+void LoadRecentBooksRunnable::collectFileIds(std::vector<int> &fileIds) {
+ myFileIds.swap(fileIds);
+ myFileIds.clear();
+}
diff --git a/reader/src/database/booksdb/runnables/SaveAuthorsRunnable.cpp b/reader/src/database/booksdb/runnables/SaveAuthorsRunnable.cpp
new file mode 100644
index 0000000..7336a74
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/SaveAuthorsRunnable.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include <algorithm>
+
+#include "../DBRunnables.h"
+#include "../../../library/Book.h"
+#include "../../../library/Author.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+SaveAuthorsRunnable::SaveAuthorsRunnable(DBConnection &connection) {
+ mySetBookAuthor = SQLiteFactory::createCommand(BooksDBQuery::SET_BOOK_AUTHOR, connection, "@author_id", DBValue::DBINT, "@book_id", DBValue::DBINT, "@author_index", DBValue::DBINT);
+ myTrimBookAuthors = SQLiteFactory::createCommand(BooksDBQuery::TRIM_BOOK_AUTHORS, connection, "@book_id", DBValue::DBINT, "@authors_number", DBValue::DBINT);
+ myFindAuthorId = SQLiteFactory::createCommand(BooksDBQuery::FIND_AUTHOR_ID, connection, "@name", DBValue::DBTEXT, "@sort_key", DBValue::DBTEXT);
+ myAddAuthor = SQLiteFactory::createCommand(BooksDBQuery::ADD_AUTHOR, connection, "@name", DBValue::DBTEXT, "@sort_key", DBValue::DBTEXT);
+}
+
+bool SaveAuthorsRunnable::run() {
+ if (myBook->bookId() == 0) {
+ return false;
+ }
+ const AuthorList &bookAuthors = myBook->authors(); // save link to vector
+
+ ((DBIntValue &) *mySetBookAuthor->parameter("@book_id").value()) = myBook->bookId();
+ DBIntValue &setAuthorId = (DBIntValue &) *mySetBookAuthor->parameter("@author_id").value();
+ DBIntValue &setAuthorIndex = (DBIntValue &) *mySetBookAuthor->parameter("@author_index").value();
+ DBTextValue &findAuthor = (DBTextValue &) *myFindAuthorId->parameter("@name").value();
+ DBTextValue &findSortKey = (DBTextValue &) *myFindAuthorId->parameter("@sort_key").value();
+ DBTextValue &addAuthor = (DBTextValue &) *myAddAuthor->parameter("@name").value();
+ DBTextValue &addSortKey = (DBTextValue &) *myAddAuthor->parameter("@sort_key").value();
+
+ int index = 0;
+ for (AuthorList::const_iterator it = bookAuthors.begin(); it != bookAuthors.end(); ++it) {
+ const Author &author = **it;
+ findAuthor.setValue( author.name() );
+ findSortKey.setValue( author.sortKey() );
+ shared_ptr<DBValue> tableAuthorId = myFindAuthorId->executeScalar();
+ if (tableAuthorId.isNull() || tableAuthorId->type() != DBValue::DBINT || ((DBIntValue &) *tableAuthorId).value() == 0) {
+ addAuthor.setValue( author.name() );
+ addSortKey.setValue( author.sortKey() );
+ tableAuthorId = myAddAuthor->executeScalar();
+ if (tableAuthorId.isNull() || tableAuthorId->type() != DBValue::DBINT || ((DBIntValue &) *tableAuthorId).value() == 0) {
+ return false;
+ }
+ }
+ setAuthorId = ((DBIntValue &) *tableAuthorId).value();
+ setAuthorIndex = ++index;
+ if (!mySetBookAuthor->execute()) {
+ return false;
+ }
+ }
+ ((DBIntValue &) *myTrimBookAuthors->parameter("@book_id").value()) = myBook->bookId();
+ ((DBIntValue &) *myTrimBookAuthors->parameter("@authors_number").value()) = index;
+ return myTrimBookAuthors->execute();
+}
+
+void SaveAuthorsRunnable::setBook(shared_ptr<Book> book) {
+ myBook = book;
+}
diff --git a/reader/src/database/booksdb/runnables/SaveBookRunnable.cpp b/reader/src/database/booksdb/runnables/SaveBookRunnable.cpp
new file mode 100644
index 0000000..7cf8dff
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/SaveBookRunnable.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../../library/Book.h"
+
+SaveBookRunnable::SaveBookRunnable(SaveTableBookRunnable &saveTableBook, SaveAuthorsRunnable &saveAuthors,
+ SaveSeriesRunnable &saveSeries, SaveTagsRunnable &saveTags) :
+ mySaveTableBook(saveTableBook),
+ mySaveAuthors(saveAuthors),
+ mySaveSeries(saveSeries),
+ mySaveTags(saveTags) {
+}
+
+bool SaveBookRunnable::run() {
+ return mySaveTableBook.run()
+ && mySaveAuthors.run()
+ && mySaveSeries.run()
+ && mySaveTags.run();
+}
+
+void SaveBookRunnable::setBook(shared_ptr<Book> book) {
+ mySaveTableBook.setBook(book);
+ mySaveAuthors.setBook(book);
+ mySaveTags.setBook(book);
+ mySaveSeries.setBook(book);
+}
diff --git a/reader/src/database/booksdb/runnables/SaveBookStateStackRunnable.cpp b/reader/src/database/booksdb/runnables/SaveBookStateStackRunnable.cpp
new file mode 100644
index 0000000..85d4a89
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/SaveBookStateStackRunnable.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+
+SaveBookStateStackRunnable::SaveBookStateStackRunnable(DBConnection &connection) {
+ myTrimBookStateStack = SQLiteFactory::createCommand(BooksDBQuery::TRIM_BOOK_STATE_STACK, connection, "@book_id", DBValue::DBINT, "@stackSize", DBValue::DBINT);
+ mySetBookStateStack = SQLiteFactory::createCommand(BooksDBQuery::SET_BOOK_STATE_STACK, connection, "@book_id", DBValue::DBINT, "@position", DBValue::DBINT, "@paragraph", DBValue::DBINT, "@word", DBValue::DBINT, "@char", DBValue::DBINT);
+}
+
+bool SaveBookStateStackRunnable::run() {
+ ((DBIntValue &) *myTrimBookStateStack->parameter("@book_id").value()) = myBookId;
+ ((DBIntValue &) *myTrimBookStateStack->parameter("@stackSize").value()) = myStack.size();
+
+ if (!myTrimBookStateStack->execute()) {
+ return false;
+ }
+
+ ((DBIntValue &) *mySetBookStateStack->parameter("@book_id").value()) = myBookId;
+
+ DBIntValue &savePosition = (DBIntValue &) *mySetBookStateStack->parameter("@position").value();
+ DBIntValue &saveParagraph = (DBIntValue &) *mySetBookStateStack->parameter("@paragraph").value();
+ DBIntValue &saveWord = (DBIntValue &) *mySetBookStateStack->parameter("@word").value();
+ DBIntValue &saveChar = (DBIntValue &) *mySetBookStateStack->parameter("@char").value();
+
+ for (std::size_t i = 0; i < myStack.size(); ++i) {
+ const ReadingState &pos = myStack[i];
+ savePosition = i + 1;
+ saveParagraph = pos.Paragraph;
+ saveWord = pos.Word;
+ saveChar = pos.Character;
+ if (!mySetBookStateStack->execute()) {
+ return false;
+ }
+ }
+ return true;
+}
+
diff --git a/reader/src/database/booksdb/runnables/SaveRecentBooksRunnable.cpp b/reader/src/database/booksdb/runnables/SaveRecentBooksRunnable.cpp
new file mode 100644
index 0000000..1c355ed
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/SaveRecentBooksRunnable.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../../library/Book.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+SaveRecentBooksRunnable::SaveRecentBooksRunnable(DBConnection &connection) {
+ myClearRecentBooks = SQLiteFactory::createCommand(BooksDBQuery::CLEAR_RECENT_BOOKS, connection);
+ myInsertRecentBooks = SQLiteFactory::createCommand(BooksDBQuery::INSERT_RECENT_BOOKS, connection, "@book_id", DBValue::DBINT);
+}
+
+bool SaveRecentBooksRunnable::run() {
+ if (!myClearRecentBooks->execute()) {
+ return false;
+ }
+ DBIntValue &insertBookId = (DBIntValue &) *myInsertRecentBooks->parameter("@book_id").value();
+ for (BookList::const_iterator it = myBooks.begin(); it != myBooks.end(); ++it) {
+ shared_ptr<Book> book = (*it);
+ if (book->bookId() == 0) {
+ return false;
+ }
+ insertBookId = book->bookId();
+ if (!myInsertRecentBooks->execute()) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void SaveRecentBooksRunnable::setBooks(const BookList &books) {
+ myBooks = books; // copy vector
+}
diff --git a/reader/src/database/booksdb/runnables/SaveSeriesRunnable.cpp b/reader/src/database/booksdb/runnables/SaveSeriesRunnable.cpp
new file mode 100644
index 0000000..e56777b
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/SaveSeriesRunnable.cpp
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../../library/Book.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+SaveSeriesRunnable::SaveSeriesRunnable(DBConnection &connection) {
+ mySetBookSeries = SQLiteFactory::createCommand(BooksDBQuery::SET_BOOKSERIES, connection, "@book_id", DBValue::DBINT, "@series_id", DBValue::DBINT, "@book_index", DBValue::DBTEXT);
+ myDeleteBookSeries = SQLiteFactory::createCommand(BooksDBQuery::DELETE_BOOKSERIES, connection, "@book_id", DBValue::DBINT);
+ myFindSeriesId = SQLiteFactory::createCommand(BooksDBQuery::FIND_SERIES_ID, connection, "@name", DBValue::DBTEXT);
+ myAddSeries = SQLiteFactory::createCommand(BooksDBQuery::ADD_SERIES, connection, "@name", DBValue::DBTEXT);
+}
+
+bool SaveSeriesRunnable::run() {
+ if (myBook->bookId() == 0) {
+ return false;
+ }
+
+ if (myBook->seriesTitle().empty()) {
+ ((DBIntValue &) *myDeleteBookSeries->parameter("@book_id").value()) = myBook->bookId();
+ return myDeleteBookSeries->execute();
+ }
+
+ ((DBTextValue &) *myFindSeriesId->parameter("@name").value()) = myBook->seriesTitle();
+ shared_ptr<DBValue> tableSeriesId = myFindSeriesId->executeScalar();
+ if (tableSeriesId.isNull() || tableSeriesId->type() != DBValue::DBINT || ((DBIntValue &) *tableSeriesId).value() == 0) {
+ ((DBTextValue &) *myAddSeries->parameter("@name").value()) = myBook->seriesTitle();
+ tableSeriesId = myAddSeries->executeScalar();
+ if (tableSeriesId.isNull() || tableSeriesId->type() != DBValue::DBINT || ((DBIntValue &) *tableSeriesId).value() == 0) {
+ return false;
+ }
+ }
+ ((DBIntValue &) *mySetBookSeries->parameter("@book_id").value()) = myBook->bookId();
+ mySetBookSeries->parameter("@series_id").setValue( tableSeriesId );
+ ((DBTextValue &) *mySetBookSeries->parameter("@book_index").value()) = myBook->indexInSeries().value();
+ return mySetBookSeries->execute();
+}
+
+void SaveSeriesRunnable::setBook(shared_ptr<Book> book) {
+ myBook = book;
+}
diff --git a/reader/src/database/booksdb/runnables/SaveTableBookRunnable.cpp b/reader/src/database/booksdb/runnables/SaveTableBookRunnable.cpp
new file mode 100644
index 0000000..770963e
--- /dev/null
+++ b/reader/src/database/booksdb/runnables/SaveTableBookRunnable.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../DBRunnables.h"
+#include "../../../library/Book.h"
+#include "../../sqldb/implsqlite/SQLiteFactory.h"
+
+SaveTableBookRunnable::SaveTableBookRunnable(DBConnection &connection) {
+ myFindBookId = SQLiteFactory::createCommand(BooksDBQuery::FIND_BOOK_ID, connection, "@file_id", DBValue::DBINT);
+
+ myAddBook = SQLiteFactory::createCommand(BooksDBQuery::ADD_BOOK, connection, "@encoding", DBValue::DBTEXT, "@language", DBValue::DBTEXT, "@title", DBValue::DBTEXT, "@file_id", DBValue::DBINT);
+ myUpdateBook = SQLiteFactory::createCommand(BooksDBQuery::UPDATE_BOOK, connection, "@encoding", DBValue::DBTEXT, "@language", DBValue::DBTEXT, "@title", DBValue::DBTEXT, "@book_id", DBValue::DBINT);
+
+ myFindFileId = new FindFileIdRunnable(connection);
+}
+
+bool SaveTableBookRunnable::run() {
+ if (myBook->bookId() != 0) {
+ return updateTableBook(myBook);
+ }
+
+ myFindFileId->setFileName(myBook->file().path(), true);
+ if (!myFindFileId->run()) {
+ return false;
+ }
+ const int fileId = myFindFileId->fileId();
+
+ ((DBIntValue &) *myFindBookId->parameter("@file_id").value()) = fileId;
+ shared_ptr<DBValue> dbBookId = myFindBookId->executeScalar();
+
+ if (dbBookId.isNull() || dbBookId->type() != DBValue::DBINT || ((DBIntValue &) *dbBookId).value() == 0) {
+ return addTableBook(myBook, fileId);
+ } else {
+ myBook->setBookId( ((DBIntValue &) *dbBookId).value() );
+ return updateTableBook(myBook);
+ }
+}
+
+bool SaveTableBookRunnable::addTableBook(const shared_ptr<Book> book, int fileId) {
+
+ ((DBTextValue &) *myAddBook->parameter("@encoding").value()) = book->encoding();
+ ((DBTextValue &) *myAddBook->parameter("@language").value()) = book->language();
+ ((DBTextValue &) *myAddBook->parameter("@title").value()) = book->title();
+ ((DBIntValue &) *myAddBook->parameter("@file_id").value()) = fileId;
+ shared_ptr<DBValue> dbBookId = myAddBook->executeScalar();
+
+ if (dbBookId.isNull() || dbBookId->type() != DBValue::DBINT || ((DBIntValue &) *dbBookId).value() == 0) {
+ return false;
+ }
+ book->setBookId(((DBIntValue&)*dbBookId).value());
+ return true;
+}
+
+bool SaveTableBookRunnable::updateTableBook(const shared_ptr<Book> book) {
+ ((DBTextValue&)*myUpdateBook->parameter("@encoding").value()) = book->encoding();
+ ((DBTextValue&)*myUpdateBook->parameter("@language").value()) = book->language();
+ ((DBTextValue&)*myUpdateBook->parameter("@title").value()) = book->title();
+ ((DBIntValue&)*myUpdateBook->parameter("@book_id").value()) = book->bookId();
+ return myUpdateBook->execute();
+}
+
+void SaveTableBookRunnable::setBook(shared_ptr<Book> book) {
+ myBook = book;
+}