Start adaptation to the new DB schema

master
Daniel Berteaud 10 years ago
parent 6b96806c04
commit 7370977481
  1. 99
      vroom.pl

@ -257,11 +257,13 @@ helper create_room => sub {
# Exit if the name isn't valid or already taken # Exit if the name isn't valid or already taken
return undef if ($self->get_room_by_name($name) || !$self->valid_room_name($name)); return undef if ($self->get_room_by_name($name) || !$self->valid_room_name($name));
my $sth = eval { my $sth = eval {
$self->db->prepare("INSERT INTO `rooms` (`name`,`create_timestamp`,`activity_timestamp`,`owner`,`token`,`realm`) VALUES (?,?,?,?,?,?);") $self->db->prepare('INSERT INTO `rooms`
(`name`,`create_date`,`last_activity`,`owner`,`token`,`realm`)
VALUES (?,CONVERT_TZ(NOW(), @@session.time_zone, \'+00:00\'),CONVERT_TZ(NOW(), @@session.time_zone, \'+00:00\'),?,?,?)')
} || return undef; } || return undef;
# Gen a random token. Will be used as a turnPassword # Gen a random token. Will be used as a turnPassword
my $tp = $self->get_random(256); my $tp = $self->get_random(256);
$sth->execute($name,time(),time(),$owner,$tp,$config->{'turn.realm'}) || return undef; $sth->execute($name,$owner,$tp,$config->{'turn.realm'}) || return undef;
$self->app->log->info("Room $name created by " . $self->session('name')); $self->app->log->info("Room $name created by " . $self->session('name'));
# Etherpad integration ? # Etherpad integration ?
if ($ec){ if ($ec){
@ -270,12 +272,14 @@ helper create_room => sub {
return 1; return 1;
}; };
# Read room param in the DB and return a perl hash # Read room param in the DB and return a perl hashref
helper get_room => sub { helper get_room_by_name => sub {
my $self = shift; my $self = shift;
my ($name) = @_; my ($name) = @_;
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT * FROM `rooms` WHERE `name`=?;") $self->db->prepare('SELECT *
FROM `rooms`
WHERE `name`=?')
} || return undef; } || return undef;
$sth->execute($name) || return undef; $sth->execute($name) || return undef;
return $sth->fetchall_hashref('name')->{$name}; return $sth->fetchall_hashref('name')->{$name};
@ -286,7 +290,9 @@ helper get_room_by_id => sub {
my $self = shift; my $self = shift;
my ($id) = @_; my ($id) = @_;
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT * FROM `rooms` WHERE `id`=?;") $self->db->prepare("SELECT *
FROM `rooms`
WHERE `id`=?;")
} || return undef; } || return undef;
$sth->execute($id) || return undef; $sth->execute($id) || return undef;
return $sth->fetchall_hashref('id')->{$id}; return $sth->fetchall_hashref('id')->{$id};
@ -300,7 +306,9 @@ helper lock_room => sub {
return undef unless ( %{ $self->get_room_by_name($name) }); return undef unless ( %{ $self->get_room_by_name($name) });
return undef unless ($lock =~ m/^0|1$/); return undef unless ($lock =~ m/^0|1$/);
my $sth = eval { my $sth = eval {
$self->db->prepare("UPDATE `rooms` SET `locked`=? WHERE `name`=?;") $self->db->prepare('UPDATE `rooms`
SET `locked`=?
WHERE `name`=?')
} || return undef; } || return undef;
$sth->execute($lock,$name) || return undef; $sth->execute($lock,$name) || return undef;
my $action = ($lock eq '1') ? 'locked':'unlocked'; my $action = ($lock eq '1') ? 'locked':'unlocked';
@ -315,7 +323,9 @@ helper add_participant => sub {
my ($name,$participant) = @_; my ($name,$participant) = @_;
my $room = $self->get_room_by_name($name) || return undef; my $room = $self->get_room_by_name($name) || return undef;
my $sth = eval { my $sth = eval {
$self->db->prepare("INSERT IGNORE INTO `participants` (`id`,`participant`,`activity_timestamp`) VALUES (?,?,?);") $self->db->prepare('INSERT IGNORE INTO `participants`
(`id`,`room_id`,`participant`,`last_activity`)
VALUES (?,?,?,?)')
} || return undef; } || return undef;
$sth->execute($room->{id},$participant,time()) || return undef; $sth->execute($room->{id},$participant,time()) || return undef;
$self->app->log->info($self->session('name') . " joined the room $name"); $self->app->log->info($self->session('name') . " joined the room $name");
@ -328,7 +338,9 @@ helper remove_participant => sub {
my ($name,$participant) = @_; my ($name,$participant) = @_;
my $room = $self->get_room_by_name($name) || return undef; my $room = $self->get_room_by_name($name) || return undef;
my $sth = eval { my $sth = eval {
$self->db->prepare("DELETE FROM `participants` WHERE `id`=? AND `participant`=?;") $self->db->prepare('DELETE FROM `participants`
WHERE `id`=?
AND `participant`=?')
} || return undef; } || return undef;
$sth->execute($room->{id},$participant) || return undef; $sth->execute($room->{id},$participant) || return undef;
$self->app->log->info($self->session('name') . " leaved the room $name"); $self->app->log->info($self->session('name') . " leaved the room $name");
@ -341,7 +353,9 @@ helper get_participants => sub {
my ($name) = @_; my ($name) = @_;
my $room = $self->get_room_by_name($name) || return undef; my $room = $self->get_room_by_name($name) || return undef;
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT `participant` FROM `participants` WHERE `id`=?;") $self->db->prepare('SELECT `participant`
FROM `participants`
WHERE `id`=?')
} || return undef; } || return undef;
$sth->execute($room->{id}) || return undef; $sth->execute($room->{id}) || return undef;
my @res; my @res;
@ -355,16 +369,27 @@ helper get_participants => sub {
helper set_peer_role => sub { helper set_peer_role => sub {
my $self = shift; my $self = shift;
my ($room,$name,$id,$role) = @_; my ($room,$name,$id,$role) = @_;
my $data = $self->get_room_by_name($room);
if (!$data){
return undef;
}
# Check if this ID isn't the one from another peer first # Check if this ID isn't the one from another peer first
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT * FROM `participants` WHERE `peer_id`=? AND `participant`!=? AND `id` IN (SELECT `id` FROM `rooms` WHERE `name`=?)") $self->db->prepare('SELECT COUNT(`id`)
FROM `participants`
WHERE `peer_id`=?
AND `participant`!=?
AND `room_id`=?')
} || return undef; } || return undef;
$sth->execute($id,$name,$room) || return undef; $sth->execute($id,$name,$data->{id}) || return undef;
return undef if ($sth->rows > 0); return undef if ($sth->rows > 0);
$sth = eval { $sth = eval {
$self->db->prepare("UPDATE `participants` SET `peer_id`=?,`role`=? WHERE `participant`=? AND `id` IN (SELECT `id` FROM `rooms` WHERE `name`=?)") $self->db->prepare('UPDATE `participants`
SET `peer_id`=?,`role`=?
WHERE `participant`=?
AND `room_id`=?')
} || return undef; } || return undef;
$sth->execute($id,$role,$name,$room) || return undef; $sth->execute($id,$role,$name,$data->{id}) || return undef;
$self->app->log->info("User $name (peer id $id) has now the $role role in room $room"); $self->app->log->info("User $name (peer id $id) has now the $role role in room $room");
return 1; return 1;
}; };
@ -373,10 +398,19 @@ helper set_peer_role => sub {
helper get_peer_role => sub { helper get_peer_role => sub {
my $self = shift; my $self = shift;
my ($room,$id) = @_; my ($room,$id) = @_;
my $data = $self->get_room_by_name($room);
if (!$data){
return undef;
}
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT `role` FROM `participants` WHERE `peer_id`=? AND `id` IN (SELECT `id` FROM `rooms` WHERE `name`=?)") $self->db->prepare('SELECT `role`
FROM `participants`
WHERE `peer_id`=?
AND `room_id`=?
LIMIT 1')
} || return undef; } || return undef;
$sth->execute($id,$room) || return undef; # TODO: replace with bind_columns
$sth->execute($id,$data->{id}) || return undef;
if ($sth->rows == 1){ if ($sth->rows == 1){
my ($role) = $sth->fetchrow_array(); my ($role) = $sth->fetchrow_array();
return $role; return $role;
@ -390,15 +424,16 @@ helper get_peer_role => sub {
helper promote_peer => sub { helper promote_peer => sub {
my $self = shift; my $self = shift;
my ($room,$id) = @_; my ($room,$id) = @_;
my $data = $self->get_room_by_name($room);
if (!$data){
return undef;
}
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT * FROM `participants` WHERE `peer_id`=? AND `id` IN (SELECT `id` FROM `rooms` WHERE `name`=?)") $self->db->prepare('UPDATE `participants`
SET `role`=\'owner\'
WHERE `peer_id`=? AND `room_id`=?');
} || return undef; } || return undef;
$sth->execute($id,$room) || return undef; $sth->execute($id,$data->{id}) || return undef;
return undef if ($sth->rows != 1);
$sth = eval {
$self->db->prepare("UPDATE `participants` SET `role`='owner' WHERE `peer_id`=? AND `id` IN (SELECT `id` FROM `rooms` WHERE `name`=?)")
} || return undef;
$sth->execute($id,$room) || return undef;
return 1; return 1;
}; };
@ -408,8 +443,15 @@ helper has_joined => sub {
my $self = shift; my $self = shift;
my ($session,$name) = @_; my ($session,$name) = @_;
my $ret = 0; my $ret = 0;
# TODO: replace with a JOIN, and a SELECT COUNT
# + check result with bind_columns + fetch
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT * FROM `rooms` WHERE `name`=? AND `id` IN (SELECT `id` FROM `participants` WHERE `participant`=?)") $self->db->prepare('SELECT `id`
FROM `rooms`
WHERE `name`=?
AND `id` IN (SELECT `room_id`
FROM `participants`
WHERE `participant`=?)')
} || return undef; } || return undef;
$sth->execute($name,$session) || return undef; $sth->execute($name,$session) || return undef;
$ret = 1 if ($sth->rows > 0); $ret = 1 if ($sth->rows > 0);
@ -420,11 +462,12 @@ helper has_joined => sub {
helper delete_participants => sub { helper delete_participants => sub {
my $self = shift; my $self = shift;
$self->app->log->debug('Removing inactive participants from the database'); $self->app->log->debug('Removing inactive participants from the database');
my $timeout = time()-600;
my $sth = eval { my $sth = eval {
$self->db->prepare("DELETE FROM `participants` WHERE (`activity_timestamp` < ? OR `activity_timestamp` IS NULL);") $self->db->prepare('DELETE FROM `participants`
WHERE (`last_activity` < DATE_SUB(CONVERT_TZ(NOW(), @@session.time_zone, \'+00:00\'), INTERVAL 10 MINUTE)
OR `last_activity` IS NULL');
} || return undef; } || return undef;
$sth->execute($timeout) || return undef; $sth->execute || return undef;
return 1; return 1;
}; };
@ -434,7 +477,7 @@ helper delete_rooms => sub {
$self->app->log->debug('Removing unused rooms'); $self->app->log->debug('Removing unused rooms');
my $timeout = time()-$config->{'rooms.inactivity_timeout'}; my $timeout = time()-$config->{'rooms.inactivity_timeout'};
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < ? AND `persistent`='0' AND `owner_password` IS NULL;") $self->db->prepare('SELECT `name` FROM `rooms` WHERE `activity_timestamp` < ? AND `persistent`='0' AND `owner_password` IS NULL')
} || return undef; } || return undef;
$sth->execute($timeout); $sth->execute($timeout);
my @toDeleteName = (); my @toDeleteName = ();

Loading…
Cancel
Save