aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterServer/Database/Pg/dbBeacon.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MasterServer/Database/Pg/dbBeacon.pm')
-rwxr-xr-xlib/MasterServer/Database/Pg/dbBeacon.pm150
1 files changed, 101 insertions, 49 deletions
diff --git a/lib/MasterServer/Database/Pg/dbBeacon.pm b/lib/MasterServer/Database/Pg/dbBeacon.pm
index e396810..735eaf9 100755
--- a/lib/MasterServer/Database/Pg/dbBeacon.pm
+++ b/lib/MasterServer/Database/Pg/dbBeacon.pm
@@ -6,14 +6,16 @@ use warnings;
use Exporter 'import';
our @EXPORT = qw| add_beacon
+ add_pending
remove_pending
- set_direct_beacon
get_pending_beacon
get_pending_info
get_next_pending |;
+################################################################################
## Update beacon in serverlist or pending list. Add if beacon does not exist in
-## either list. Return 0,1,2 if success in adding or -1 on error
+## either list. Return 0,1,2 if success in adding or -1 on error.
+################################################################################
sub add_beacon {
my ($self, $ip, $beaconport, $heartbeat, $gamename, $secure) = @_;
@@ -35,7 +37,7 @@ sub add_beacon {
return 0 if ($u > 0);
# if it is already in the pending list, update it with a new challenge
- $u = $self->{dbh}->do(
+ $u = $self->{dbh}->do(
"UPDATE pending
SET added = NOW(),
beaconport = ?,
@@ -52,8 +54,13 @@ sub add_beacon {
return 1 if ($u > 0);
# if not found, add it
- $u = $self->{dbh}->do(
- "INSERT INTO pending (ip, beaconport, heartbeat, gamename, secure)
+ $u = $self->{dbh}->do(
+ "INSERT INTO pending (
+ ip,
+ beaconport,
+ heartbeat,
+ gamename,
+ secure)
SELECT ?, ?, ?, ?, ?",
undef, $ip, $beaconport, $heartbeat, lc $gamename, $secure);
@@ -68,83 +75,128 @@ sub add_beacon {
return -1;
}
-## server checks out, remove entry from the pending list.
-sub remove_pending {
- my ($self, $id) = @_;
-
+################################################################################
+## Add an address to the database that was obtained via a method other than
+## an udp beacon. Return 0,1,2 if success in adding or -1 on error.
+################################################################################
+sub add_pending {
+ my ($self, $ip, $port, $gamename, $secure) = @_;
+
# if address is in list, update the timestamp
- my $u = $self->{dbh}->do("DELETE FROM pending WHERE id = ?", undef, $id);
+ my $u = $self->{dbh}->do(
+ "UPDATE serverlist
+ SET updated = NOW()
+ WHERE ip = ?
+ AND port = ?",
+ undef, $ip, $port);
+
+ # notify
+ $self->log("update", "updated serverlist with $ip:$port") if ($u > 0);
- # notify
- $self->log("deleted", "removed pending id $id from the list of pending servers") if ($u > 0);
+ # if updated, return 0
+ return 0 if ($u > 0);
+
+ # if it is already in the pending list, update it with a new challenge
+ $u = $self->{dbh}->do(
+ "UPDATE pending
+ SET added = NOW(),
+ secure = ?
+ WHERE ip = ?
+ AND heartbeat = ?",
+ undef, $secure, $ip, $port);
+
+ # notify
+ $self->log("update", "updated pending with $ip:$port") if ($u > 0);
- # it was added to pending
- return 2 if ($u > 0);
+ # return 1 if updated
+ return 1 if ($u > 0);
- # or else report error
- $self->log("error", "an error occurred deleting server $id from the pending list");
+ # if not found, add it
+ $u = $self->{dbh}->do(
+ "INSERT INTO pending (
+ ip,
+ heartbeat,
+ gamename,
+ secure)
+ SELECT ?, ?, ?, ?",
+ undef, $ip, $port, $gamename, $secure);
+
+ # notify
+ $self->log("add", "$ip:$port added pending $gamename") if ($u > 0);
+
+ # return 2 if added new
+ return 2 if ($u > 0);
+
+ # else
return -1;
}
-
-## mark server as "direct beacon to this masterserver"
-sub set_direct_beacon {
- my ($self, $ip, $port) = @_;
+################################################################################
+## Remove an entry from the pending list. Returns 0 if removed or -1 in case
+## of error(s).
+################################################################################
+sub remove_pending {
+ my ($self, $id) = @_;
- # update or add server to serverlist
- my $u = $self->{dbh}->do("UPDATE serverlist
- SET b333ms = TRUE
- WHERE ip = ?
- AND port = ?",
- undef, $ip, $port);
-
- # notify
- $self->log("update", "$ip:$port is a direct beacon.") if ($u > 0);
+ # if address is in list, update the timestamp
+ my $u = $self->{dbh}->do(
+ "DELETE FROM pending
+ WHERE id = ?",
+ undef, $id);
- # if found, updated; done
- return 0 if ($u > 0);
+ # notify
+ $self->log("delete", "removed pending id $id from pending") if ($u > 0);
+
+ # it was removed from pending
+ return 2 if ($u > 0);
# or else report error
- $self->log("error", "an error occurred setting server $ip:$port as direct beacon");
+ $self->log("error", "error deleting server $id from pending");
return -1;
}
-
-
-## Get pending server by ip, beacon port.
+################################################################################
+## Get pending server by ip, beacon port. Returns * or undef
+################################################################################
sub get_pending_beacon {
my ($self, $ip, $port) = @_;
# if address is in list, update the timestamp
return $self->{dbh}->selectall_arrayref(
- "SELECT * FROM pending
- WHERE ip = ?
- AND beaconport = ?",
- undef, $ip, $port)->[0];
+ "SELECT * FROM pending
+ WHERE ip = ?
+ AND beaconport = ?",
+ undef, $ip, $port)->[0];
}
-## Same as get_pending_beacon, but with heartbeat port as identifier
+################################################################################
+## Get pending server by ip, heartbeat port. Returns * or undef
+################################################################################
sub get_pending_info {
my ($self, $ip, $port) = @_;
# if address is in list, update the timestamp
return $self->{dbh}->selectall_arrayref(
- "SELECT * FROM pending
- WHERE ip = ?
- AND heartbeat = ?",
- undef, $ip, $port)->[0];
+ "SELECT * FROM pending
+ WHERE ip = ?
+ AND heartbeat = ?",
+ undef, $ip, $port)->[0];
}
-## Get server info from any entry with an id higher than the provided one.
+################################################################################
+## Get server info from any entry with an id higher than the provided one. The
+## server is added to pending at least 15 seconds ago. Returns info or undef.
+################################################################################
sub get_next_pending {
my ($self, $id) = @_;
# get 1 pending id that is older than 15s
return $self->{dbh}->selectall_arrayref(
- "SELECT id, ip, heartbeat, secure FROM pending
- WHERE added < (NOW() - INTERVAL '15 SECONDS')
- AND id > ?
- ORDER BY id ASC LIMIT 1", undef, $id)->[0];
+ "SELECT id, ip, heartbeat, secure FROM pending
+ WHERE added < (NOW() - INTERVAL '15 SECONDS')
+ AND id > ?
+ ORDER BY id ASC LIMIT 1",
+ undef, $id)->[0];
}