our
$logfd
=
*STDOUT
;
sub
args
{
my
$params
=
shift
;
my
$defaults
=
shift
;
my
%args
= (
%$defaults
,
ref
$_
[
$#_
] eq
'HASH'
? %{
pop
()} : ());
foreach
(
@$params
) {
last
unless
@_
;
$args
{
$_
} =
shift
;
}
return
%args
;
}
sub
dumpMessage
{
my
$msg
= encode_json ({
@_
});
print
$logfd
'JSONRECORD('
.
length
(
$msg
).
"):$msg\n"
;
$logfd
->flush;
}
sub
scrape
{
my
%args
= args ([
qw/url params/
], {},
@_
);
my
$response
= new LWP::UserAgent->request (
$args
{params} ? POST (
$args
{url} => %{
$args
{params}}) : GET (
$args
{url}));
return
$response
->decoded_content
if
$response
->is_success;
die
$response
->status_line;
}
sub
save_sqlite
{
my
%args
= args ([
qw/unique_keys data table_name verbose/
],
{
table_name
=>
'swdata'
,
verbose
=> 2},
@_
);
return
dumpMessage (
message_type
=>
'data'
,
content
=>
'EMPTY SAVE IGNORED'
)
unless
$args
{data};
return
dumpMessage (
message_type
=>
'data'
,
content
=>
'Your data sucks like a collapsed star'
)
unless
ref
$args
{data};
$args
{data} = [
$args
{data} ]
unless
ref
$args
{data} eq
'ARRAY'
;
my
$datastore
= $::store || new Scraperwiki::Datastore;
$datastore
->request (
maincommand
=>
'save_sqlite'
,
unique_keys
=>
$args
{unique_keys},
data
=>
$args
{data},
swdatatblname
=>
$args
{table_name});
dumpMessage (
message_type
=>
'data'
,
content
=>
$args
{data})
if
$args
{verbose} and
$args
{verbose} >= 2;
}
our
@attachlist
;
sub
attach
{
my
%args
= args ([
qw/name asname/
], {
verbose
=> 2},
@_
);
push
@attachlist
, {
name
=>
$args
{name},
asname
=>
$args
{asname} };
my
$datastore
= $::store || new Scraperwiki::Datastore;
my
$res
=
$datastore
->request (
maincommand
=>
'sqlitecommand'
,
command
=>
'attach'
,
name
=>
$args
{name},
asname
=>
$args
{asname});
die
$res
->{error}
if
exists
$res
->{error};
dumpMessage (
message_type
=>
'sqlitecall'
,
command
=>
'attach'
,
val1
=>
$args
{name},
val2
=>
$args
{asname})
if
$args
{verbose} and
$args
{verbose} >= 2;
return
$res
;
}
sub
select
{
my
%args
= args ([
qw/val1 val2/
], {
verbose
=> 2},
@_
);
return
sqliteexecute (
'select '
.
$args
{val1},
$args
{val2},
{
verbose
=>
$args
{verbose}});
}
sub
sqliteexecute
{
my
%args
= args ([
qw/val1 val2/
], {
verbose
=> 2},
@_
);
my
$datastore
= $::store || new Scraperwiki::Datastore;
my
$res
=
$datastore
->request (
maincommand
=>
'sqliteexecute'
,
sqlquery
=>
$args
{val1},
data
=>
$args
{val2},
attachlist
=> \
@attachlist
);
die
$res
->{error}
if
exists
$res
->{error};
dumpMessage (
message_type
=>
'sqlitecall'
,
command
=>
'execute'
,
val1
=>
$args
{val1},
val2
=>
$args
{val2})
if
$args
{verbose} and
$args
{verbose} >= 2;
return
$res
;
}
sub
commit
{
my
$datastore
= $::store || new Scraperwiki::Datastore;
$datastore
->request (
maincommand
=>
'sqlitecommand'
,
command
=>
'commit'
);
}
sub
show_tables
{
my
%args
= args ([
qw/dbname/
], {
verbose
=> 2},
@_
);
my
$name
=
$args
{dbname}
?
$args
{dbname}.
'.sqlite_master'
:
'sqlite_master'
;
my
$res
= sqliteexecute (
"select tbl_name, sql from $name where type='table'"
);
return
{
map
{
@$_
} @{
$res
->{data}} };
}
sub
table_info
{
my
%args
= args ([
qw/name/
], {
verbose
=> 2},
@_
);
$args
{name} =~ /(.*\.|)(.*)/;
my
$res
= sqliteexecute (
"PRAGMA $1table_info(`$2`)"
);
my
@ret
;
foreach
my
$row
(@{
$res
->{data}}) {
push
@ret
, {
map
{
$res
->{
keys
}[
$_
] =>
$row
->[
$_
] } 0..
$#$row
};
}
return
\
@ret
;
}
sub
save_var
{
my
%args
= args ([
qw/key value/
], {
verbose
=> 2},
@_
);
my
$vtype
=
ref
$args
{value};
my
$svalue
=
$args
{value};
if
(
$vtype
) {
warn
"$vtype was stringified"
;
$svalue
.=
''
;
}
my
$data
= {
name
=>
$args
{key},
value_blob
=>
$svalue
,
type
=>
$vtype
};
save_sqlite ({
unique_keys
=> [
'name'
],
data
=>
$data
,
table_name
=>
'swvariables'
,
verbose
=>
$args
{verbose}});
}
sub
get_var
{
my
%args
= args ([
qw/key default/
], {
verbose
=> 2},
@_
);
my
$res
=
eval
{
sqliteexecute (
'select value_blob, type from swvariables where name=?'
, [
$args
{key}],
{
verbose
=>
$args
{verbose}})
};
if
($@) {
return
$args
{
default
}
if
$@ =~ /sqlite3.Error:
no
such table/;
die
;
}
return
$args
{
default
}
unless
@{
$res
->{data}};
my
(
$svalue
,
$vtype
) = @{
$res
->{data}[0]};
return
$svalue
;
}
sub
httpresponseheader
{
my
%args
= args ([
qw/headerkey headervalue/
], {},
@_
);
dumpMessage (
message_type
=>
'httpresponseheader'
,
headerkey
=>
$args
{headerkey},
headervalue
=>
$args
{headervalue});
}
sub
gb_postcode_to_latlng
{
my
%args
= args ([
qw/postcode/
], {},
@_
);
my
$jres
= decode_json (
$sres
);
return
[
$jres
->{lat},
$jres
->{lng}]
if
exists
$jres
->{lat} and
exists
$jres
->{lng};
return
undef
;
}
1;