#!/usr/bin/perl # # Copyright (C) 2007 Peteris Krumins (peter@catonmat.net) # http://www.catonmat.net - good coders code, great reuse # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use warnings; use strict; # # this script takes input in format: # title (type, url) # and insert the title/url pairs in the sqlite database # # it is made to work with reddit_extractor.pl script but can be fed # any input which is in that format # use DBI; use POSIX; use constant DATABASE_PATH => '/mnt/evms/services/apache/wwwroot/redditmedia/db/media.db'; my $dbh = DBI->connect("dbi:SQLite:" . DATABASE_PATH, '', '', { RaiseError => 1 }); die $DBI::errstr unless $dbh; create_db_if_not_exists(); my $insert_query =<prepare($insert_query); while (<>) { next if /^#/; # ignore comments my ($title, $type, $user, $rid, $url) = /(.+) \((\w+), (\w+), (\w+), (.+)\)/; next unless $url; # ignore erroneus lines $sth->execute($title, $url, $type, $rid, $user, strftime("%Y-%m-%d %H:%M:%S", localtime)); } # # if we do not set $sth to undef, we get the following warning: # # DBI::db=HASH(0x1d287e8)->disconnect invalidates 1 active statement handle # (either destroy statement handles or call finish on them before disconnecting) # at db_inserter.pl line 65, <> line 4. # # closing dbh with active statement handles at db_inserter.pl line 65, <> line 4. # $sth = undef; $dbh->disconnect; # # create_db_if_not_exists # # Creates reddit table if it does not exit # sub create_db_if_not_exists { # Older versions of sqlite 3 do not support IF NOT EXISTS clause, # we have to workaround # my $table_exists = 0; my $tables_q = "SELECT name FROM sqlite_master WHERE type='table' AND name='reddit'"; my $res = $dbh->selectall_arrayref($tables_q); if (defined $res and @$res) { $table_exists = 1; } unless ($table_exists) { my $create_db =<do($create_db); } }