95
95
static int rssitem_callback(void * myfeed, int argc, char ** argv, char ** /* azColName */) {
96
96
std::tr1::shared_ptr<rss_feed>* feed = static_cast<std::tr1::shared_ptr<rss_feed>* >(myfeed);
98
98
std::tr1::shared_ptr<rss_item> item(new rss_item(NULL));
99
99
item->set_guid(argv[0]);
100
100
item->set_title(argv[1]);
123
124
static int rssitemvector_callback(void * vector, int argc, char ** argv, char ** /* azColName */) {
124
125
std::vector<std::tr1::shared_ptr<rss_item> >* items = static_cast<std::vector<std::tr1::shared_ptr<rss_item> > *>(vector);
127
128
std::tr1::shared_ptr<rss_item> item(new rss_item(NULL));
128
129
item->set_guid(argv[0]);
129
130
item->set_title(argv[1]);
152
154
static int search_item_callback(void * myfeed, int argc, char ** argv, char ** /* azColName */) {
153
155
std::vector<std::tr1::shared_ptr<rss_item> > * items = static_cast<std::vector<std::tr1::shared_ptr<rss_item> > *>(myfeed);
155
157
std::tr1::shared_ptr<rss_item> item(new rss_item(NULL));
156
158
item->set_guid(argv[0]);
157
159
item->set_title(argv[1]);
292
295
rc = sqlite3_exec(db, "ALTER TABLE rss_feed ADD etag VARCHAR(128) NOT NULL DEFAULT \"\";", NULL, NULL, NULL);
293
296
LOG(LOG_DEBUG, "cache::populate_tables: ALTER TABLE rss_feed (9) rc = %d", rc);
298
rc = sqlite3_exec(db, "ALTER TABLE rss_item ADD base VARCHAR(128) NOT NULL DEFAULT \"\";", NULL, NULL, NULL);
299
LOG(LOG_DEBUG, "cache::populate_tables: ALTER TABLE rss_feed(10) rc = %d", rc);
399
404
// this function reads an rss_feed including all of its rss_items.
400
405
// the feed parameter needs to have the rssurl member set.
401
void cache::internalize_rssfeed(std::tr1::shared_ptr<rss_feed> feed) {
406
void cache::internalize_rssfeed(std::tr1::shared_ptr<rss_feed> feed, rss_ignores * ign) {
402
407
scope_measure m1("cache::internalize_rssfeed");
403
408
if (feed->rssurl().substr(0,6) == "query:")
432
437
feed->items().clear();
434
439
/* ...and then the associated items */
435
query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags FROM rss_item WHERE feedurl = '%q' AND deleted = 0 ORDER BY pubDate DESC, id DESC;",feed->rssurl().c_str());
440
query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags,base FROM rss_item WHERE feedurl = '%q' AND deleted = 0 ORDER BY pubDate DESC, id DESC;",feed->rssurl().c_str());
436
441
LOG(LOG_DEBUG,"running query: %s",query.c_str());
437
442
rc = sqlite3_exec(db,query.c_str(),rssitem_callback,&feed,NULL);
438
443
if (rc != SQLITE_OK) {
443
448
unsigned int i=0;
444
for (std::vector<std::tr1::shared_ptr<rss_item> >::iterator it=feed->items().begin(); it != feed->items().end(); ++it, ++i) {
449
for (std::vector<std::tr1::shared_ptr<rss_item> >::iterator it=feed->items().begin(); it != feed->items().end(); ++it,++i) {
450
if (ign && ign->matches(it->get())) {
451
feed->items().erase(it);
452
// since we modified the vector, we need to reset the iterator
453
// to the beginning of the vector, and then fast-forward to
455
it = feed->items().begin();
456
for (int j=0;j<int(i)-1;j++) {
445
461
(*it)->set_cache(this);
446
462
(*it)->set_feedptr(feed);
447
463
(*it)->set_feedurl(feed->rssurl());
473
489
void cache::get_latest_items(std::vector<std::tr1::shared_ptr<rss_item> >& items, unsigned int limit) {
474
490
scope_mutex lock(&mtx);
475
std::string query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags "
491
std::string query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags,base "
476
492
"FROM rss_item WHERE deleted = 0 ORDER BY pubDate DESC, id DESC LIMIT %d;", limit);
477
493
LOG(LOG_DEBUG, "running query: %s", query.c_str());
478
494
int rc = sqlite3_exec(db, query.c_str(), rssitemvector_callback, &items, NULL);
509
525
scope_mutex lock(&mtx);
510
526
if (feedurl.length() > 0) {
511
query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags FROM rss_item WHERE (title LIKE '%%%q%%' OR content LIKE '%%%q%%') AND feedurl = '%q' AND deleted = 0 ORDER BY pubDate DESC, id DESC;",querystr.c_str(), querystr.c_str(), feedurl.c_str());
527
query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags,base FROM rss_item WHERE (title LIKE '%%%q%%' OR content LIKE '%%%q%%') AND feedurl = '%q' AND deleted = 0 ORDER BY pubDate DESC, id DESC;",querystr.c_str(), querystr.c_str(), feedurl.c_str());
513
query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags FROM rss_item WHERE (title LIKE '%%%q%%' OR content LIKE '%%%q%%') AND deleted = 0 ORDER BY pubDate DESC, id DESC;",querystr.c_str(), querystr.c_str());
529
query = prepare_query("SELECT guid,title,author,url,pubDate,content,unread,feedurl,enclosure_url,enclosure_type,enqueued,flags,base FROM rss_item WHERE (title LIKE '%%%q%%' OR content LIKE '%%%q%%') AND deleted = 0 ORDER BY pubDate DESC, id DESC;",querystr.c_str(), querystr.c_str());
516
532
LOG(LOG_DEBUG,"running query: %s",query.c_str());
639
std::string update = prepare_query("UPDATE rss_item SET title = '%q', author = '%q', url = '%q', feedurl = '%q', content = '%q', enclosure_url = '%q', enclosure_type = '%q' WHERE guid = '%q'",
640
item->title_raw().c_str(), item->author_raw().c_str(), item->link().c_str(),
641
feedurl.c_str(), item->description_raw().c_str(),
642
item->enclosure_url().c_str(), item->enclosure_type().c_str(),
643
item->guid().c_str());
656
if (item->override_unread()) {
657
update = prepare_query("UPDATE rss_item SET title = '%q', author = '%q', url = '%q', feedurl = '%q', content = '%q', enclosure_url = '%q', enclosure_type = '%q', base = '%q', unread = '%d' WHERE guid = '%q'",
658
item->title_raw().c_str(), item->author_raw().c_str(), item->link().c_str(),
659
feedurl.c_str(), item->description_raw().c_str(),
660
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->get_base().c_str(),
661
(item->unread() ? 1 : 0),
662
item->guid().c_str());
664
update = prepare_query("UPDATE rss_item SET title = '%q', author = '%q', url = '%q', feedurl = '%q', content = '%q', enclosure_url = '%q', enclosure_type = '%q', base = '%q' WHERE guid = '%q'",
665
item->title_raw().c_str(), item->author_raw().c_str(), item->link().c_str(),
666
feedurl.c_str(), item->description_raw().c_str(),
667
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->get_base().c_str(),
668
item->guid().c_str());
644
670
LOG(LOG_DEBUG,"running query: %s", update.c_str());
645
671
rc = sqlite3_exec(db,update.c_str(),NULL,NULL,NULL);
646
672
if (rc != SQLITE_OK) {
648
674
throw dbexception(db);
651
std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued) "
652
"VALUES ('%q','%q','%q','%q','%q','%u','%q',1,'%q','%q',%d)",
677
std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued, base) "
678
"VALUES ('%q','%q','%q','%q','%q','%u','%q','%d','%q','%q',%d, '%q')",
653
679
item->guid().c_str(), item->title_raw().c_str(), item->author_raw().c_str(),
654
item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(),
655
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0);
680
item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(), (item->unread() ? 1 : 0),
681
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->get_base().c_str());
656
682
LOG(LOG_DEBUG,"running query: %s", insert.c_str());
657
683
rc = sqlite3_exec(db,insert.c_str(),NULL,NULL,NULL);
658
684
if (rc != SQLITE_OK) {
720
746
throw dbexception(db);
723
std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued,flags) "
724
"VALUES ('%q','%q','%q','%q','%q','%u','%q',1,'%q','%q',%d, '%q')",
749
std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued,flags,base) "
750
"VALUES ('%q','%q','%q','%q','%q','%u','%q','%d','%q','%q',%d, '%q', '%q')",
725
751
item->guid().c_str(), item->title_raw().c_str(), item->author_raw().c_str(),
726
item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(),
727
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->flags().c_str());
752
item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(), item->unread() ? 1 : 0,
753
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->flags().c_str(),
754
item->get_base().c_str());
728
755
LOG(LOG_DEBUG,"running query: %s", insert.c_str());
729
756
rc = sqlite3_exec(db,insert.c_str(),NULL,NULL,NULL);
730
757
if (rc != SQLITE_OK) {
757
784
throw dbexception(db);
760
std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued,flags) "
761
"VALUES ('%q','%q','%q','%q','%q','%u','%q',1,'%q','%q',%d, '%q')",
787
std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued,flags,base) "
788
"VALUES ('%q','%q','%q','%q','%q','%u','%q','%d','%q','%q',%d, '%q', '%q')",
762
789
item->guid().c_str(), item->title_raw().c_str(), item->author_raw().c_str(),
763
item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(),
764
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->flags().c_str());
790
item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(), (item->unread() ? 1 : 0),
791
item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->flags().c_str(),
792
item->get_base().c_str());
765
793
LOG(LOG_DEBUG,"running query: %s", insert.c_str());
766
794
rc = sqlite3_exec(db,insert.c_str(),NULL,NULL,NULL);
767
795
if (rc != SQLITE_OK) {