chiark / gitweb /
WIP routesearch: actually find the database
authorIan Jackson <ian@liberator.(none)>
Sun, 11 Oct 2009 21:37:34 +0000 (22:37 +0100)
committerIan Jackson <ian@liberator.(none)>
Sun, 11 Oct 2009 21:37:34 +0000 (22:37 +0100)
yarrg/CommodsDatabase.pm
yarrg/CommodsWeb.pm
yarrg/rscommon.h
yarrg/rsmain.c
yarrg/rssql.c
yarrg/web/query_routesearch

index 79744cede7254daabbb07cd0db1941d2e0b7eae2..c72bc2dffb9663f08c2d160157d9b785c71cbe2a 100644 (file)
@@ -45,7 +45,7 @@ BEGIN {
     @ISA         = qw(Exporter);
     @EXPORT      = qw(&db_setocean &db_writer &db_connect $dbh
                      &db_filename &db_doall &db_onconflict
-                     &dbr_filename &dbr_connect);
+                     &dbr_filename &dbr_connect &db_connect_core);
     %EXPORT_TAGS = ( );
 
     @EXPORT_OK   = qw();
@@ -60,7 +60,7 @@ sub dbr_connect ($$) {
     return connect_core(dbr_filename($datadir,$ocean));
 }
 
-sub connect_core ($) {
+sub db_connect_core ($) {
     my ($fn)= @_;
     my $h= DBI->connect("dbi:SQLite:$fn",'','',
                       { AutoCommit=>0,
index adcff3492c154682263fe00698cf6fc6d8c7863a..00c6f24b8cc5ce0ce9713592de4897428ffcdcd6 100644 (file)
@@ -48,7 +48,7 @@ BEGIN {
     our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
     $VERSION     = 1.00;
     @ISA         = qw(Exporter);
-    @EXPORT      = qw(&dbw_connect &ocean_list &sourcebasedir
+    @EXPORT      = qw(&dbw_connect &dbw_filename &ocean_list &sourcebasedir
                      &to_json_shim &to_json_protecttags
                      &set_ctype_utf8
                      &expected_error &dbw_lookup_string
@@ -106,11 +106,17 @@ sub ocean_list () {
     return @ocean_list;
 }
 
-sub dbw_connect ($) {
+sub dbw_filename ($) {
     my ($ocean) = @_;
     die "unknown ocean $ocean ?"
        unless grep { $_ eq $ocean } ocean_list();
-    return dbr_connect(datadir(), $ocean);
+    return dbr_filename(datadir(), $ocean);
+}
+
+sub dbw_connect ($) {
+    my ($ocean) = @_;
+    my $fn= dbw_filename($ocean);
+    return db_connect_core($fn);
 }
 
 sub to_json_shim ($) {
index ab92fa587af412b890db8cafccc0976baa9e4093..38dc6295e121548a478f3041fca0c56a2ede3168 100644 (file)
@@ -98,7 +98,7 @@ void sql_bind(sqlite3_stmt *ss, int index, int value,
 
 extern sqlite3 *db;
 
-void setup_sql(void);
+void setup_sql(const char *database);
 
 
 typedef struct {
index 524cbece8159c6b19dd0be8e6d18e4abfb8d17b0..ea032600798aec91a87728442ed70e13c1bc974c 100644 (file)
@@ -74,17 +74,17 @@ int main(int argc, const char **argv) {
     debug_file= stderr;
   }
 
+  const char *database= *argv++;
+
   sysassert( !setvbuf(debug,0,_IOLBF,0) );
 
   max_mass= atof(*argv++);
   max_volu= atof(*argv++);
   max_capi= atof(*argv++);
   double loss_per_league= atof(*argv++);
-
-  if (!loss_per_league) loss_per_league= 1e-7;
   distance_loss_factor_per_league= 1.0 - loss_per_league;
 
-  setup_sql();
+  setup_sql(database);
   setup_value();
   setup_search();
 
index bfe60d6c8798be39920fa4cb50c88a336f2831de..26a77bb7811dd0be8fc504037a86b8a06f44a20d 100644 (file)
@@ -14,10 +14,10 @@ static int busy_handler(void *u, int previous) {
   return 1;
 }
 
-void setup_sql(void) {
+void setup_sql(const char *database) {
   sqlite3_stmt *sst;
   
-  SQL_MUST( sqlite3_open("OCEAN-Midnight.db", &db) );
+  SQL_MUST( sqlite3_open(database, &db) );
   SQL_MUST( sqlite3_busy_handler(db, busy_handler, 0) );
 
   sst= sql_prepare("BEGIN","(begin)");
index 93fcf0bc1bda2c57d793b0ed7a7b3e196ab12494..9accc54bbf2dbf31987948bc2e8e2606457f2ba9 100644 (file)
@@ -46,6 +46,8 @@ $emsgokorprint
 </%args>
 
 <%perl>
+use BSD::Resource;
+
 my $emsg;
 my @warningfs;
 my @islandids;
@@ -91,7 +93,62 @@ This feature is not available from the "drop down menus" interface.
 </form>
 <%perl>
 
+if (!$emsg && $maxdist > 30) {
+       $emsg= "Searching for routes of more than 30 leagues is not".
+               " supported, sorry.";
+}
+
 $emsgokorprint->($emsg) or return;
 @islandids or return;
+defined $routeparams->{MaxMass} or defined $routeparams->{MaxVolume} or return;
+
+#---------- compute the results ----------
+
+my @rsargs;
+
+foreach my $k (qw(MaxMass MaxVolume MaxCapital)) {
+       my $v= $routeparams->{$k};
+       push @rsargs, (defined $v ? $v : -1);
+}
+push @rsargs, defined $routeparams->{LossPerLeaguePct}
+       ? $routeparams->{LossPerLeaguePct}*0.01 : 1e-9;
+push @rsargs, qw(search 10 10), $maxdist, 'any', @islandids;
+
+m/[^-.0-9a-zA-Z]/ and die "$_ $& ?" foreach @rsargs;
+
+unshift @rsargs, dbw_filename($qa->{'Ocean'});
+unshift @rsargs, qw(-DN);
+
+if ($qa->{'debug'}) {
+</%perl>
+[[ <% "@rsargs" |h %> ]]<br><pre>
+<%perl>
+}
+
+unshift @rsargs, sourcebasedir().'/yarrg/routesearch';
+
+my $fh= new IO::File;
+my $child= $fh->open("-|"); defined $child or die $!;
+if (!$child) {
+       my $cpu= BSD::Resource::RLIMIT_CPU;
+       my ($soft,$hard)= getrlimit($cpu);
+       my $max=10;
+       setrlimit($cpu,$max,$hard) or die $! if $soft>$max;
+       exec @rsargs;
+       die $!;
+}
+
+while (<$fh>) {
+       chomp;
+       if ($qa->{'debug'}) {
+</%perl>
+<% $_ |h %>
+<%perl>
+       }
+}
+
+if ($qa->{'debug'}) {
+       print "</pre>\n";
+}
 
 </%perl>