#!/usr/bin/perl -w
#############################
# magsafe - Archive
# magazine articles
# Mike Schilli, 2005
# (m@perlmeister.com)
#############################
use strict;

use DBI;
use Class::DBI::Loader;
use Sysadm::Install qw(:all);
use Getopt::Std;
use Text::Iconv;

my $DB_NAME =
"/DATA/doc_escaneados.dat";
my $DSN =
"dbi:SQLite:$DB_NAME";
my $UTF8_TERM = 1;

my $cv =
Text::Iconv->new("Latin1",
"utf8");
$cv->raise_error(1);

my $DOC_DIR = "/DATA/DOCS";

getopts("a:m:t:i:p:d:s:",
\my %o);

die "$DOC_DIR not ready"
if !-d $DOC_DIR
or !-w $DOC_DIR;

db_init($DSN)
unless -e $DB_NAME;

my $loader =
Class::DBI::Loader->new(
dsn => $DSN,
namespace => "Scanned::DB",
additional_classes => qw(
Class::DBI::AbstractSearch
),
relationships => 1,
);

my $docdb =
$loader->find_class("doc");
my $magdb =
$loader->find_class("mag");

my @objs = ();

if (!exists $o{s}) {
my $mag =
mag_pick($magdb, $o{m});
my $doc = $o{d}
|| ask "Document", "";
my $author = $o{a} || "";
my $title = $o{t}
|| ask "Title", "";
my $page = $o{p}
|| ask "Page", "";
my $issue = $o{i}
|| ask "Issue", "";

my $id = $mag->add_to_docs(
{
map {
$UTF8_TERM
? $_
: $cv->convert($_)
}
title => $title,
page => $page,
issue => $issue,
author => $author
}
);

cp $doc, docpath($id);
exit 0;
}

my %search = ();

for (split ' ', $o{s}) {

my ($field, $expr) =
split /:/, $_;

if ($field eq "mag") {
my @mags =
$magdb->search_like(
name => "%$expr%");

$search{$field} =
[ map { $_->id() }
@mags ];
} else {
$search{$field} =
"%$expr%";
}
}

@objs = $docdb->search_where(
\%search, { cmp => "like" }
);

if (@objs) {
print join(", ",
'"' . $_->title() . '"',
$_->author()
|| "Unknown",
$_->mag()->name(),
$_->issue(),
$_->page(),
docpath($_->docid())),
"\n"
for @objs;
} else {
print STDERR
"No entries\n";
}

#############################
sub docpath {
#############################
my ($id) = @_;

return sprintf "%s/%06d",
$DOC_DIR, $id;
}

#############################
sub db_init {
#############################
my ($dsn) = @_;

my $dbh =
DBI->connect($dsn, "",
"");

$dbh->do( q{
CREATE TABLE doc (
docid INTEGER
PRIMARY KEY,
title VARCHAR(255),
author VARCHAR(255),
mag INT REFERENCES
mag,
page INT,
issue VARCHAR(32)
);
} );

$dbh->do( q{
CREATE TABLE mag (
magid INTEGER
PRIMARY KEY,
name VARCHAR(255)
);
} );
}

#############################
sub mag_pick {
#############################
my ($magsdb, $picked) = @_;

my @mags =
map { $_->name() }
$magsdb->retrieve_all();

if (@mags and !$picked) {
$picked =
pick "Magazine",
[ "New", @mags ], 1;
undef $picked
if $picked eq "New";
}

if (!$picked) {
$picked = ask
"Enter Magazine Name",
"";
}

$picked = $UTF8_TERM
? $picked
: $cv->convert($picked);

my $mag =
$magsdb->find_or_create(
{ name => $picked });

return $mag;
}