diff options
Diffstat (limited to 'Swiften/History/SQLiteHistoryManager.cpp')
| -rw-r--r-- | Swiften/History/SQLiteHistoryManager.cpp | 72 | 
1 files changed, 70 insertions, 2 deletions
diff --git a/Swiften/History/SQLiteHistoryManager.cpp b/Swiften/History/SQLiteHistoryManager.cpp index 7cddf43..57fce2f 100644 --- a/Swiften/History/SQLiteHistoryManager.cpp +++ b/Swiften/History/SQLiteHistoryManager.cpp @@ -9,7 +9,7 @@  #include <sqlite3.h>  #include <Swiften/History/SQLiteHistoryManager.h> -#include <boost/date_time/gregorian/gregorian_types.hpp> +#include <boost/date_time/gregorian/gregorian.hpp>  inline std::string getEscapedString(const std::string& s) {  	std::string result(s); @@ -67,7 +67,7 @@ void SQLiteHistoryManager::addMessage(const HistoryMessage& message) {  	}  } -std::vector<HistoryMessage> SQLiteHistoryManager::getMessages(const JID& selfJID, const JID& contactJID, HistoryMessage::Type type, const boost::gregorian::date& date) const { +std::vector<HistoryMessage> SQLiteHistoryManager::getMessagesFromDate(const JID& selfJID, const JID& contactJID, HistoryMessage::Type type, const boost::gregorian::date& date) const {  	sqlite3_stmt* selectStatement;  	boost::optional<int> selfID = getIDFromJID(selfJID.toBare()); @@ -267,4 +267,72 @@ ContactsMap SQLiteHistoryManager::getContacts(const JID& selfJID, HistoryMessage  	return result;  } +boost::gregorian::date SQLiteHistoryManager::getNextDateWithLogs(const JID& selfJID, const JID& contactJID, HistoryMessage::Type type, const boost::gregorian::date& date, bool reverseOrder) const { +	sqlite3_stmt* selectStatement; +	boost::optional<int> selfID = getIDFromJID(selfJID.toBare()); +	boost::optional<int> contactID = getIDFromJID(contactJID.toBare()); + +	if (!selfID || !contactID) { +		// JIDs missing from the database +		return boost::gregorian::date(boost::gregorian::not_a_date_time); +	} + +	std::string selectQuery = "SELECT time FROM messages WHERE (type=" + boost::lexical_cast<std::string>(type); +	if (contactJID.isBare()) { +		// match only bare jid +		selectQuery += " AND ((fromBare=" + boost::lexical_cast<std::string>(*selfID) + " AND toBare=" + +				boost::lexical_cast<std::string>(*contactID) + ") OR (fromBare=" + +				boost::lexical_cast<std::string>(*contactID) + " AND toBare=" + boost::lexical_cast<std::string>(*selfID) + ")))"; +	} +	else { +		// match resource too +		selectQuery += " AND ((fromBare=" + boost::lexical_cast<std::string>(*selfID) + " AND (toBare=" + +				boost::lexical_cast<std::string>(*contactID) +" AND toResource='" + +				getEscapedString(contactJID.getResource()) + "')) OR ((fromBare=" + +				boost::lexical_cast<std::string>(*contactID) + " AND fromResource='" + +				getEscapedString(contactJID.getResource()) + "') AND toBare=" + +				boost::lexical_cast<std::string>(*selfID) + ")))"; +	} + +	int timeStamp = (boost::posix_time::ptime(date) - boost::posix_time::ptime(boost::gregorian::date(1970, 1, 1))).total_seconds() + (reverseOrder ? 0 : 86400); + +	selectQuery += " AND time" + (reverseOrder ? std::string("<") : std::string(">")) + boost::lexical_cast<std::string>(timeStamp); +	selectQuery += " ORDER BY time " + (reverseOrder ? std::string("DESC") : std::string("ASC")) + " LIMIT 1"; + +	int r = sqlite3_prepare(db_, selectQuery.c_str(), selectQuery.size(), &selectStatement, NULL); +	if (r != SQLITE_OK) { +		std::cout << "Error: " << sqlite3_errmsg(db_) << std::endl; +	} + +	r = sqlite3_step(selectStatement); +	if (r == SQLITE_ROW) { +		int secondsSinceEpoch(sqlite3_column_int(selectStatement, 0)); +		boost::posix_time::ptime time(boost::gregorian::date(1970, 1, 1), boost::posix_time::seconds(secondsSinceEpoch)); +		std::cout << "next day is: " << time.date() << "\n"; +		return time.date(); +	} + +	return boost::gregorian::date(boost::gregorian::not_a_date_time); +} + +std::vector<HistoryMessage> SQLiteHistoryManager::getMessagesFromNextDate(const JID& selfJID, const JID& contactJID, HistoryMessage::Type type, const boost::gregorian::date& date) const { +	boost::gregorian::date nextDate = getNextDateWithLogs(selfJID, contactJID, type, date, false); + +	if (nextDate.is_not_a_date()) { +		return std::vector<HistoryMessage>(); +	} + +	return getMessagesFromDate(selfJID, contactJID, type, nextDate); +} + +std::vector<HistoryMessage> SQLiteHistoryManager::getMessagesFromPreviousDate(const JID& selfJID, const JID& contactJID, HistoryMessage::Type type, const boost::gregorian::date& date) const { +	boost::gregorian::date previousDate = getNextDateWithLogs(selfJID, contactJID, type, date, true); + +	if (previousDate.is_not_a_date()) { +		return std::vector<HistoryMessage>(); +	} + +	return getMessagesFromDate(selfJID, contactJID, type, previousDate); +} +  }  | 
 Swift