]> ruin.nu Git - ndwebbie.git/commitdiff
Change database structure for planets and alliances + PG 8.4 changes
authorMichael Andreen <harv@ruin.nu>
Tue, 28 Jul 2009 00:51:51 +0000 (02:51 +0200)
committerMichael Andreen <harv@ruin.nu>
Sat, 15 Aug 2009 14:40:26 +0000 (16:40 +0200)
Change the id for planets from id to pid. Similar change for alliances where
id is changed to aid. This makes them unique in the database, which
makes it possible to replace several 'JOIN .. ON' with 'JOIN .. USING'
or 'NATURAL JOIN'.

Also, use the real alliance name as foreign key instead of the
surrogate key.

Some bigger queries are moved into views, mainly defense calls and
alliance resource estimation.

Together with this, use some new PostgreSQL 8.4 features.

* CTE and Window function for alliance resource estimate, so only the
  top60 planets are picked.

* Use the new array_agg() instead of the custom array_accum()

Also, since 0000 is not a valid year anymore, raid.js is changed to use
0001 instead.

24 files changed:
database/noperl.sql
database/planets.sql [new file with mode: 0644]
lib/NDWeb/Auth/User.pm
lib/NDWeb/Controller/Alliances.pm
lib/NDWeb/Controller/Calls.pm
lib/NDWeb/Controller/CovOp.pm
lib/NDWeb/Controller/Graphs.pm
lib/NDWeb/Controller/Intel.pm
lib/NDWeb/Controller/JSRPC.pm
lib/NDWeb/Controller/Members.pm
lib/NDWeb/Controller/Raids.pm
lib/NDWeb/Controller/Rankings.pm
lib/NDWeb/Controller/Root.pm
lib/NDWeb/Controller/Stats.pm
lib/NDWeb/Controller/TextExport.pm
lib/NDWeb/Controller/Users.pm
lib/NDWeb/Include.pm
root/src/intel/planet.tt2
root/static/js/raid.js
scripts/createretal.pl
scripts/ndrank.pl
scripts/parsealliances.pl
scripts/parseplanets.pl
scripts/scans.pl

index f8821343a14e18ecdb26a00951577fb12a09f6a2..48fcbe30ba80cbf9d0de652f788169ae9ee510b9 100644 (file)
@@ -2,47 +2,48 @@ CREATE OR REPLACE FUNCTION find_planet_id(_ruler text, _planet text, _race race)
     AS $_$
 DECLARE
        p RECORD;
-       pid INTEGER;
+       id INTEGER;
        thread INTEGER;
 BEGIN
-       SELECT id, race INTO p FROM planets WHERE ruler = _ruler AND planet = _planet;
+       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 id = p.id;
+                       UPDATE planets SET race = _race WHERE pid = p.pid;
                END IF;
-               pid := p.id;
+               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 id INTO pid;
+                       RETURNING pid INTO id;
        END IF;
-       RETURN pid;
+       RETURN id;
 END;
 $_$
     LANGUAGE plpgsql;
 
-DROP FUNCTION findplanetid(character varying, character varying, character varying);
+DROP FUNCTION IF EXISTS findplanetid(character varying, character varying, character varying);
 
-CREATE OR REPLACE FUNCTION find_alliance_id(alliance text) RETURNS integer
+CREATE OR REPLACE FUNCTION find_alliance_id(alli text) RETURNS integer
     AS $_$
 DECLARE
-       aid INTEGER;
+       id INTEGER;
 BEGIN
-       SELECT id FROM INTO aid alliances WHERE name = alliance;
+       SELECT aid FROM INTO id alliances WHERE alliance = alli;
        IF NOT FOUND THEN
-               INSERT INTO alliances(name) VALUES($1)
-                       RETURNING id INTO aid;
+               INSERT INTO alliances(alliance) VALUES($1)
+                       RETURNING aid INTO id;
        END IF;
-       RETURN aid;
+       RETURN id;
 END;
 $_$
     LANGUAGE plpgsql;
 
-DROP FUNCTION find_alliance_id(character varying);
+DROP FUNCTION IF EXISTS find_alliance_id(character varying);
 
 CREATE OR REPLACE FUNCTION coords(x integer, y integer, z integer) RETURNS text
     AS $_$
 SELECT $1 || ':' || $2 || ':' || $3
 $_$
     LANGUAGE sql IMMUTABLE;
+
diff --git a/database/planets.sql b/database/planets.sql
new file mode 100644 (file)
index 0000000..1bb5ef9
--- /dev/null
@@ -0,0 +1,188 @@
+DROP VIEW users_defprio;
+DROP VIEW current_planet_stats;
+DROP VIEW current_planet_stats_full;
+DROP VIEW current_planet_scans;
+DROP VIEW current_development_scans;
+
+
+ALTER TABLE planets ALTER ruler TYPE text;
+ALTER TABLE planets ALTER planet TYPE text;
+ALTER TABLE planets ALTER nick TYPE citext;
+ALTER TABLE planets ALTER channel TYPE citext;
+ALTER TABLE alliances RENAME name TO alliance;
+ALTER TABLE alliances ALTER alliance TYPE text;
+ALTER TABLE alliances RENAME id TO aid;
+ALTER TABLE alliance_stats RENAME id TO aid;
+
+CREATE FUNCTION alliance_name(id INTEGER) RETURNS TEXT AS $$
+       SELECT alliance FROM alliances WHERE aid = $1
+$$ LANGUAGE SQL STABLE;
+
+ALTER TABLE planets RENAME id TO pid;
+ALTER TABLE planets RENAME alliance_id TO alliance;
+ALTER TABLE planetS DROP CONSTRAINT planets_alliance_id_fkey;
+ALTER TABLE planets ALTER alliance TYPE text USING alliance_name(alliance);
+ALTER TABLE planetS ADD FOREIGN KEY (alliance) REFERENCES alliances(alliance) ON UPDATE CASCADE ON DELETE SET NULL;
+
+DROP FUNCTION alliance_name(INTEGER);
+
+ALTER TABLE planet_stats RENAME id TO pid;
+ALTER TABLE users RENAME planet TO pid;
+ALTER TABLE fleets RENAME planet TO pid;
+ALTER TABLE launch_confirmations RENAME target TO pid;
+ALTER TABLE development_scans RENAME planet TO pid;
+ALTER TABLE planet_scans RENAME planet TO pid;
+ALTER TABLE raid_targets RENAME planet TO pid;
+ALTER TABLE scan_requests RENAME planet TO pid;
+ALTER TABLE scans RENAME planet TO pid;
+ALTER TABLE covop_attacks RENAME id TO pid;
+ALTER TABLE incomings RENAME sender TO pid;
+
+CREATE VIEW current_planet_stats AS
+SELECT p.pid, p.nick, p.planet_status, p.hit_us, ps.x, ps.y, ps.z, p.ruler, p.planet, p.race
+       ,alliance, a.relationship, a.aid, p.channel, p.ftid, p.gov
+       ,ps.size, ps.score, ps.value, ps.xp, ps.sizerank, ps.scorerank, ps.valuerank, ps.xprank
+FROM ( SELECT pid, tick, x, y, z, size, score, value, xp, sizerank, scorerank, valuerank, xprank
+               FROM planet_stats
+               WHERE tick = ( SELECT max(tick) AS max FROM planet_stats)
+       ) ps
+       NATURAL JOIN planets p
+       LEFT JOIN alliances a USING (alliance);
+
+CREATE OR REPLACE VIEW users_defprio AS
+SELECT u.*, (0.2 * (u.attack_points / GREATEST(a.attack, 1::numeric))
+               + 0.4 * (u.defense_points / GREATEST(a.defense, 1::numeric))
+               + 0.2 * (p.size::numeric / a.size) + 0.05 * (p.score::numeric / a.score)
+               + 0.15 * (p.value::numeric / a.value))::numeric(3,2) AS defprio
+FROM users u
+       JOIN current_planet_stats p USING (pid)
+       , (
+               SELECT avg(u.attack_points) AS attack, avg(u.defense_points) AS defense
+                       ,avg(p.size) AS size, avg(p.score) AS score, avg(p.value) AS value
+               FROM users u
+                       JOIN current_planet_stats p USING (pid)
+               WHERE uid IN ( SELECT uid FROM groupmembers WHERE gid = 2)
+       ) a;
+
+CREATE OR REPLACE VIEW current_planet_stats_full AS
+SELECT *
+FROM planets p
+       NATURAL JOIN (
+               SELECT *
+               FROM planet_stats
+               WHERE tick = ( SELECT max(tick) AS max FROM planet_stats)
+       ) ps
+       LEFT JOIN alliances USING (alliance);
+
+CREATE OR REPLACE FUNCTION change_member() RETURNS trigger
+    AS $_X$
+BEGIN
+       IF TG_OP = 'INSERT' THEN
+               IF NEW.gid = 2 THEN
+                       UPDATE planets SET alliance = 'NewDawn' WHERE
+                               pid = (SELECT pid FROM users WHERE uid = NEW.uid);
+               END IF;
+       ELSIF TG_OP = 'DELETE' THEN
+               IF OLD.gid = 2 THEN
+                       UPDATE planets SET alliance = NULL WHERE
+                               pid = (SELECT pid FROM users WHERE uid = OLD.uid);
+               END IF;
+       END IF;
+
+       return NEW;
+END;
+$_X$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE VIEW current_planet_scans AS
+SELECT DISTINCT ON (pid) ps.*
+FROM planet_scans ps
+ORDER BY pid, tick DESC, id DESC;
+
+CREATE OR REPLACE VIEW current_development_scans AS
+SELECT DISTINCT ON (pid) ds.*
+FROM development_scans ds
+ORDER BY pid, tick DESC, id DESC;
+
+CREATE OR REPLACE FUNCTION update_user_planet() RETURNS trigger AS $_X$
+BEGIN
+       IF COALESCE(NEW.pid <> OLD.pid,TRUE) OR NEW.username <> OLD.username THEN
+               UPDATE planets SET nick = NULL WHERE pid = OLD.pid;
+               UPDATE planets SET nick = NEW.username WHERE pid = NEW.pid;
+       END IF;
+
+       IF COALESCE(NEW.pid <> OLD.pid,TRUE)
+                       AND (SELECT TRUE FROM groupmembers WHERE gid = 2 AND uid = NEW.uid) THEN
+               UPDATE planets SET alliance = NULL WHERE pid = OLD.pid;
+               UPDATE planets SET alliance = 'NewDawn' WHERE pid = NEW.pid;
+       END IF;
+       RETURN NEW;
+END;
+$_X$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION planetid(x integer, y integer, z integer, tick integer) RETURNS integer
+    AS $_$SELECT pid FROM planet_stats WHERE x = $1 AND y = $2 AND z = $3 AND (tick >= $4  OR tick =( SELECT max(tick) FROM planet_stats)) ORDER BY tick ASC LIMIT 1$_$
+    LANGUAGE sql STABLE;
+
+CREATE OR REPLACE FUNCTION planetcoords(id integer, tick integer, OUT x integer, OUT y integer, OUT z integer) RETURNS record
+    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 VIEW alliance_resources AS
+WITH planet_estimates AS (
+       SELECT ps.tick, alliance, hidden,size,score,(metal+crystal+eonium) AS resources
+               ,score + (metal+crystal+eonium)/300 + hidden/100 AS nscore2
+               ,score + (metal+crystal+eonium)/300 + hidden/100 + (endtick()-tick())*(
+                       250*size + COALESCE(metal_ref + crystal_ref + eonium_ref,7)* 1000
+                       + CASE extraction WHEN 0 THEN 3000 WHEN 1 THEN 11500 ELSE COALESCE(extraction,3)*3000*3 END
+               )*(1.35+0.005*COALESCE(fincents,20))/100 AS nscore3
+       FROM current_planet_stats p
+               JOIN current_planet_scans ps USING (pid)
+               LEFT OUTER JOIN current_development_scans ds USING (pid)
+), planet_ranks AS (
+       SELECT *, RANK() OVER(PARTITION BY alliance ORDER BY score DESC) AS rank FROM planet_estimates
+), top_planets AS (
+       SELECT alliance, sum(resources) AS resources, sum(hidden) AS hidden
+               ,sum(nscore2)::bigint AS nscore2, sum(nscore3)::bigint AS nscore3
+               ,count(*) AS planets, sum(score) AS score, sum(size) AS size
+               ,avg(tick)::int AS avgtick
+       FROM planet_ranks WHERE rank <= 60
+       GROUP BY alliance
+)
+SELECT aid,alliance,a.relationship,s.members,r.planets
+       ,s.score, r.score AS topscore, s.size, r.size AS topsize
+       ,r.resources,r.hidden
+       ,(s.score + (resources / 300) + (hidden / 100))::bigint AS nscore
+       ,nscore2, nscore3, avgtick
+FROM alliances a
+       JOIN top_planets r USING (alliance)
+       LEFT OUTER JOIN (SELECT aid,score,size,members FROM alliance_stats
+               WHERE tick = (SELECT max(tick) FROM alliance_stats)) s USING (aid)
+;
+
+CREATE OR REPLACE VIEW defcalls AS
+SELECT c.id,c.member AS uid, c.landing_tick, covered, open
+       ,dc.username AS dc, (c.landing_tick - tick()) AS curreta
+       ,array_agg(COALESCE(race::text,'')) AS race
+       ,array_agg(COALESCE(amount,0)) AS amount
+       ,array_agg(COALESCE(eta,0)) AS eta
+       ,array_agg(COALESCE(shiptype,'')) AS shiptype
+       ,array_agg(COALESCE(alliance,'?')) AS alliance
+       ,array_agg(coords(p2.x,p2.y,p2.z)) AS attackers
+FROM calls c
+       LEFT OUTER JOIN incomings i ON c.id = i.call
+       LEFT OUTER JOIN current_planet_stats p2 USING (pid)
+       LEFT OUTER JOIN users dc ON c.dc = dc.uid
+GROUP BY c.id,c.member,dc.username, c.landing_tick, covered, open;
+
+CREATE OR REPLACE VIEW full_defcalls AS
+SELECT id,covered,open,x,y,z,pid,landing_tick,dc,curreta
+       ,defprio, c.race, amount, c.eta, shiptype, c.alliance, attackers
+       ,COUNT(NULLIF(f.back = f.landing_tick + f.eta - 1, FALSE)) AS fleets
+FROM users_defprio u
+       JOIN current_planet_stats p USING (pid)
+       JOIN defcalls c USING (uid)
+       LEFT OUTER JOIN launch_confirmations f USING (pid,landing_tick)
+GROUP BY id, x,y,z,pid,landing_tick,dc,curreta,defprio,c.race,amount,c.eta,shiptype,c.alliance,attackers, covered, open
+;
+
+DROP AGGREGATE array_accum(anyelement);
index c19ba2b097b85bf54f4d3c224e52097a5483314d..0e49a2e12f46fa80fe7049498f2cb3e67422d633 100644 (file)
@@ -42,7 +42,7 @@ sub load {
        }
 
        ($self->{planet},$self->{username},$self->{css}) = $dbh->selectrow_array(q{
-               SELECT planet,username,css FROM users WHERE uid = ?
+               SELECT pid,username,css FROM users WHERE uid = ?
                },undef,$self->{id}) or die $dbh->errstr;
 
        return $self;
