summaryrefslogtreecommitdiff
path: root/src/cache.cpp
diff options
context:
space:
mode:
authorGravatar Andreas Krennmair <ak@synflood.at> 2006-11-12 10:34:28 +0000
committerGravatar Andreas Krennmair <ak@synflood.at> 2006-11-12 10:34:28 +0000
commitfbe607f90c70a40bb943eea264d1dada81910c7f (patch)
treebe4609be26e5f9fd4532e124e116ee574122066c /src/cache.cpp
parentc7c8829957da659b1420c790cf75901867fe4faa (diff)
downloadnewsboat-fbe607f90c70a40bb943eea264d1dada81910c7f.tar.gz
newsboat-fbe607f90c70a40bb943eea264d1dada81910c7f.tar.zst
newsboat-fbe607f90c70a40bb943eea264d1dada81910c7f.zip
Andreas Krennmair:
added first parts of a cache.
Diffstat (limited to 'src/cache.cpp')
-rw-r--r--src/cache.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/cache.cpp b/src/cache.cpp
new file mode 100644
index 00000000..02baa5ce
--- /dev/null
+++ b/src/cache.cpp
@@ -0,0 +1,100 @@
+#include <cache.h>
+#include <sqlite3.h>
+
+#include <sstream>
+#include <fstream>
+#include <iostream>
+
+//-------------------------------------------
+
+struct cb_handler {
+ cb_handler() : c(-1) { }
+ void set_count(int i) { c = i; }
+ int count() { return c; }
+ private:
+ int c;
+};
+
+static int count_callback(void * handler, int argc, char ** argv, char ** azColName) {
+ cb_handler * cbh = (cb_handler *)handler;
+ if (argc>0) {
+ std::istringstream is(argv[0]);
+ int x;
+ is >> x;
+ cbh->set_count(x);
+ }
+ return 0;
+}
+
+//-------------------------------------------
+
+
+
+using namespace noos;
+
+cache::cache(const std::string& cachefile) : db(0) {
+ bool file_exists = false;
+ std::fstream f;
+ f.open(cachefile.c_str(), std::fstream::in | std::fstream::out);
+ if (f.is_open()) {
+ file_exists = true;
+ }
+ int error = sqlite3_open(cachefile.c_str(),&db);
+ if (error != SQLITE_OK) {
+ // TODO: error message
+ sqlite3_close(db);
+ ::exit(1);
+ }
+ // if (!file_exists) {
+ populate_tables();
+ // }
+}
+
+cache::~cache() {
+ sqlite3_close(db);
+}
+
+void cache::populate_tables() {
+ // TODO: run create table statements
+ int rc;
+
+ rc = sqlite3_exec(db,"CREATE TABLE rss_feed ( "
+ " url VARCHAR(1024) PRIMARY KEY NOT NULL, "
+ " title VARCHAR(1024) NOT NULL ); " , NULL, NULL, NULL);
+
+ rc = sqlite3_exec(db,"CREATE TABLE rss_item ( "
+ " guid VARCHAR(64) PRIMARY KEY NOT NULL, "
+ " title VARCHAR(1024) NOT NULL, "
+ " author VARCHAR(1024) NOT NULL, "
+ " url VARCHAR(1024) NOT NULL, "
+ " feedurl VARCHAR(1024) NOT NULL, "
+ " pubDate DATETIME NOT NULL, "
+ " content VARCHAR(65535) NOT NULL );", NULL, NULL, NULL);
+}
+
+
+void cache::externalize_rssfeed(rss_feed& feed) {
+ // XXX: protect from SQL injection!!!!
+ std::ostringstream query;
+ query << "SELECT count(*) FROM rss_feed WHERE url = '" << feed.link() << "';";
+ cb_handler count_cbh;
+ int rc = sqlite3_exec(db,query.str().c_str(),count_callback,&count_cbh,NULL);
+ std::cerr << "externalize: count rc = " << rc << std::endl;
+ int count = count_cbh.count();
+ std::cerr << "externalize: count = " << count << std::endl;
+ if (count > 0) {
+ char * updatequery = sqlite3_mprintf("UPDATE rss_feed SET title = '%q' WHERE url = '%q';",feed.title().c_str(),feed.link().c_str());
+ rc = sqlite3_exec(db,updatequery,NULL,NULL,NULL);
+ free(updatequery);
+ std::cerr << "externalize: update rc = " << rc << " query = " << updatequery << std::endl;
+ } else {
+ char * insertquery = sqlite3_mprintf("INSERT INTO rss_feed (url, title) VALUES ( '%q', '%q' );", feed.link().c_str(), feed.title().c_str());
+ rc = sqlite3_exec(db,insertquery,NULL,NULL,NULL);
+ free(insertquery);
+ std::cerr << "externalize: insert rc = " << rc << " query = " << insertquery << std::endl;
+ }
+}
+
+void cache::internalize_rssfeed(rss_feed& feed) {
+ // TODO
+}