diff options
author | 2006-11-12 10:34:28 +0000 | |
---|---|---|
committer | 2006-11-12 10:34:28 +0000 | |
commit | fbe607f90c70a40bb943eea264d1dada81910c7f (patch) | |
tree | be4609be26e5f9fd4532e124e116ee574122066c /src/cache.cpp | |
parent | c7c8829957da659b1420c790cf75901867fe4faa (diff) | |
download | newsboat-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.cpp | 100 |
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 +} |