index c2d40fffb4f81518fde43e6c01c236c826d66fe3..efec3dd6f955ca6f58d845f15ffdf7577843533e 100644 (file)
@@ -40,7 +40,7 @@ sub list : Local {
                $order = "score DESC";
        }
        my $query = $dbh->prepare(q{
-               SELECT DISTINCT a.id,name,COALESCE(s.score,SUM(p.score)) AS score
+               SELECT aid AS id,alliance AS name,COALESCE(s.score,SUM(p.score)) AS score
                        ,COALESCE(s.size,SUM(p.size)) AS size,s.members,count(p.score) AS kmem
                        ,COALESCE(SUM(p.score),-1) AS kscore
                        ,COALESCE(SUM(p.size),-1) AS ksize
@@ -54,9 +54,9 @@ sub list : Local {
                        ,COALESCE(AVG(p.value)::int,-1) AS kvalavg
                FROM alliances a
                        LEFT OUTER JOIN (SELECT * FROM alliance_stats
-                               WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON s.id = a.id
-                       LEFT OUTER JOIN current_planet_stats p ON p.alliance_id = a.id
-               GROUP BY a.id,a.name,s.score,s.size,s.members
+                               WHERE tick = (SELECT max(tick) FROM alliance_stats)) s USING (aid)
+                       LEFT OUTER JOIN current_planet_stats p USING (alliance,aid)
+               GROUP BY aid,alliance,s.score,s.size,s.members
                HAVING s.score IS NOT NULL OR count(p.score) > 0
                ORDER BY
                } . $order);
@@ -68,7 +68,7 @@ sub edit : Local {
        my ( $self, $c, $id, $order ) = @_;
        my $dbh = $c->model;
 
-       my $query = $dbh->prepare(q{SELECT id,name, relationship FROM alliances WHERE id = ?});
+       my $query = $dbh->prepare(q{SELECT aid AS id,alliance AS name, relationship FROM alliances WHERE aid = ?});
        my $a = $dbh->selectrow_hashref($query,undef,$id);
        $c->stash(a => $a);
 
@@ -83,13 +83,13 @@ sub edit : Local {
        $order .= ' DESC' if $order eq 'hit_us';
 
        my $members = $dbh->prepare(q{
-               SELECT id, coords(x,y,z), nick, ruler, planet, race, size, score, value, xp
+               SELECT pid AS id, coords(x,y,z), nick, ruler, planet, race, size, score, value, xp
                        ,planet_status,hit_us, sizerank, scorerank, valuerank, xprank
                FROM current_planet_stats p
-               WHERE p.alliance_id = ?
+               WHERE p.alliance = ?
                ORDER BY
                } . $order);
-       $members->execute($a->{id});
+       $members->execute($a->{name});
        $c->stash(members => $members->fetchall_arrayref({}) );
 
        my $ticks = $c->req->param('ticks') || 48;
@@ -98,14 +98,12 @@ sub edit : Local {
        $query = $dbh->prepare(intelquery q{
                        o.alliance AS oalliance ,coords(o.x,o.y,o.z) AS ocoords, i.sender
                        ,t.alliance AS talliance,coords(t.x,t.y,t.z) AS tcoords, i.target
-               },q{NOT ingal AND (o.alliance_id = $1 OR t.alliance_id = $1)
+               },q{NOT ingal AND (o.alliance = $1 OR t.alliance = $1)
                        AND (i.mission = 'Defend' OR i.mission = 'AllyDef')
-                       AND ((( t.alliance_id != o.alliance_id OR t.alliance_id IS NULL OR o.alliance_id IS NULL)))
-                       AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL)
-                       AND NOT (i.back IS NOT NULL AND i.back = i.tick + 4)
+                       AND COALESCE( t.alliance != o.alliance, TRUE)
                        AND i.tick > (tick() - $2)
                });
-       $query->execute($a->{id}, $ticks);
+       $query->execute($a->{name}, $ticks);
        $c->stash(intel => $query->fetchall_arrayref({}) );
 }
 
@@ -113,35 +111,38 @@ sub postallianceupdate : Local {
        my ( $self, $c, $id, $order ) = @_;
        my $dbh = $c->model;
 
+       my $query = $dbh->prepare(q{SELECT aid,alliance, relationship FROM alliances WHERE aid = ?});
+       my $a = $dbh->selectrow_hashref($query,undef,$id);
+
        $dbh->begin_work;
        my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
                (SELECT ftid FROM users WHERE uid = $1),$1,$2)
                });
        if ($c->req->param('crelationship')){
                my $value = $c->req->param('relationship');
-               $dbh->do(q{UPDATE alliances SET relationship = ? WHERE id =?}
+               $dbh->do(q{UPDATE alliances SET relationship = ? WHERE aid =?}
                        ,undef,$value,$id);
                $log->execute($c->user->id
-                       ,"HC set alliance: $id relationship: $value");
+                       ,"HC set alliance: $a->{alliance} ($id) relationship: $value");
        }
        my $coords = $c->req->param('coords');
-       my $findplanet = $dbh->prepare(q{SELECT id FROM current_planet_stats
+       my $findplanet = $dbh->prepare(q{SELECT pid FROM current_planet_stats
                WHERE x = ? AND y = ? AND z = ?});
        my $addplanet = $dbh->prepare(q{
-               UPDATE planets SET alliance_id = $2, nick = coalesce($3,nick)
-               WHERE id = $1;
+               UPDATE planets SET alliance = $2, nick = coalesce($3,nick)
+               WHERE pid = $1;
                });
        my $text = '';
        while ($coords =~ m/(\d+):(\d+):(\d+)(?:\s+nick=(\S+))?/g){
                my ($planet) = $dbh->selectrow_array($findplanet,undef,$1,$2,$3);
-               $addplanet->execute($planet,$id,$4);
+               $addplanet->execute($planet,$a->{alliance},$4);
                my $nick = '';
                $nick = "(nick $4)" if defined $4;
                $text .= "($planet) $1:$2:$3 $nick\n";
        }
        if ($text){
                $log->execute($c->user->id
-                       ,"HC added the following planets to alliance $id:\n $text");
+                       ,"HC added the following planets to alliance $a->{alliance} ($id):\n $text");
        }
        $dbh->commit;
 
@@ -152,20 +153,23 @@ sub postremoveallplanets : Local {
        my ( $self, $c, $id, $order ) = @_;
        my $dbh = $c->model;
 
+       my $query = $dbh->prepare(q{SELECT aid,alliance, relationship FROM alliances WHERE aid = ?});
+       my $a = $dbh->selectrow_hashref($query,undef,$id);
+
        $dbh->begin_work;
        my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
                (SELECT ftid FROM users WHERE uid = $1),$1,$2)
                });
-       my ($coords) = $dbh->selectrow_array(q{SELECT CONCAT(coords(x,y,z) || ' ') 
-                       FROM current_planet_stats where alliance_id = $1
-               },undef,$id);
+       my ($coords) = $dbh->selectrow_array(q{SELECT array_to_string(array_agg(coords(x,y,z)),' ')
+                       FROM current_planet_stats where alliance = $1
+               },undef,$a->{alliance});
        my $removeplanets = $dbh->prepare(q{
-               UPDATE planets SET alliance_id = NULL
-               WHERE alliance_id = $1;
+               UPDATE planets SET alliance = NULL
+               WHERE alliance = $1;
        });
-       $removeplanets->execute($id);
+       $removeplanets->execute($a->{alliance});
        $log->execute($c->user->id
-               ,"HC cleaned alliance $id :\n\n$coords");
+               ,"HC cleaned alliance $a->{alliance} (id) :\n\n$coords");
        $dbh->commit;
 
        $c->res->redirect($c->uri_for('edit',$id));
@@ -210,48 +214,17 @@ sub resources : Local {
                $order = "resplanet DESC";
        }
 
