--- /dev/null
+CREATE OR REPLACE FUNCTION escape_html(_unescaped text) RETURNS text
+ AS $_$
+DECLARE
+BEGIN
+ _unescaped := replace(_unescaped, '&', '&');
+ _unescaped := replace(_unescaped, '"', '"');
+ _unescaped := replace(_unescaped, '<', '<');
+ _unescaped := replace(_unescaped, '>', '>');
+ RETURN _unescaped;
+END;
+$_$
+ LANGUAGE plpgsql IMMUTABLE;
+
--- /dev/null
+DROP FUNCTIOn IF EXISTS find_planet_id(text,text,race);
+CREATE OR REPLACE FUNCTION find_planet_id(_id text, _ruler text, _planet text, _race race) RETURNS integer
+ AS $_$
+DECLARE
+ p RECORD;
+ planet_id INTEGER;
+ thread INTEGER;
+BEGIN
+ SELECT pid, ftid, race, ruler, planet INTO p FROM planets WHERE id = _id;
+ IF FOUND THEN
+ IF _race <> p.race OR _planet <> p.planet OR _ruler <> p.ruler THEN
+ UPDATE planets SET race = _race, planet = _planet, ruler = _ruler WHERE pid = p.pid;
+ UPDATE forum_threads SET subject = escape_html(_ruler) || ' OF ' || escape_html(_planet)
+ WHERE ftid = p.ftid;
+ INSERT INTO forum_posts (ftid, uid, message) VALUES(p.ftid, -2, 'Planet changed data from ('
+ || escape_html(p.ruler) || ', ' || escape_html(p.planet) || ', ' || p.race || ') to ('
+ || escape_html(_ruler) || ', ' || escape_html(_planet) || ', ' || _race || ').');
+ END IF;
+ planet_id := p.pid;
+ ELSE
+ INSERT INTO forum_threads (fbid,uid,subject) VALUES(-2, -3,
+ escape_html(_ruler) || ' OF ' || escape_html(_planet))
+ RETURNING ftid INTO thread;
+ INSERT INTO planets(id, ruler,planet,race,ftid) VALUES(_id, _ruler,_planet,_race,thread)
+ RETURNING pid INTO planet_id;
+ END IF;
+ RETURN planet_id;
+END;
+$_$
+ LANGUAGE plpgsql;
+
AS $_$SELECT x,y,z FROM planet_stats WHERE pid = $1 AND (tick >= $2 OR tick =( SELECT max(tick) FROM planet_stats)) ORDER BY tick ASC LIMIT 1$_$
LANGUAGE sql STABLE;
-CREATE OR REPLACE FUNCTION find_planet_id(_ruler text, _planet text, _race race) RETURNS integer
- AS $_$
-DECLARE
- p RECORD;
- id INTEGER;
- thread INTEGER;
-BEGIN
- SELECT pid, race INTO p FROM planets WHERE ruler = _ruler AND planet = _planet;
- IF FOUND THEN
- IF _race <> p.race THEN
- UPDATE planets SET race = _race WHERE pid = p.pid;
- END IF;
- id := p.pid;
- ELSE
- INSERT INTO forum_threads (fbid,subject,uid) VALUES(-2, _ruler || ' OF ' || _planet, -3)
- RETURNING ftid INTO thread;
- INSERT INTO planets(ruler,planet,race,ftid) VALUES(_ruler,_planet,_race,thread)
- RETURNING pid INTO id;
- END IF;
- RETURN id;
-END;
-$_$
- LANGUAGE plpgsql;
-
CREATE OR REPLACE FUNCTION find_alliance_id(alli text) RETURNS integer
AS $_$
DECLARE
)
WITH (fillfactor='50');
+ALTER TABLE planets ADD COLUMN id text UNIQUE NOT NULL;
+
ALTER TABLE planets OWNER TO ndawn;
}
if ($updated){
- `perl $FindBin::Bin/parsealliances.pl $updated`;
- `perl $FindBin::Bin/parseplanets.pl $updated`;
- `perl $FindBin::Bin/parsegalaxies.pl $updated`;
- `perl $FindBin::Bin/ndrank.pl`;
+ system("$FindBin::Bin/parsetick.sh", $updated);
+ system("$FindBin::Bin/ndrank.pl");
$dbh->do(q{UPDATE misc SET value = ? WHERE id = 'TICK'}, undef, $updated);
system 'killall','-USR1', 'ndbot.pl';
local $dbh->{Warn} = 0;
if (@_ = $dumps->fetchrow){
$_ = $_[0];
$hour = (gmtime($_[1]))[2];
- my $planetid = $dbh->prepare(q{SELECT find_planet_id($1,$2,$3)});
- while (m/(\d+)\t(\d+)\t(\d+)\t\"(.*)\"\t\"(.*)\"\t(Ter|Cat|Zik|Xan|Etd)\t(\d+)\t(\d+)\t(\d+)\t(\d+)/g){
- $planetid->execute($5,$4,$6);
+ my $planetid = $dbh->prepare(q{SELECT find_planet_id($1,$2,$3,$4)});
+ while (m/(\w+)\t(\d+)\t(\d+)\t(\d+)\t\"(.*)\"\t\"(.*)\"\t(Ter|Cat|Zik|Xan|Etd)\t(\d+)\t(\d+)\t(\d+)\t(\d+)/g){
+ $planetid->execute($1,$6,$5,$7);
my @id = $planetid->fetchrow;
- push @planets,[$tick,$id[0],$1,$2,$3,$7,$8,$9,$10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+ push @planets,[$tick,$id[0],$2,$3,$4,$8,$9,$10,$11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
}
}
--- /dev/null
+#!/bin/sh
+SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
+
+$SCRIPT_DIR/parsealliances.pl $1
+$SCRIPT_DIR/parseplanets.pl $1
+$SCRIPT_DIR/parsegalaxies.pl $1