From 83fe11e0fc03dc7851f1e74974bbeb0ee3e37e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Mon, 25 Aug 2014 12:50:01 +0200 Subject: [PATCH] also store other response codes in the cache --- src/util/filesource.cpp | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/util/filesource.cpp b/src/util/filesource.cpp index bca2cfbc4..018465990 100644 --- a/src/util/filesource.cpp +++ b/src/util/filesource.cpp @@ -26,7 +26,13 @@ FileSource::~FileSource() { void FileSource::createSchema() { if (db) { // Create schema - const int err = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS `http_cache` (`url` TEXT PRIMARY KEY, `expires` INTEGER, `data` BLOB)", nullptr, nullptr, nullptr); + const int err = sqlite3_exec(db, + "CREATE TABLE IF NOT EXISTS `http_cache` (" + "`url` TEXT PRIMARY KEY NOT NULL," + "`code` INTEGER NOT NULL," + "`expires` INTEGER," + "`data` BLOB" + ")", nullptr, nullptr, nullptr); if (err != SQLITE_OK) { Log::Warning(Event::Database, "%s: %s", sqlite3_errstr(err), sqlite3_errmsg(db)); closeDatabase(); @@ -75,7 +81,7 @@ bool FileSource::loadFile(const std::string &url, std::function(sqlite3_column_blob(stmt, 0)); - const size_t size = sqlite3_column_bytes(stmt, 0); + res.code = sqlite3_column_int(stmt, 0); + const char *data = reinterpret_cast(sqlite3_column_blob(stmt, 1)); + const size_t size = sqlite3_column_bytes(stmt, 1); res.body = { data, size }; callback(&res); status = true; @@ -126,7 +132,7 @@ void FileSource::saveFile(const std::string &url, platform::Response *const res) sqlite3_stmt *stmt = nullptr; int err; - err = sqlite3_prepare_v2(db, "REPLACE INTO `http_cache` (`url`, `data`) VALUES(?, ?)", -1, &stmt, nullptr); + err = sqlite3_prepare_v2(db, "REPLACE INTO `http_cache` (`url`, `code`, `data`) VALUES(?, ?, ?)", -1, &stmt, nullptr); if (err != SQLITE_OK) { Log::Warning(Event::Database, "%s: %s", sqlite3_errstr(err), sqlite3_errmsg(db)); return; @@ -142,7 +148,17 @@ void FileSource::saveFile(const std::string &url, platform::Response *const res) return; } - err = sqlite3_bind_blob(stmt, 2, res->body.data(), res->body.size(), nullptr); + err = sqlite3_bind_int(stmt, 2, res->code); + if (err != SQLITE_OK) { + Log::Warning(Event::Database, "%s: %s", sqlite3_errstr(err), sqlite3_errmsg(db)); + err = sqlite3_finalize(stmt); + if (err != SQLITE_OK) { + Log::Warning(Event::Database, "%s: %s", sqlite3_errstr(err), sqlite3_errmsg(db)); + } + return; + } + + err = sqlite3_bind_blob(stmt, 3, res->body.data(), res->body.size(), nullptr); if (err != SQLITE_OK) { Log::Warning(Event::Database, "%s: %s", sqlite3_errstr(err), sqlite3_errmsg(db)); err = sqlite3_finalize(stmt); @@ -205,9 +221,7 @@ void FileSource::load(ResourceType /*type*/, const std::string &url, std::functi if (!loadFile(cleanURL, callback)) { const std::shared_ptr source = shared_from_this(); platform::request_http(absoluteURL, [=](platform::Response *res) { - if (res->code == 200) { - source->saveFile(cleanURL, res); - } + source->saveFile(cleanURL, res); callback(res); }, loop); }