-       my $query = $dbh->prepare(qq{
-               SELECT a.id,a.name,a.relationship,s.members,s.score,s.size
-               ,r.resources,r.hidden,r.planets
-               ,(resources/planets)::bigint AS resplanet
-               ,(hidden/planets)::bigint AS hidplanet
-               ,(score + (resources / 300) + (hidden / 100))::bigint AS nscore
-               ,(SELECT sum(score)::bigint FROM (
-SELECT score + (metal+crystal+eonium)/300 + hidden/100 AS score
-FROM current_planet_stats p
-       JOIN current_planet_scans ps ON p.id = ps.planet
-WHERE alliance_id = r.id
-ORDER BY score DESC
-LIMIT 60) a
-               ) AS nscore2
-               ,(SELECT sum(score)::bigint FROM (
-SELECT score + (metal+crystal+eonium)/300 + hidden/100 + (endtick()-tick())*(
-               250*size + COALESCE(metal_ref + crystal_ref + eonium_ref,7)* 1000
-               + CASE extraction WHEN 0 THEN 3000 WHEN 1 THEN 11500 ELSE COALESCE(extraction,3)*3000*3 END
-       )*(1.35+0.005*COALESCE(fincents,20))/100 AS score
-FROM current_planet_stats p
-       JOIN current_planet_scans ps ON p.id = ps.planet
-       LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
-WHERE alliance_id = r.id
-ORDER BY score DESC
-LIMIT 60) a
-               ) AS nscore3
-               FROM (SELECT alliance_id AS id,sum(metal+crystal+eonium) AS resources
-                               , sum(hidden) AS hidden, count(*) AS planets
-                               FROM planets p join current_planet_scans c ON p.id = c.planet
-                               GROUP by alliance_id
-                       ) r
-                       NATURAL JOIN alliances a
-                       LEFT OUTER JOIN (SELECT *,LEAST(members,60) AS scoremem FROM alliance_stats
-                               WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON a.id = s.id
-               ORDER BY $order
-               });
+       my $query = $dbh->prepare(q{
+SELECT aid AS id,alliance AS name,relationship,members,score,size
+       ,resources,hidden,planets
+       ,(resources/planets)::bigint AS resplanet
+       ,(hidden/planets)::bigint AS hidplanet
+       , nscore, nscore2, nscore3
+FROM alliance_resources
+ORDER BY } . $order
+       );
        $query->execute;
-       my @alliances;
-       while (my $alliance = $query->fetchrow_hashref){
-               push @alliances,$alliance;
-       }
-       $c->stash(alliances => \@alliances);
+       $c->stash(alliances => $query->fetchall_arrayref({}));
 }
 
 
index 7edc10b48bfad06506db7cc8a94cfa3d8913a07c..5c3298a675dddc5581c770c3751c0b11b4dee33d 100644 (file)
@@ -34,7 +34,7 @@ sub list : Local {
        my ( $self, $c, $type ) = @_;
        my $dbh = $c->model;
 
-       my $where = q{open AND c.landing_tick-6 > tick()};
+       my $where = q{open AND landing_tick-6 > tick()};
        my $order = q{landing_tick DESC, defprio DESC};
        if (defined $type){
                if ($type eq 'covered'){
@@ -44,7 +44,7 @@ sub list : Local {
                }elsif ($type eq 'uncovered'){
                        $where = 'not covered';
                }elsif ($type eq 'recent'){
-                       $where = q{c.landing_tick > tick()};
+                       $where = q{landing_tick > tick()};
                        $order = q{x,y,z};
                }
        }
@@ -53,35 +53,10 @@ sub list : Local {
        $c->stash(maxprio => $dbh->selectrow_array($pointlimits,undef,'DEFMAXPRIO'));
 
        my $query = $dbh->prepare(qq{
-               SELECT id,coords(x,y,z),planet,landing_tick,dc,curreta,fleets
-                       ,defprio
-                       ,array_accum(COALESCE(race::text,'')) AS race
-                       ,array_accum(COALESCE(amount,0)) AS amount
-                       ,array_accum(COALESCE(eta,0)) AS eta
-                       ,array_accum(COALESCE(shiptype,'')) AS shiptype
-                       ,array_accum(COALESCE(alliance,'?')) AS alliance
-                       ,array_accum(coords) AS attackers
-               FROM (SELECT c.id, p.x,p.y,p.z,p.id AS planet, defprio
-                       ,u.defense_points, u.attack_points, c.landing_tick
-                       ,dc.username AS dc, (c.landing_tick - tick()) AS curreta
-                       ,p2.race, i.amount, i.eta, i.shiptype, p2.alliance
-                       ,coords(p2.x,p2.y,p2.z), COUNT(DISTINCT f.fid) AS fleets
-                       FROM calls c
-                               JOIN users_defprio u ON c.member = u.uid
-                               JOIN current_planet_stats p ON u.planet = p.id
-                               LEFT OUTER JOIN incomings i ON i.call = c.id
-                               LEFT OUTER JOIN current_planet_stats p2 ON i.sender = p2.id
-                               LEFT OUTER JOIN users dc ON c.dc = dc.uid
-                               LEFT OUTER JOIN launch_confirmations f ON f.target = u.planet
-                                       AND f.landing_tick = c.landing_tick AND f.back = f.landing_tick + f.eta - 1
-                       WHERE $where
-                       GROUP BY c.id, p.x,p.y,p.z,p.id, defprio, c.landing_tick
-                               ,u.defense_points,u.attack_points,dc.username
-                               ,p2.race,i.amount,i.eta,i.shiptype,p2.alliance,p2.x,p2.y,p2.z
-                       ) c
-               GROUP BY id, x,y,z,planet,landing_tick, defense_points, attack_points
-                       ,dc,curreta,fleets, defprio
-               ORDER BY $order
+SELECT *, pid AS planet, coords(x,y,z)
+FROM full_defcalls
+WHERE $where
+ORDER BY $order
                });
        $query->execute;
        $c->stash(calls => $query->fetchall_arrayref({}));
@@ -105,34 +80,36 @@ sub edit : Local {
 
        my $outgoings = $dbh->prepare(q{ 
 (
-       SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta
-               ,amount, NULL AS coords, planet, NULL AS back, NULL AS recalled
+       SELECT DISTINCT ON (mission,name) 1 AS type, fid,mission,name,tick, NULL AS eta
+               ,amount, NULL AS coords, pid AS planet, NULL AS back, NULL AS recalled
        FROM fleets f
-       WHERE planet = $1 AND tick <= $2 AND (
+       WHERE pid = $1 AND tick <= $2 AND (
                        mission = 'Full fleet'
                        OR fid IN (SELECT fid FROM fleet_scans)
                ) AND (
                        mission = 'Full fleet'
                        OR tick >= $2 - 12
                )
-       ORDER BY mission,name,tick DESC
 ) UNION (
-       SELECT fid,mission,name,landing_tick AS tick, eta, amount
-               , coords(x,y,z), t.id AS planet, back
+       SELECT 2 AS type, MAX(fid) AS fid,mission,name,landing_tick AS tick, eta, amount
+               , coords(x,y,z), pid AS planet, back
                , (back <> landing_tick + eta - 1) AS recalled
-       FROM fleets f
-               JOIN launch_confirmations USING (fid)
-       LEFT OUTER JOIN current_planet_stats t ON target = t.id
-       WHERE f.planet = $1 AND back >= $2 AND landing_tick - eta - 12 < $2
+       FROM launch_confirmations
+               JOIN (
+                       SELECT fid,amount,name,mission FROM fleets WHERE pid = $1
+               ) f  USING (fid)
+               LEFT OUTER JOIN current_planet_stats t USING (pid)
+       WHERE back >= $2 AND landing_tick - eta - 12 < $2
+       GROUP BY mission,name,landing_tick,eta,amount,back,x,y,z,pid
 ) UNION (
        SELECT DISTINCT ON (tick,x,y,z,mission,name,amount)
-               NULL as fid, i.mission, i.name, i.tick,eta
-               , i.amount, coords(x,y,z), t.id AS planet, back, NULL AS recalled
+               3 AS type, NULL as fid, i.mission, i.name, i.tick,eta
+               , i.amount, coords(x,y,z), t.pid AS planet, back, NULL AS recalled
        FROM intel i
-       LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
+       LEFT OUTER JOIN current_planet_stats t ON i.target = t.pid
        WHERE uid = -1 AND i.sender = $1 AND i.tick > $2 - 14 AND i.tick < $2 + 14
        ORDER BY i.tick,x,y,z,mission,name,amount,back
-)
+) ORDER BY type, mission,name,tick DESC
        });
        my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
                WHERE fid = ? ORDER BY num
@@ -167,14 +144,18 @@ SELECT ship,amount from ships_home WHERE planet = $1 AND tick = $2
 
        $c->stash(fleets => \@fleets);
 
-       my $defenders = $dbh->prepare(q{ 
-SELECT DISTINCT ON (x,y,z,s.id,name,amount,back) fid,mission, name, eta
-       , amount, coords(x,y,z) AS coords, landing_tick AS tick, f.planet
+       my $defenders = $dbh->prepare(q{
+SELECT DISTINCT ON (x,y,z,pid,name,amount,back) fid,mission, name, eta
+       , amount, coords(x,y,z) AS coords, landing_tick AS tick, pid AS planet
        ,back, (back <> landing_tick + eta - 1) AS recalled
-FROM launch_confirmations lc
-       JOIN fleets f USING (fid)
-       LEFT OUTER JOIN current_planet_stats s ON f.planet = s.id
-WHERE target = ? AND landing_tick = ? AND mission = 'Defend'
+FROM fleets f
+       LEFT OUTER JOIN current_planet_stats s USING (pid)
+       JOIN (
+               SELECT fid,back,eta,landing_tick
+               FROM launch_confirmations
+               WHERE pid = $1 AND landing_tick = $2
+       ) lc USING (fid)
+WHERE mission = 'Defend'
 ORDER BY x,y,z
        });
 
@@ -195,9 +176,9 @@ ORDER BY x,y,z
 
        my $attackers = $dbh->prepare(q{
                SELECT coords(p.x,p.y,p.z), p.planet_status, p.race,i.eta,i.amount
-                       ,i.fleet,i.shiptype,p.relationship,p.alliance,i.id,p.id AS planet
+                       ,i.fleet,i.shiptype,p.relationship,p.alliance,i.id,pid AS planet
                FROM incomings i
-                       JOIN current_planet_stats p ON i.sender = p.id
+                       JOIN current_planet_stats p USING (pid)
                WHERE i.call = ?
                ORDER BY p.x,p.y,p.z
        });
@@ -233,13 +214,14 @@ sub defleeches : Local {
        my $query = $dbh->prepare(q{SELECT username,defense_points,count(id) AS calls
                , SUM(fleets) AS fleets, SUM(recalled) AS recalled
                ,count(NULLIF(fleets,0)) AS defended_calls
-               FROM (SELECT username,defense_points,c.id,count(f.target) AS fleets
+               FROM (SELECT username,defense_points,c.id,count(f.back) AS fleets
                        , count(NULLIF(f.landing_tick + f.eta -1 = f.back,TRUE)) AS recalled
                        FROM users u JOIN calls c ON c.member = u.uid
                                LEFT OUTER JOIN (
-                                       SELECT * FROM launch_confirmations JOIN fleets USING (fid)
+                                       SELECT lc.pid,landing_tick,eta,back
+                                       FROM launch_confirmations lc JOIN fleets f USING (fid)
                                        WHERE mission = 'Defend'
-                               ) f ON u.planet = f.target AND c.landing_tick = f.landing_tick
+                               ) f USING (pid,landing_tick)
                        GROUP BY username,defense_points,c.id
                ) d
                GROUP BY username,defense_points ORDER BY fleets DESC, defense_points
@@ -359,11 +341,11 @@ sub findCall : Private {
        my $query = $dbh->prepare(q{
                SELECT c.id, coords(p.x,p.y,p.z), c.landing_tick, c.info, covered
                        ,open, dc.username AS dc, u.defense_points,c.member AS uid
-                       ,u.planet, u.username AS member, u.sms,c.ftid,calc
+                       ,p.pid AS planet, u.username AS member, u.sms,c.ftid,calc
                FROM calls c 
                JOIN users u ON c.member = u.uid
+               JOIN current_planet_stats p USING (pid)
                LEFT OUTER JOIN users dc ON c.dc = dc.uid
-               JOIN current_planet_stats p ON u.planet = p.id
                WHERE c.id = ?
                });
        $call = $dbh->selectrow_hashref($query,undef,$call);
index ed9d2c83f204700d89b572a2b35b0094198f98b0..7e3d2e5a1c48f6591c63cd41409cd27508eb8e2c 100644 (file)
@@ -52,7 +52,7 @@ sub distwhores : Local {
 sub marktarget : Local {
        my ( $self, $c, $target ) = @_;
        my $dbh = $c->model;
-       my $update = $dbh->prepare(q{INSERT INTO covop_attacks (uid,id,tick) VALUES(?,?,tick())});
+       my $update = $dbh->prepare(q{INSERT INTO covop_attacks (uid,pid,tick) VALUES(?,?,tick())});
        eval{
                $update->execute($c->user->id,$target);
        };
@@ -65,11 +65,11 @@ sub list : Private {
 
        my $query = $dbh->prepare(q{
        SELECT * FROM (
-               SELECT *
+               SELECT *, pid AS id
                        ,(2*pvalue::float/cvalue) :: Numeric(4,1) AS max_bank_hack
                        ,max_bank_hack(metal,crystal,eonium,pvalue,cvalue,5) AS hack5
                        ,max_bank_hack(metal,crystal,eonium,pvalue,cvalue,13) AS hack13
-               FROM (SELECT p.id,coords(x,y,z),x,y,z,size
+               FROM (SELECT pid,coords(x,y,z),x,y,z,size
                        ,metal + metal_roids * (tick()-ps.tick) * 125 AS metal
                        ,crystal + crystal_roids * (tick()-ps.tick) * 125 AS crystal
                        ,eonium + eonium_roids * (tick()-ps.tick) * 125 AS eonium
@@ -79,12 +79,12 @@ sub list : Private {
                        , planet_status, relationship,gov,ps.tick AS pstick, ds.tick AS dstick
                        , p.value AS pvalue, c.value AS cvalue
                        FROM current_planet_stats p
-                               LEFT OUTER JOIN current_planet_scans ps ON p.id = ps.planet
-                               LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
-                               CROSS JOIN (SELECT value FROM current_planet_stats WHERE id = $1) c
+                               LEFT OUTER JOIN current_planet_scans ps USING (pid)
+                               LEFT OUTER JOIN current_development_scans ds USING (pid)
+                               CROSS JOIN (SELECT value FROM current_planet_stats WHERE pid = $1) c
                        ) AS foo
-                       LEFT OUTER JOIN (SELECT id,max(tick) AS lastcovop FROM covop_attacks
-                               GROUP BY id) co USING (id)
+                       LEFT OUTER JOIN (SELECT pid,max(tick) AS lastcovop FROM covop_attacks
+                               GROUP BY pid) co USING (pid)
                WHERE (metal IS NOT NULL OR distorters IS NOT NULL)
                        AND (NOT planet_status IN ('Friendly','NAP'))
                        AND  (relationship IS NULL OR NOT relationship IN ('Friendly','NAP'))
index d2ea8df4fe8d24b8d0b7012d3e07a4b0893e6928..9bac96a31d87bc1c14576b1e682c5b411969b154 100644 (file)
@@ -54,7 +54,7 @@ sub planetranks : Local {
        my $query = $dbh->prepare(q{SELECT tick,-scorerank AS score,-sizerank AS size
                ,-valuerank AS value,-xprank AS xp
                FROM planets NATUral JOIN planet_stats
-               WHERE id = $1 ORDER BY tick ASC
+               WHERE pid = $1 ORDER BY tick ASC
                });
        $query->execute($planet);
        $c->stash(query => $query);
@@ -69,7 +69,7 @@ sub planetstats : Local {
        $c->stash->{settings}->{y_min_value} = '0';
        my $query = $dbh->prepare(q{SELECT tick,score,size,value,xp*60 AS "xp*60"
                FROM planets NATURAL JOIN planet_stats
-               WHERE id = $1 ORDER BY tick ASC
+               WHERE pid = $1 ORDER BY tick ASC
                });
        $query->execute($planet);
        $c->stash(query => $query);
@@ -122,9 +122,9 @@ sub planetvsnd : Local {
        my $query = $dbh->prepare(q{SELECT a.tick,a.score/LEAST(members,60) AS NDscore
                ,a.size/members as NDsize,memsize, memscore
                FROM (SELECT tick,size AS memsize,score AS memscore
-                       FROM planets p JOIN planet_stats ps USING (id) WHERE p.id = $1) p
+                       FROM planets p JOIN planet_stats ps USING (pid) WHERE pid = $1) p
                JOIN alliance_stats a ON a.tick = p.tick
-               WHERE a.id = 1 ORDER BY tick
+               WHERE aid = 1 ORDER BY tick
                });
        $query->execute($planet);
        $c->stash(query => $query);
@@ -140,12 +140,14 @@ sub alliancevsintel : Local {
        $c->stash->{settings}->{y2_label} = 'score';
 
        my $query = $dbh->prepare(q{SELECT a.tick,a.score,a.size,memsize, memscore
-               FROM (SELECT tick,SUM(size) AS memsize,SUM(score) AS memscore
-                       FROM planets p JOIN planet_stats ps USING (id)
-                       WHERE p.alliance_id = $1 GROUP BY tick) p
-                       JOIN alliance_stats a ON a.tick = p.tick
-               WHERE a.id = $1
-                       AND a.tick > (SELECT max(tick) - 50 FROM alliance_stats)
+               FROM (SELECT tick,aid,SUM(size) AS memsize,SUM(score) AS memscore
+                       FROM alliances a
+                               JOIN planets p USING (alliance)
+                               JOIN planet_stats ps USING (pid)
+                       GROUP BY tick,aid ) p
+                       JOIN alliance_stats a USING (aid,tick)
+               WHERE aid = $1
+                       AND tick > (SELECT max(tick) - 50 FROM alliance_stats)
                ORDER BY tick
                });
        $query->execute($alliance);
@@ -162,12 +164,14 @@ sub avgalliancevsintel : Local {
 
        my $query = $dbh->prepare(q{SELECT a.tick,a.score/LEAST(members,60) AS score
                ,a.size/members AS size,memsize, memscore
-               FROM (SELECT tick,AVG(size) AS memsize,AVG(score) AS memscore
-                       FROM planets p JOIN planet_stats ps USING (id) WHERE p.alliance_id = $1
-                       GROUP BY tick) p
-               JOIN alliance_stats a ON a.tick = p.tick
-               WHERE a.id = $1
-                       AND a.tick > (SELECT max(tick) - 50 FROM alliance_stats)
+               FROM (SELECT tick,aid,AVG(size) AS memsize,AVG(score) AS memscore
+                       FROM alliances a
+                               JOIN planets p USING (alliance)
+                               JOIN planet_stats ps USING (pid)
+                       GROUP BY tick,aid) p
+               JOIN alliance_stats a USING (aid,tick)
+               WHERE aid = $1
+                       AND tick > (SELECT max(tick) - 50 FROM alliance_stats)
                ORDER BY tick
                });
        $query->execute($alliance);
index bbdf0f749ad461fb16fd0ffaa1101569ddf60105..388204bd5a74a583b74a6395b255c62949fbc563 100644 (file)
@@ -35,10 +35,8 @@ sub index :Path : Args(0) {
                        o.alliance AS oalliance ,coords(o.x,o.y,o.z) AS ocoords, i.sender
                        ,t.alliance AS talliance,coords(t.x,t.y,t.z) AS tcoords, i.target
                },q{not ingal
-                       AND ((( t.alliance_id != o.alliance_id OR t.alliance_id IS NULL OR o.alliance_id IS NULL) AND (i.mission = 'Defend' OR i.mission = 'AllyDef' ))
-                       OR ( t.alliance_id = o.alliance_id AND i.mission = 'Attack'))
-                       AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL)
-                       AND NOT (i.back IS NOT NULL AND i.back = i.tick + 4)
+                       AND ((COALESCE( t.alliance != o.alliance,TRUE) AND (i.mission = 'Defend' OR i.mission = 'AllyDef' ))
+                               OR ( t.alliance = o.alliance AND i.mission = 'Attack'))
                        AND i.tick > (tick() - $1)
                });
        $query->execute($ticks);
@@ -50,7 +48,7 @@ sub index :Path : Args(0) {
                while ($coords =~ m/(\d+:\d+:\d+)/g){
                        push @coords,$1;
                }
-               my $planets = $dbh->prepare(q{SELECT id,coords(x,y,z), alliance, nick
+               my $planets = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z), alliance, nick
                        FROM current_planet_stats p
                        WHERE coords(x,y,z) = ANY($1)
                        ORDER BY alliance, p.x, p.y, p.z
@@ -71,8 +69,8 @@ sub planet : Local {
        my $ticks = $c->req->param('ticks') || 48;
        $c->stash(showticks => $ticks);
 
-       my $query = $dbh->prepare(q{SELECT id,coords(x,y,z),alliance,nick,channel
-               FROM current_planet_stats WHERE channel ILIKE ?
+       my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),alliance,nick,channel
+               FROM current_planet_stats WHERE channel = $1
                ORDER BY alliance,x,y,z
                });
        $query->execute($p->{channel});
@@ -102,16 +100,16 @@ sub channels : Local {
        my ( $self, $c, $order ) = @_;
        my $dbh = $c->model;
 
-       if ($order ~~ /(alliance|channel)/){
+       if ($order ~~ /(alliance)/){
                $order = "lower($1) ASC";
        }elsif ($order ~~ /(coords)/){
                $order = "x,y,z";
        }else{
-               $order = 'lower(channel)';
+               $order = 'channel';
        }
 
        my $query = $dbh->prepare(q{
-SELECT id,coords(x,y,z),nick,channel,alliance FROM current_planet_stats
+SELECT pid AS id,coords(x,y,z),nick,channel,alliance FROM current_planet_stats
 WHERE channel <> '' and channel IS NOT NULL
 ORDER BY } . $order
        );
@@ -142,33 +140,33 @@ sub postplanetupdate : Local {
                });
        if ($c->req->param('cnick')){
                my $value = html_escape $c->req->param('nick');
-               $dbh->do(q{UPDATE planets SET nick = ? WHERE id =?}
+               $dbh->do(q{UPDATE planets SET nick = ? WHERE pid =?}
                        ,undef,$value,$p->{id});
                $log->execute($c->user->id,$p->{ftid},"Set nick to: $value");
        }
        if ($c->req->param('cchannel')){
                my $value = html_escape $c->req->param('channel');
-               $dbh->do(q{UPDATE planets SET channel = ? WHERE id =?}
+               $dbh->do(q{UPDATE planets SET channel = ? WHERE pid =?}
                        ,undef,$value,$p->{id});
                $log->execute($c->user->id,$p->{ftid},"Set channel to: $value");
        }
        if ($c->req->param('cstatus')){
                my $value = $c->req->param('status');
-               $dbh->do(q{UPDATE planets SET planet_status = ? WHERE id =?}
+               $dbh->do(q{UPDATE planets SET planet_status = ? WHERE pid =?}
                        ,undef,$value,$p->{id});
                $log->execute($c->user->id,$p->{ftid},"Set planet_status to: $value");
        }
        if ($c->req->param('cgov')){
                my $value = $c->req->param('gov');
-               $dbh->do(q{UPDATE planets SET gov = ? WHERE id =?}
+               $dbh->do(q{UPDATE planets SET gov = ? WHERE pid =?}
                        ,undef,$value,$p->{id});
                $log->execute($c->user->id,$p->{ftid},"Set gov to: $value");
        }
        if ($c->req->param('calliance')){
                my $value = $c->req->param('alliance');
-               $dbh->do(q{UPDATE planets SET alliance_id = NULLIF(?,-1) WHERE id =?}
+               $dbh->do(q{UPDATE planets SET alliance = NULLIF(?,'') WHERE pid = ?}
                        ,undef,$value,$p->{id});
-               $log->execute($c->user->id,$p->{ftid},"Set alliance_id to: $value");
+               $log->execute($c->user->id,$p->{ftid},"Set alliance to: $value");
        }
        $dbh->commit;
 
@@ -188,7 +186,7 @@ sub find : Local {
                        ,undef,$1,$2,$3,$4);
                $c->res->redirect($c->uri_for('planet',$planet));
        }else{
-               my $query = $dbh->prepare(q{SELECT id,coords(x,y,z),nick
+               my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),nick
                        FROM current_planet_stats p
                        WHERE nick ilike $1
                });
@@ -206,10 +204,10 @@ sub findPlanet : Private {
        my ( $self, $c, $id ) = @_;
        my $dbh = $c->model;
 
-       my $query = $dbh->prepare(q{SELECT x,y,z,id, nick, alliance,alliance_id
+       my $query = $dbh->prepare(q{SELECT x,y,z,pid AS id, nick, alliance,aid
                , planet_status,channel,ftid,gov
                FROM current_planet_stats
-               WHERE id = $1
+               WHERE pid = $1
                });
        $query->execute($id);
        $c->stash(p => $query->fetchrow_hashref);
@@ -320,7 +318,7 @@ sub naps : Local {
        my ( $self, $c ) = @_;
        my $dbh = $c->model;
 
-       my $query = $dbh->prepare(q{SELECT p.id,coords(x,y,z)
+       my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z)
                ,ruler, p.planet,race, size, score, value
                , xp, sizerank, scorerank, valuerank, xprank, p.value - p.size*200 
                        - COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150
@@ -329,8 +327,8 @@ sub naps : Local {
                ,(metal+crystal+eonium)/100 AS resvalue, planet_status,hit_us
                , alliance,relationship,nick
                FROM current_planet_stats p
-                       LEFT OUTER JOIN current_planet_scans ps ON p.id = ps.planet
-                       LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
+                       LEFT OUTER JOIN current_planet_scans ps USING (pid)
+                       LEFT OUTER JOIN current_development_scans ds USING (pid)
                WHERE planet_status IN ('Friendly','NAP') order by x,y,z asc
                });
        $query->execute;
index 6e21a9446014b30288cc0786604c41401fe00998..80912c10732e5b53045de5e071b1f53cb7de2a3f 100644 (file)
@@ -41,12 +41,12 @@ sub update : Local {
                my ($timestamp) = $dbh->selectrow_array(q{SELECT MAX(modified)::timestamp AS modified
                        FROM raid_targets WHERE raid = $1},undef,$raid->{id});
                $c->stash(timestamp => $timestamp);
-               $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r
+               $targets = $dbh->prepare(q{SELECT r.id,r.pid FROM raid_targets r
                        WHERE r.raid = ? AND modified > ?
                });
                $targets->execute($raid->{id},$from);
        }elsif($target){
-               $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r
+               $targets = $dbh->prepare(q{SELECT r.id,r.pid FROM raid_targets r
                        WHERE r.raid = $1 AND r.id = $2
                });
                $targets->execute($raid->{id},$target);
index 354bdbeefedfc939ef656ebf2685583e7ded2f4d..ae1e8e6f927c675d64847b9655d3ad32c4d5eeff 100644 (file)
@@ -30,7 +30,7 @@ sub index : Path : Args(0) {
 
        $c->stash(error => $c->flash->{error});
 
-       $c->stash(u => $dbh->selectrow_hashref(q{SELECT planet,defense_points
+       $c->stash(u => $dbh->selectrow_hashref(q{SELECT pid AS planet,defense_points
                        ,attack_points,scan_points,humor_points
                        , (attack_points+defense_points+scan_points/20)::NUMERIC(5,1) as total_points
                        , sms,rank,hostmask,call_if_needed,sms_note,defprio
@@ -38,13 +38,13 @@ sub index : Path : Args(0) {
                        },undef,$c->user->id)
        );
 
-       $c->stash(groups => $dbh->selectrow_array(q{SELECT array_accum(groupname)
+       $c->stash(groups => $dbh->selectrow_array(q{SELECT array_agg(groupname)
                FROM groups g NATURAL JOIN groupmembers gm
                WHERE uid = $1
                        },undef,$c->user->id)
        );
 
-       $c->stash(p => $dbh->selectrow_hashref(q{SELECT id,x,y,z, ruler, planet,race,
+       $c->stash(p => $dbh->selectrow_hashref(q{SELECT pid AS id,x,y,z, ruler, planet,race,
                size, size_gain, size_gain_day,
                score,score_gain,score_gain_day,
                value,value_gain,value_gain_day,
@@ -54,32 +54,14 @@ sub index : Path : Args(0) {
                valuerank,valuerank_gain,valuerank_gain_day,
                xprank,xprank_gain,xprank_gain_day
                from current_planet_stats_full p
-                       WHERE id = ?
+                       WHERE pid = ?
                        },undef,$c->user->planet)
        );
 
        my $calls = $dbh->prepare(q{
-               SELECT id,landing_tick,dc,curreta
-                       ,array_accum(race::text) AS race
-                       ,array_accum(amount) AS amount
-                       ,array_accum(eta) AS eta
-                       ,array_accum(shiptype) AS shiptype
-                       ,array_accum(coords) AS attackers
-               FROM (SELECT c.id, c.landing_tick
-                       ,dc.username AS dc, (c.landing_tick - tick()) AS curreta
-                       ,p2.race, i.amount, i.eta, i.shiptype, p2.alliance
-                       ,coords(p2.x,p2.y,p2.z)
-                       FROM calls c
-                               LEFT OUTER JOIN incomings i ON i.call = c.id
-                               LEFT OUTER JOIN current_planet_stats p2 ON i.sender = p2.id
-                               LEFT OUTER JOIN users dc ON c.dc = dc.uid
-                       WHERE c.member = $1 AND c.landing_tick >= tick()
-                       GROUP BY c.id, c.landing_tick, dc.username
-                               ,p2.race,i.amount,i.eta,i.shiptype,p2.alliance,p2.x,p2.y,p2.z
-                       ) c
-               GROUP BY id, landing_tick,dc,curreta
+SELECT * FROM defcalls
+WHERE uid = $1 AND landing_tick >= tick()
                });
-
        $calls->execute($c->user->id);
        $c->stash(calls => $calls->fetchall_arrayref({}) );
 
@@ -164,7 +146,7 @@ sub postfleetupdate : Local {
                $dbh->begin_work;
                eval{
                        my $insert = $dbh->prepare(q{INSERT INTO fleets
-                               (planet,name,mission,tick,amount)
+                               (pid,name,mission,tick,amount)
                                VALUES (?,'Main','Full fleet',tick(),?) RETURNING fid});
                        my ($id) = $dbh->selectrow_array($insert,undef
                                ,$c->user->planet,$amount);
@@ -400,12 +382,12 @@ sub postconfirmation : Local {
                        FROM  raid_claims c
                                JOIN raid_targets t ON c.target = t.id
                                JOIN raids r ON t.raid = r.id
-                       WHERE c.uid = ? AND r.tick+c.wave-1 = ? AND t.planet = ?
+                       WHERE c.uid = ? AND r.tick+c.wave-1 = ? AND t.pid = ?
                                AND r.open AND not r.removed
                        });
                my $finddefensetarget = $dbh->prepare(q{SELECT c.id FROM calls c
                                JOIN users u ON c.member = u.uid
-                       WHERE u.planet = $1 AND c.landing_tick = $2
+                       WHERE u.pid = $1 AND c.landing_tick = $2
                });
                my $informDefChannel = $dbh->prepare(q{INSERT INTO defense_missions
                        (fleet,call) VALUES (?,?)
@@ -417,12 +399,12 @@ sub postconfirmation : Local {
                        WHERE uid = ? AND target = ? AND wave = ?
                        });
                my $addfleet = $dbh->prepare(q{INSERT INTO fleets
-                       (name,mission,planet,tick,amount)
-                       VALUES ($2,$3,(SELECT planet FROM users WHERE uid = $1),tick(),$4)
+                       (name,mission,pid,tick,amount)
+                       VALUES ($2,$3,(SELECT pid FROM users WHERE uid = $1),tick(),$4)
                        RETURNING fid
                        });
                my $addconfirmation = $dbh->prepare(q{INSERT INTO launch_confirmations
-                       (fid,uid,target,landing_tick,eta,back) VALUES ($1,$2,$3,$4,$5,$6)
+                       (fid,uid,pid,landing_tick,eta,back) VALUES ($1,$2,$3,$4,$5,$6)
                        });
                my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (fid,ship,amount)
                        VALUES (?,?,?)
@@ -530,10 +512,10 @@ sub defenders : Local {
        my $dbh = $c->model;
 
        my $defenders = $dbh->prepare(q{
-SELECT uid,u.planet,username, to_char(NOW() AT TIME ZONE timezone,'HH24:MI') AS time
+SELECT uid,pid AS planet,username, to_char(NOW() AT TIME ZONE timezone,'HH24:MI') AS time
        ,sms_note, call_if_needed, race, timezone
 FROM users u
-       JOIN current_planet_stats p ON p.id = u.planet
+       JOIN current_planet_stats p USING (pid)
 WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = 2)
 ORDER BY call_if_needed DESC, LOWER(username)
                });
@@ -563,22 +545,22 @@ sub member_fleets {
        my $query = $dbh->prepare(q{
 (
        SELECT DISTINCT ON (mission,name) fid,name,tick, NULL AS eta
-               ,amount, NULL AS coords, planet AS target, NULL AS back
+               ,amount, NULL AS coords, pid AS target, NULL AS back
                ,NULL AS recalled, mission
        FROM fleets f
-       WHERE planet = $2 AND tick <= tick() AND tick >= tick() -  24
+       WHERE pid = $2 AND tick <= tick() AND tick >= tick() -  24
                AND name IN ('Main','Advanced Unit') AND mission = 'Full fleet'
        ORDER BY mission,name,tick DESC, fid DESC
 ) UNION (
        SELECT fid,name,landing_tick AS tick, eta, amount
-               , coords(x,y,z), target, back
+               , coords(x,y,z), lc.pid AS target, back
                , (back <> landing_tick + eta - 1) AS recalled
                ,CASE WHEN landing_tick <= tick() OR (back <> landing_tick + eta - 1)
                        THEN 'Returning' ELSE mission END AS mission
-       FROM fleets f
-               JOIN launch_confirmations USING (fid)
-       LEFT OUTER JOIN current_planet_stats t ON target = t.id
-       WHERE uid = $1 AND f.planet = $2 AND back > tick()
+       FROM  launch_confirmations lc
+               LEFT OUTER JOIN current_planet_stats t USING (pid)
+               JOIN fleets f USING (fid)
+       WHERE uid = $1 AND f.pid = $2 AND back > tick()
                AND landing_tick - eta - 12 < tick()
 )
                });
index 6b4f16c3081a96527a4c89284af2035ed2ea5f16..d7125f771b5094402b456b53a471e8ae87e49a92 100644 (file)
@@ -110,12 +110,12 @@ sub view : Local {
        $c->stash(raid => $raid->{id});
        my $planet;
        if ($c->user->planet){
-               my $query = $dbh->prepare("SELECT value, score,x,y FROM current_planet_stats WHERE id = ?");
+               my $query = $dbh->prepare(q{SELECT value, score,x,y FROM current_planet_stats WHERE pid = ?});
                $planet = $dbh->selectrow_hashref($query,undef,$c->user->planet);
        }
        $c->stash(message => parseMarkup($raid->{message}));
        $c->stash(landingtick => $raid->{tick});
-       my $targetquery = $dbh->prepare(q{SELECT r.id, r.planet, size, score, value
+       my $targetquery = $dbh->prepare(q{SELECT r.id, pid AS planet, size, score, value
                , p.x,p.y,p.z, race
                , p.value - p.size*200 -
                        COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 -
@@ -128,9 +128,9 @@ sub view : Local {
                ,amps, distorters, light_fac, medium_fac, heavy_fac
                ,hulls, waves
                FROM current_planet_stats p
-                       JOIN raid_targets r ON p.id = r.planet
-                       LEFT OUTER JOIN current_planet_scans ps ON p.id = ps.planet
-                       LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
+                       JOIN raid_targets r USING (pid)
+                       LEFT OUTER JOIN current_planet_scans ps USING (pid)
+                       LEFT OUTER JOIN current_development_scans ds USING (pid)
                WHERE r.raid = $1
                        AND NOT COALESCE(p.x = $2 AND p.y = $3,False)
                ORDER BY size});
@@ -150,7 +150,7 @@ sub view : Local {
                my $unitscans = $dbh->prepare(q{
 SELECT DISTINCT ON (name) fid, name, tick, amount
 FROM fleets
-WHERE planet = ?
+WHERE pid = ?
        AND mission = 'Full fleet'
 GROUP BY fid,tick,name,amount
 ORDER BY name,tick DESC
@@ -247,22 +247,22 @@ sub edit : Local {
        }
 
        my $targetquery = $dbh->prepare(qq{SELECT r.id,coords(x,y,z),comment,size
-               ,score,value,race,planet_status,relationship,r.planet, s.scans
+               ,score,value,race,planet_status,relationship,pid AS planet, s.scans
                ,COALESCE(max(rc.wave),0) AS waves
                FROM raid_targets r
-                       JOIN current_planet_stats p ON p.id = r.planet
-                       LEFT OUTER JOIN ( SELECT planet, array_accum(s::text) AS scans
-                               FROM ( SELECT DISTINCT ON (planet,type) planet,scan_id,type, tick
+                       JOIN current_planet_stats p USING (pid)
+                       LEFT OUTER JOIN ( SELECT pid, array_agg(s::text) AS scans
+                               FROM ( SELECT DISTINCT ON (pid,type) pid,scan_id,type, tick
                                        FROM scans
                                        WHERE tick > tick() - 24
-                                       ORDER BY planet,type ,tick DESC
+                                       ORDER BY pid,type ,tick DESC
                                        ) s
-                               GROUP BY planet
-                       ) s ON s.planet = r.planet
+                               GROUP BY pid
+                       ) s USING (pid)
                        LEFT OUTER JOIN raid_claims rc ON r.id = rc.target
                WHERE r.raid = ?
                GROUP BY r.id,x,y,z,comment,size,score,value,race
-                       ,planet_status,relationship,comment,r.planet, s.scans
+                       ,planet_status,relationship,comment,pid, s.scans
                        ,sizerank,scorerank,xprank,valuerank
                ORDER BY $order
                });
@@ -344,8 +344,8 @@ sub postaddtargets : Local {
        $sizelimit = -1 unless $sizelimit;
 
        my $targets = $c->req->param('targets');
-       my $addtarget = $dbh->prepare(qq{INSERT INTO raid_targets(raid,planet) (
-               SELECT ?, id FROM current_planet_stats p
+       my $addtarget = $dbh->prepare(q{INSERT INTO raid_targets(raid,pid) (
+               SELECT ?, pid FROM current_planet_stats p
                WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE)
                AND p.size > ?
                )});
@@ -367,13 +367,13 @@ sub postaddtargets : Local {
                        push @errors, $@;
                }
        }
-       if ($c->req->param('alliance') =~ /^(\d+)$/ && $1 != 1){
-               my $addtarget = $dbh->prepare(qq{INSERT INTO raid_targets(raid,planet) (
-                       SELECT ?,id FROM current_planet_stats p WHERE alliance_id = ? AND p.size > ?)
+       if ($c->req->param('alliance') =~ /^(\d+)$/ && $1 ne 'NewDawn'){
+               my $addtarget = $dbh->prepare(q{INSERT INTO raid_targets(raid,pid) (
+                       SELECT ?,pid FROM current_planet_stats p WHERE aid= ? AND p.size > ?)
                        });
                eval {
                        $addtarget->execute($raid,$1,$sizelimit);
-                       $c->forward('log',[$raid,"BC adding alliance $1 to raid"]);
+                       $c->forward('log',[$raid,"BC adding alliance '$1' to raid"]);
                };
                if ($@ =~ /duplicate key value violates unique constraint "raid_targets_raid_key"/){
                        push @errors, "A planet from this alliance has already been added to the raid,"
@@ -524,11 +524,11 @@ sub postcreate : Local {
                my @gals = $c->req->param('gal');
                my @targets = $c->req->param('target');
 
-               my $addtarget = $dbh->prepare(q{INSERT INTO raid_targets(raid,planet) (
-                       SELECT $1,id FROM current_planet_stats p WHERE (planet_status IN ('','Hostile')
+               my $addtarget = $dbh->prepare(q{INSERT INTO raid_targets(raid,pid) (
+                       SELECT $1,pid FROM current_planet_stats p WHERE (planet_status IN ('','Hostile')
                                AND (relationship IS NULL OR relationship IN ('','Hostile')))
-                               AND (id = ANY ($2) OR ( size > $4 AND (x,y) IN (
-                                       SELECT x,y FROM current_planet_stats WHERE id = ANY ($3)))
+                               AND (pid = ANY ($2) OR ( size > $4 AND (x,y) IN (
+                                       SELECT x,y FROM current_planet_stats WHERE pid = ANY ($3)))
                                )
                        )
                });
@@ -560,7 +560,7 @@ sub targetlist : Local {
        $order = "p.$order" if $order =~ /rank$/;
 
        my $query = $dbh->prepare(q{
-SELECT p.id, coords(p.x,p.y,p.z),p.x,p.y,p.alliance, p.score, p.value, p.size, p.xp,nfvalue, nfvalue - sum(pa.value) AS nfvalue2, p.race
+SELECT p.pid AS id, coords(p.x,p.y,p.z),p.x,p.y,p.alliance, p.score, p.value, p.size, p.xp,nfvalue, nfvalue - sum(pa.value) AS nfvalue2, p.race
 FROM current_planet_stats p
        JOIN (SELECT g.x,g.y, sum(p.value) AS nfvalue
                FROM galaxies g join current_planet_stats p on g.x = p.x AND g.y = p.y
@@ -568,13 +568,12 @@ FROM current_planet_stats p
                        AND (planet_status IN ('','Hostile')
                                AND (relationship IS NULL OR relationship IN ('','Hostile')))
                GROUP BY g.x,g.y
-       ) g ON p.x = g.x AND p.y = g.y
-       JOIN current_planet_stats pa ON pa.x = g.x AND pa.y = g.y
+       ) g USING (x,y)
+       JOIN current_planet_stats pa USING (x,y,aid)
 WHERE p.x <> 200
-       AND p.alliance_id = ANY ($1)
-       AND pa.alliance_id = ANY ($1)
+       AND aid = ANY ($1)
        AND p.relationship IN ('','Hostile')
-GROUP BY p.id, p.x,p.y,p.z,p.alliance, p.score, p.value, p.size, p.xp, nfvalue,p.race
+GROUP BY p.pid, p.x,p.y,p.z,p.alliance, p.score, p.value, p.size, p.xp, nfvalue,p.race
        ,p.scorerank,p.valuerank,p.sizerank,p.xprank
 ORDER BY
                } . $order);
@@ -657,13 +656,13 @@ WHERE fid = $1
 sub listAlliances : Private {
        my ($self, $c) = @_;
        my @alliances;
-       my $query = $c->model->prepare(q{SELECT id,name FROM alliances
+       my $query = $c->model->prepare(q{SELECT aid AS id,alliance AS name FROM alliances
                WHERE relationship IN ('','Hostile')
-                       AND id IN (SELECT alliance_id FROM planets)
-                ORDER BY LOWER(name)
+                       AND alliance IN (SELECT alliance FROM planets)
+                ORDER BY LOWER(alliance)
                });
        $query->execute;
-       push @alliances,{id => -1, name => ''};
+       push @alliances,{id => '', name => ''};
        while (my $ally = $query->fetchrow_hashref){
                push @alliances,$ally;
        }
index b34792b74b115876d26d79c98d36eef4bb92fd46..45f2a79959c59191a7b00201029a0b218aad7a0c 100644 (file)
@@ -56,7 +56,7 @@ sub planets : Local {
                $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
        }
 
-       my $query = $dbh->prepare(qq{SELECT id,x,y,z,ruler,planet,race,
+       my $query = $dbh->prepare(qq{SELECT pid AS id,x,y,z,ruler,planet,race,
                size, size_gain, size_gain_day,
                score,score_gain,score_gain_day,
                value,value_gain,value_gain_day,
@@ -143,7 +143,7 @@ sub alliances : Local {
        if ($order =~ /rank$/){
                $browse = qq{WHERE $order > ? ORDER BY $order ASC LIMIT 100};
        }
-       my $query = $dbh->prepare(qq{SELECT a.name,a.id,
+       my $query = $dbh->prepare(qq{SELECT alliance AS name,aid AS id,
                size, size_gain, size_gain_day,
                score,score_gain,score_gain_day,
                avgsize,avgsize_gain,avgsize_gain_day,
index a6bb56ad40c7a8c95097a0b44fd5651ac6ffb6dd..6fab7f29fcde410fb1f674a54405c9cd18db8f6b 100644 (file)
@@ -131,7 +131,7 @@ sub listTargets : Private {
 FROM raid_claims c
        JOIN raid_targets t ON c.target = t.id
        JOIN raids r ON t.raid = r.id
-       JOIN current_planet_stats p ON t.planet = p.id
+       JOIN current_planet_stats p USING (pid)
 WHERE c.uid = $1 AND r.tick+c.wave > tick() AND r.open AND not r.removed
 ORDER BY r.tick+c.wave,x,y,z});
        $query->execute($c->user->id) or die $dbh->errstr;
@@ -146,8 +146,8 @@ ORDER BY r.tick+c.wave,x,y,z});
 sub listAlliances : Private {
        my ($self, $c) = @_;
        my @alliances;
-       push @alliances,{id => -1, name => ''};
-       my $query = $c->model->prepare(q{SELECT id,name FROM alliances ORDER BY LOWER(name)});
+       push @alliances,{aid => '', alliance => ''};
+       my $query = $c->model->prepare(q{SELECT aid,alliance FROM alliances ORDER BY LOWER(alliance)});
        $query->execute;
        while (my $ally = $query->fetchrow_hashref){
                push @alliances,$ally;
@@ -224,7 +224,7 @@ sub end : ActionClass('RenderView') {
                my $fleetupdate = 0;
                if ($c->check_user_roles(qw/member_menu/)){
                        $fleetupdate = $dbh->selectrow_array(q{
-SELECT tick FROM fleets WHERE planet = ? AND tick > tick() - 24
+SELECT tick FROM fleets WHERE pid = ? AND tick > tick() - 24
 AND mission = 'Full fleet' AND name IN ('Main','Advanced Unit');
                                },undef,$c->user->planet);
                        $fleetupdate = 0 unless defined $fleetupdate;
index add02923e4df5e48ac94bc5ef672b9688c172a97..a1db2459db9a6e55f21341a8f805dcfe177c00f4 100644 (file)
@@ -56,8 +56,8 @@ FROM galaxies g
                        SELECT raid,p.tick,x,y,count(*), sum(size) AS size
                        FROM raids r
                                JOIN raid_targets rt ON r.id = rt.raid
-                               JOIN planet_stats p ON p.id = rt.planet AND p.tick = r.tick-12
-                       WHERE x = $1 and y = $2
+                               JOIN planet_stats p USING (pid)
+                       WHERE x = $1 and y = $2 AND p.tick = r.tick-12
                        GROUP BY raid,p.tick,x,y
                        ) AS a
                        JOIN galaxies g USING (tick,x,y)
@@ -91,8 +91,8 @@ WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies)
                };
        }
 
-       $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,p.id)
-               p.id,coords(x,y,z), ruler, p.planet,race,
+       $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,pid)
+               pid AS id,coords(x,y,z), ruler, p.planet,race,
                size, size_gain, size_gain_day,
                score,score_gain,score_gain_day,
                value,value_gain,value_gain_day,
@@ -103,10 +103,10 @@ WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies)
                xprank,xprank_gain,xprank_gain_day
                $extra_columns
                FROM current_planet_stats_full p
-                       LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet
-                       LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
+                       LEFT OUTER JOIN planet_scans ps USING (pid)
+                       LEFT OUTER JOIN current_development_scans ds USING (pid)
                WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE)
-               ORDER BY x,y,z,p.id,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC
+               ORDER BY x,y,z,pid,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC
                });
 
        $query->execute($x,$y,$z);
@@ -117,8 +117,8 @@ sub planet : Local {
        my ( $self, $c, $id ) = @_;
        my $dbh = $c->model;
 
-       my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats
-               WHERE id = $1},undef,$id);
+       my $p = $dbh->selectrow_hashref(q{SELECT pid AS id,x,y,z FROM current_planet_stats
+               WHERE pid = $1},undef,$id);
 
        $c->detach('/default') unless $p;
 
@@ -129,9 +129,9 @@ sub planet : Local {
                my $query = $dbh->prepare(q{
 (
        SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta
-               ,amount, NULL AS coords, planet, NULL AS back
+               ,amount, NULL AS coords, pid AS planet, NULL AS back
        FROM fleets f
-       WHERE planet = $1 AND tick <= tick() AND (
+       WHERE pid = $1 AND tick <= tick() AND (
                        fid IN (SELECT fid FROM fleet_scans)
                ) AND (
                        mission = 'Full fleet'
@@ -141,9 +141,9 @@ sub planet : Local {
 ) UNION (
        SELECT DISTINCT ON (tick,x,y,z,mission,name,amount)
                NULL as fid, i.mission, i.name, i.tick,eta
-               , i.amount, coords(x,y,z), t.id AS planet, back
+               , i.amount, coords(x,y,z), pid AS planet, back
        FROM intel i
-       LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
+       LEFT OUTER JOIN current_planet_stats t ON i.target = pid
        WHERE uid = -1 AND i.sender = $1 AND i.tick > tick() - 14 AND i.tick < tick() + 14
        ORDER BY i.tick,x,y,z,mission,name,amount,back
 )
@@ -168,16 +168,16 @@ sub planet : Local {
                $c->stash(outgoings => \@missions);
 
                $query = $dbh->prepare(q{
-                       SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
-                                               , i.amount, coords(x,y,z) AS coords, s.id AS planet
+                       SELECT DISTINCT ON (i.tick,x,y,z,pid,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
+                                               , i.amount, coords(x,y,z) AS coords, pid AS planet
                        FROM intel i
                        LEFT OUTER JOIN (planets
-                               NATURAL JOIN planet_stats) s ON i.sender = s.id
+                               NATURAL JOIN planet_stats) s ON i.sender = pid
                                        AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
                        WHERE  i.uid = -1
                                AND i.target = ?
                                AND i.tick > tick() - 3
-                       ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta
+                       ORDER BY i.tick,x,y,z,pid,i.name,i.amount,i.eta
                });
                $query->execute($id);
                my @incomings;
@@ -197,7 +197,7 @@ sub planet : Local {
 
        if ($c->check_user_roles(qw/stats_scans/)){
                my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
-                       WHERE planet = ? AND tick > tick() - 168
+                       WHERE pid = ? AND tick > tick() - 168
                        ORDER BY tick,type DESC
                });
                $query->execute($id);
@@ -206,18 +206,18 @@ sub planet : Local {
 
        if ($c->check_user_roles(qw/stats_planetdata/)){
                $c->stash(planetscan => $dbh->selectrow_hashref(q{SELECT *
-                       FROM current_planet_scans WHERE planet = $1},undef,$id));
+                       FROM current_planet_scans WHERE pid = $1},undef,$id));
                $c->stash(devscan => $dbh->selectrow_hashref(q{SELECT *
-                       FROM current_development_scans WHERE planet = $1},undef,$id));
+                       FROM current_development_scans WHERE pid = $1},undef,$id));
        }
 
-       my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats 
-               WHERE id = ? AND tick > tick() - 24});
+       my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats
+               WHERE pid = ? AND tick > tick() - 24});
        $query->execute($id);
        $c->stash(values => $query->fetchall_arrayref({}) );
 
        $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
-               WHERE id = ? ORDER BY tick ASC});
+               WHERE pid = ? ORDER BY tick ASC});
        $query->execute($id);
        my @coords;
        my $co = {x => 0, y => 0, z => 0};
@@ -245,7 +245,7 @@ sub find : Local {
        }elsif (/(\d+)(?: |:)(\d+)/){
                $c->res->redirect($c->uri_for('galaxy',$1,$2));
        }elsif($c->check_user_roles(qw/stats_find_nick/)) {
-               my $query = $dbh->prepare(q{SELECT id,coords(x,y,z),nick
+               my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),nick
                        FROM current_planet_stats p
                        WHERE nick ilike $1
                });
index 74118d17f0a35f495edb65101ee6e00e8b97162e..dc0b99d58a250de99d33fc3f52f1306739537528 100644 (file)
@@ -32,7 +32,7 @@ sub alliance : Local {
 
        my $query = $dbh->prepare(q{SELECT coords(x,y,z), size, score, value,race, COALESCE(nick,'') AS nick
                FROM current_planet_stats
-               WHERE alliance_id = $1
+               WHERE aid = $1
                ORDER BY x,y,z});
        $query->execute($ally);
 
index 9d70fc2626585fc1389e9c9d37ac0de5d0cc7b8c..c2a521e08ea24b38bf0971b7e70d5c2f28e95d83 100644 (file)
@@ -91,10 +91,11 @@ sub updateUser : Local {
                                my $column = $1;
                                my $value = $c->req->param($column);
                                if ($column eq 'planet'){
+                                       $column = 'pid';
                                        if ($value eq ''){
                                                $value = undef;
                                        }elsif($value =~ /^(\d+)\D+(\d+)\D+(\d+)$/){
-                                               ($value) = $dbh->selectrow_array(q{SELECT id FROM
+                                               ($value) = $dbh->selectrow_array(q{SELECT pid FROM
                                                        current_planet_stats WHERE x = ? and y = ? and z =?}
                                                        ,undef,$1,$2,$3);
                                        }
@@ -131,9 +132,10 @@ sub findUser : Private {
        my $dbh = $c->model;
 
        my $query = $dbh->prepare(q{
-               SELECT uid,username,hostmask,CASE WHEN u.planet IS NULL THEN '' ELSE coords(x,y,z) END AS planet,attack_points,defense_points,scan_points,humor_points,info, email, sms
-               FROM users u LEFT OUTER JOIN current_planet_stats p ON u.planet = p.id
-               WHERE uid = ?;
+SELECT uid,username,hostmask,attack_points,defense_points,scan_points,humor_points,info, email, sms
+       ,COALESCE(coords(x,y,z),'') AS planet
+FROM users u LEFT OUTER JOIN current_planet_stats p USING (pid)
+WHERE uid = ?;
                });
        $user = $dbh->selectrow_hashref($query,undef,$user);
 
index b092122dba84be1d849797ad7f51b8db6bdbbab1..1cbcca9de3e09790280105192f16df6345ab1f2d 100644 (file)
@@ -81,9 +81,9 @@ sub intelquery {
        return qq{
 SELECT $columns, i.mission, i.tick AS landingtick,MIN(i.eta) AS eta, i.amount, i.ingal, u.username
 FROM (intel i NATURAL JOIN users u)
-       JOIN current_planet_stats t ON i.target = t.id
-       JOIN current_planet_stats o ON i.sender = o.id
-WHERE $where 
+       JOIN current_planet_stats t ON i.target = t.pid
+       JOIN current_planet_stats o ON i.sender = o.pid
+WHERE $where
 GROUP BY i.tick,i.mission,t.x,t.y,t.z,o.x,o.y,o.z,i.amount,i.ingal,u.username,t.alliance,o.alliance,t.nick,o.nick,i.sender,i.target
 ORDER BY i.tick DESC, i.mission};
 }
index cb7aae78bac99649a5490b15a86a247a97d96611..7d18e536dc6b495e2984f2fd84b404fc6b4cdfc2 100644 (file)
@@ -38,7 +38,7 @@
                <tr><td>Alliance</td>
                        <td><select name="alliance">
 [% FOR a IN alliances %]
-                               <option value="[% a.id %]" [% IF a.id == p.alliance_id %]selected[% END %]> [% a.name %]</option>
+                               <option value="[% a.alliance %]" [% IF a.aid == p.aid %]selected[% END %]> [% a.alliance %]</option>
 [% END %]
                                </select></td>
                        <td><input type="checkbox" name="calliance"></td>
index a2dbc2cdc77781346ad3e41b5264a231a147db68..3afa58c980c9ef225f0a068574d64018f7a5e180 100644 (file)
@@ -1,4 +1,4 @@
-modified = "0000-01-01";
+modified = "0001-01-01";
 
 function parseUpdate(xml){
        if ($('timestamp',xml).text())
index bfdce31738d3446c55234e31e8d3c6db186aeb6d..e2f8688eca06db8410e4c0eeef5f2a2f79f6816e 100755 (executable)
@@ -49,13 +49,13 @@ $dbh->do(q{INSERT INTO raid_access (raid,gid) VALUES(?,2)}
 my $addtarget = $dbh->prepare(q{INSERT INTO raid_targets(raid,planet,comment)
        VALUES($1,$2,$3)});
 
-my $incs = $dbh->prepare(q{SELECT sender,array_accum(i.eta) AS eta,array_accum(amount) AS amount
-       ,array_accum(shiptype) AS type,array_accum(fleet) AS name,array_accum(c.landing_tick) AS landing
+my $incs = $dbh->prepare(q{SELECT pid,array_agg(i.eta) AS eta,array_agg(amount) AS amount
+       ,array_agg(shiptype) AS type,array_agg(fleet) AS name,array_agg(c.landing_tick) AS landing
        FROM calls c
                JOIN incomings i ON i.call = c.id
        WHERe NOT c.covered AND c.landing_tick BETWEEN tick() AND tick() + 6
                AND c.landing_tick + GREATEST(i.eta,7) > tick() + 10
-       GROUP BY sender
+       GROUP BY pid
        });
 $incs->execute;
 
@@ -69,7 +69,7 @@ while (my $inc = $incs->fetchrow_hashref){
                my $back = $landing + $eta;
                $comment .= "$name: ETA=$eta Amount=$amount Type:'$type' Landing tick=$landing Estimated back:$back\n";
        }
-       $addtarget->execute($raid,$inc->{sender},$comment);
+       $addtarget->execute($raid,$inc->{pid},$comment);
 }
 
 $dbh->commit;
index acb1405d3a282ede1bcd1adf73e1746b1dcbdebf..eff1d380cc07a6c9d82ac6e69a92b07c1de561ff 100755 (executable)
@@ -35,7 +35,7 @@ use ND::DB;
 our $dbh = ND::DB::DB();
 
 $dbh->begin_work;
-my $st = $dbh->prepare(q{SELECT uid FROM current_planet_stats p JOIN users u ON p.id = u.planet WHERE alliance_id = 1 ORDER BY score DESC});
+my $st = $dbh->prepare(q{SELECT uid FROM current_planet_stats p JOIN users u USING (pid) WHERE alliance = 'NewDawn' ORDER BY score DESC});
 my $update = $dbh->prepare(q{UPDATE users SET rank = ? WHERE uid = ?});
 $st->execute;
 my $rank = 1;
index bc43e96a74aa513a3255c65a4f6eaa327f93d731..02e9a495987a0abb768072fbc3a12c3689fd22e1 100755 (executable)
@@ -63,7 +63,7 @@ for my $i (3,4){
                $alliance->[$i+2] = $rank;
     }
 }
-my $insert = $dbh->prepare(q{INSERT INTO alliance_stats (tick,id,members,
+my $insert = $dbh->prepare(q{INSERT INTO alliance_stats (tick,aid,members,
        size,score,
        sizerank,scorerank,
        size_gain,score_gain,
@@ -73,7 +73,7 @@ my $insert = $dbh->prepare(q{INSERT INTO alliance_stats (tick,id,members,
        members_gain,members_gain_day
        ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}) or die $dbh->errstr;
 
-my $findalliance = $dbh->prepare(q{SELECT tick,id,members,
+my $findalliance = $dbh->prepare(q{SELECT tick,aid,members,
        size, score,
        sizerank, scorerank,
        size_gain, score_gain,
@@ -81,7 +81,7 @@ my $findalliance = $dbh->prepare(q{SELECT tick,id,members,
        size_gain_day, score_gain_day,
        sizerank_gain_day, scorerank_gain_day,
        members_gain,members_gain_day
-FROM alliance_stats WHERE id = $1 AND tick < $2 ORDER BY tick DESC LIMIT 1}) or die $dbh->errstr;
+FROM alliance_stats WHERE aid = $1 AND tick < $2 ORDER BY tick DESC LIMIT 1}) or die $dbh->errstr;
 
 for my $alliance (@alliances) {
 
index 50225cedfda2eafaecfcc306f1bba272ed6736e9..7d3eda7c1396ffb7f934184e71ac146515c1151b 100755 (executable)
@@ -64,15 +64,15 @@ for my $i (8,7,5,6){
     }
 }
 
-my $findplanets = $dbh->prepare(q{SELECT tick,id, x, y, z, 
-       size, score, value, xp, 
-       sizerank, scorerank, valuerank, xprank, 
-       size_gain, score_gain, value_gain, xp_gain, 
-       sizerank_gain, scorerank_gain, valuerank_gain, xprank_gain, 
-       size_gain_day, score_gain_day, value_gain_day, xp_gain_day, 
+my $findplanets = $dbh->prepare(q{SELECT tick,pid, x, y, z,
+       size, score, value, xp,
+       sizerank, scorerank, valuerank, xprank,
+       size_gain, score_gain, value_gain, xp_gain,
+       sizerank_gain, scorerank_gain, valuerank_gain, xprank_gain,
+       size_gain_day, score_gain_day, value_gain_day, xp_gain_day,
        sizerank_gain_day, scorerank_gain_day, valuerank_gain_day, xprank_gain_day
 FROM planet_stats WHERE tick = (SELECT MAX(tick) FROM planet_stats WHERE tick < $1)});
-my $insert = $dbh->prepare(q{INSERT INTO planet_stats(tick,id, x, y, z, 
+my $insert = $dbh->prepare(q{INSERT INTO planet_stats(tick,pid, x, y, z,
        size, score, value,xp,
        sizerank,scorerank,valuerank,xprank,
        size_gain, score_gain, value_gain, xp_gain,
@@ -85,6 +85,8 @@ my %oldStats;
 while (my @planet = $findplanets->fetchrow){
        $oldStats{$planet[1]} = \@planet;
 }
+my $intel = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
+               (SELECT ftid FROM planets WHERE pid = $2),$1,$3)});
 for my $planet (@planets) {
        #print "$planet->[1]\n";
        my $oldPlanet = $oldStats{$planet->[1]};
@@ -100,7 +102,7 @@ for my $planet (@planets) {
                        ($planet->[3] != $oldPlanet->[3]) or 
                        ($planet->[4] != $oldPlanet->[4])){
                        #print "Planet has moved from $oldPlanet[2]:$oldPlanet[3]:$oldPlanet[4] to $planet->[2]:$planet->[3]:$planet->[4]\n";
-                       intel_log -3, $planet->[1],"Planet has moved from $oldPlanet->[2]:$oldPlanet->[3]:$oldPlanet->[4] to $planet->[2]:$planet->[3]:$planet->[4] tick $tick";
+                       $intel->execute(-3, $planet->[1],"Planet has moved from $oldPlanet->[2]:$oldPlanet->[3]:$oldPlanet->[4] to $planet->[2]:$planet->[3]:$planet->[4] tick $tick");
                }
        }
        #print "@{$oldPlanet}\n";
index a7c25dd8896768de8bd755f7e85b58757f36a2f2..943ad62dc7c8e8cb76b8a84c1a16d4577fa74ce2 100755 (executable)
@@ -45,7 +45,7 @@ my $scangroups = $dbh->prepare(q{SELECT id,scan_id,tick,uid FROM scans
 });
 my $oldscan = $dbh->prepare(q{SELECT scan_id FROM scans WHERE scan_id = LOWER(?) AND tick >= tick() - 168});
 my $addScan = $dbh->prepare(q{INSERT INTO scans (scan_id,tick,uid) VALUES (LOWER(?),?,?)});
-my $parsedscan = $dbh->prepare(q{UPDATE scans SET tick = ?, type = ?, planet = ?, parsed = TRUE WHERE id = ?});
+my $parsedscan = $dbh->prepare(q{UPDATE scans SET tick = ?, type = ?, pid = ?, parsed = TRUE WHERE id = ?});
 my $addpoints = $dbh->prepare(q{UPDATE users SET scan_points = scan_points + ? WHERE uid = ? });
 my $delscan = $dbh->prepare(q{DELETE FROM scans WHERE id = ?});
 
@@ -73,23 +73,23 @@ my $newscans = $dbh->prepare(q{SELECT id,scan_id,tick,uid FROM scans
        WHERE NOT groupscan AND NOT parsed FOR UPDATE
 });
 my $findplanet = $dbh->prepare(q{SELECT planetid(?,?,?,?)});
-my $findoldplanet = $dbh->prepare(q{SELECT id FROM planet_stats WHERE x = $1 AND y = $2 AND z = $3 AND tick <= $4 ORDER BY tick DESC LIMIT 1});
+my $findoldplanet = $dbh->prepare(q{SELECT pid FROM planet_stats WHERE x = $1 AND y = $2 AND z = $3 AND tick <= $4 ORDER BY tick DESC LIMIT 1});
 my $findcoords = $dbh->prepare(q{SELECT * FROM planetcoords(?,?)});
-my $addfleet = $dbh->prepare(q{INSERT INTO fleets (name,mission,planet,tick,amount) VALUES(?,?,?,?,?) RETURNING fid});
+my $addfleet = $dbh->prepare(q{INSERT INTO fleets (name,mission,pid,tick,amount) VALUES(?,?,?,?,?) RETURNING fid});
 my $fleetscan = $dbh->prepare(q{INSERT INTO fleet_scans (fid,id) VALUES(?,?)});
 my $addintel = $dbh->prepare(q{INSERT INTO intel (name,mission,sender,target,tick,eta,back,amount,ingal,uid)
        VALUES(?,?,?,?,?,?,?,?,?,-1) RETURNING id});
 my $intelscan = $dbh->prepare(q{INSERT INTO intel_scans (intel,id) VALUES(?,?)});
 my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (fid,ship,amount) VALUES(?,?,?)});
 my $addplanetscan = $dbh->prepare(q{INSERT INTO planet_scans
-       (id,tick,planet,metal_roids,metal,crystal_roids,crystal,eonium_roids,eonium
+       (id,tick,pid,metal_roids,metal,crystal_roids,crystal,eonium_roids,eonium
                ,agents,guards,light,medium,heavy,hidden)
        VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)});
 
 sub parse_planet {
        my ($scan,$file) = @_;
 
-       my @values = ($scan->{id},$scan->{tick},$scan->{planet});
+       my @values = ($scan->{id},$scan->{tick},$scan->{pid});
        $file =~ s/(\d),(\d)/$1$2/g;
 
        while($file =~ m{"center">(Metal|Crystal|Eonium)</td>\D+(\d+)\D+([\d,]+)}g){
@@ -113,7 +113,7 @@ sub parse_incoming {
 
        while($file =~ m{class="left">Fleet:\s(.*?)</td><td\sclass="right">
                        Mission:\s(\w+)</td></tr>(.*?)Total\sShips:\s(\d+)}sxg){
-               my $id = addfleet($1,$2,$3,$scan->{planet},$scan->{tick},$4);
+               my $id = addfleet($1,$2,$3,$scan->{pid},$scan->{tick},$4);
                $fleetscan->execute($id,$scan->{id}) or die $dbh->errstr;
        }
 }
@@ -121,7 +121,7 @@ sub parse_incoming {
 sub parse_unit {
        my ($scan,$file) = @_;
 
-       my $id = addfleet($scan->{type},'Full fleet',$file,$scan->{planet},$scan->{tick});
+       my $id = addfleet($scan->{type},'Full fleet',$file,$scan->{pid},$scan->{tick});
        $fleetscan->execute($id,$scan->{id}) or die $dbh->errstr;
 }
 
@@ -132,7 +132,7 @@ sub parse_jumpgate {
                my ($sender) = $dbh->selectrow_array($findplanet,undef,$1,$2,$3,$scan->{tick});
                ($sender) = $dbh->selectrow_array($findoldplanet,undef,$1,$2,$3,$scan->{tick})
                        if ((not defined $sender) && $4 eq 'Return');
-               my $id = addintel($5,$4,$sender,$scan->{planet},$scan->{tick}+$6,$6
+               my $id = addintel($5,$4,$sender,$scan->{pid},$scan->{tick}+$6,$6
                        ,undef,$7, $scan->{x} == $1 && $scan->{y} == $2);
                $intelscan->execute($id,$scan->{id});
        }
@@ -140,7 +140,7 @@ sub parse_jumpgate {
 }
 
 my $adddevscan = $dbh->prepare(q{INSERT INTO development_scans
-       (id,tick,planet,light_fac,medium_fac,heavy_fac,amps,distorters
+       (id,tick,pid,light_fac,medium_fac,heavy_fac,amps,distorters
                ,metal_ref,crystal_ref,eonium_ref,reslabs,fincents,seccents
                ,travel,infra,hulls,waves,extraction,covert,mining,total)
        VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
@@ -187,7 +187,7 @@ while (my $scan = $newscans->fetchrow_hashref){
                        next;
                }
                my ($planet) = $dbh->selectrow_array($findplanet,undef,$x,$y,$z,$tick);
-               $scan->{planet} = $planet;
+               $scan->{pid} = $planet;
                unless ($planet){
                        $dbh->pg_rollback_to('scans') or die "rollback didn't work";
                        if ( $x == 0 && $y == 0 && $z == 0 ){