summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2024-05-24 21:39:09 +0200
committerBirte Kristina Friesel <derf@finalrewind.org>2024-05-24 21:39:09 +0200
commit5a2285bd59d0301a1f3ec8b429228f7b201caf57 (patch)
tree918b1eab5d7d5ab5853a0e179fb556c5d27cc00e
parentf7a9213961f02637b83b56ff0c7d72b16daa427d (diff)
check train/trip id when updating associated data
this avoid race conditions when a user changes their checkin between the time of request (old trip id) and the time of data update (new trip id). These could lead to funny effects such as buses suddenly having S-Bahn carriage formations.
-rwxr-xr-xlib/Travelynx.pm43
-rw-r--r--lib/Travelynx/Model/InTransit.pm48
2 files changed, 57 insertions, 34 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 85eed6d..902241d 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -1241,7 +1241,8 @@ sub startup {
return;
}
- my $route = $in_transit->{route};
+ my $route = $in_transit->{route};
+ my $train_id = $in_transit->{train_id};
# TODO get_tripid_p is only needed on the first call, afterwards the tripid is known.
$self->hafas->get_tripid_p( train => $train )->then(
@@ -1249,9 +1250,10 @@ sub startup {
my ($trip_id) = @_;
$self->in_transit->update_data(
- uid => $uid,
- db => $db,
- data => { trip_id => $trip_id }
+ uid => $uid,
+ db => $db,
+ data => { trip_id => $trip_id },
+ train_id => $train_id,
);
return $self->hafas->get_route_p(
@@ -1340,6 +1342,7 @@ sub startup {
$train->qos_messages
],
him_messages => \@messages,
+ train_id => $train_id,
);
if ($polyline) {
@@ -1348,6 +1351,7 @@ sub startup {
db => $db,
polyline => $polyline,
old_id => $in_transit->{polyline_id},
+ train_id => $train_id,
);
}
@@ -1421,14 +1425,16 @@ sub startup {
}
}
$self->in_transit->update_data(
- uid => $uid,
- db => $db,
- data => $data
+ uid => $uid,
+ db => $db,
+ data => $data,
+ train_id => $train_id,
);
$self->in_transit->update_user_data(
uid => $uid,
db => $db,
- user_data => $user_data
+ user_data => $user_data,
+ train_id => $train_id,
);
}
elsif ( not $is_departure
@@ -1436,9 +1442,10 @@ sub startup {
{
$data->{wagonorder_arr} = $wagonorder;
$self->in_transit->update_data(
- uid => $uid,
- db => $db,
- data => $data
+ uid => $uid,
+ db => $db,
+ data => $data,
+ train_id => $train_id,
);
}
return;
@@ -1458,9 +1465,10 @@ sub startup {
my $data = { stationinfo_dep => $station_info };
$self->in_transit->update_data(
- uid => $uid,
- db => $db,
- data => $data
+ uid => $uid,
+ db => $db,
+ data => $data,
+ train_id => $train_id,
);
return;
}
@@ -1479,9 +1487,10 @@ sub startup {
my $data = { stationinfo_arr => $station_info };
$self->in_transit->update_data(
- uid => $uid,
- db => $db,
- data => $data
+ uid => $uid,
+ db => $db,
+ data => $data,
+ train_id => $train_id,
);
return;
}
diff --git a/lib/Travelynx/Model/InTransit.pm b/lib/Travelynx/Model/InTransit.pm
index d825826..0d548c3 100644
--- a/lib/Travelynx/Model/InTransit.pm
+++ b/lib/Travelynx/Model/InTransit.pm
@@ -577,7 +577,8 @@ sub set_polyline {
$self->set_polyline_id(
uid => $uid,
db => $db,
- polyline_id => $polyline_id
+ polyline_id => $polyline_id,
+ train_id => $opt{train_id},
);
}
@@ -590,11 +591,13 @@ sub set_polyline_id {
my $db = $opt{db} // $self->{pg}->db;
my $polyline_id = $opt{polyline_id};
- $db->update(
- 'in_transit',
- { polyline_id => $polyline_id },
- { user_id => $uid }
- );
+ my %where = ( user_id => $uid );
+
+ if ( $opt{train_id} ) {
+ $where{train_id} = $opt{train_id};
+ }
+
+ $db->update( 'in_transit', { polyline_id => $polyline_id }, \%where );
}
sub set_route_data {
@@ -607,6 +610,12 @@ sub set_route_data {
my $qos_msg = $opt{qos_messages};
my $him_msg = $opt{him_messages};
+ my %where = ( user_id => $uid );
+
+ if ( $opt{train_id} ) {
+ $where{train_id} = $opt{train_id};
+ }
+
my $res_h = $db->select( 'in_transit', ['data'], { user_id => $uid } )
->expand->hash;
@@ -623,7 +632,7 @@ sub set_route_data {
route => JSON->new->encode($route),
data => JSON->new->encode($data)
},
- { user_id => $uid }
+ \%where
);
}
@@ -850,6 +859,12 @@ sub update_data {
my $db = $opt{db} // $self->{pg}->db;
my $new_data = $opt{data} // {};
+ my %where = ( user_id => $uid );
+
+ if ( $opt{train_id} ) {
+ $where{train_id} = $opt{train_id};
+ }
+
my $res_h = $db->select( 'in_transit', ['data'], { user_id => $uid } )
->expand->hash;
@@ -859,11 +874,7 @@ sub update_data {
$data->{$k} = $v;
}
- $db->update(
- 'in_transit',
- { data => JSON->new->encode($data) },
- { user_id => $uid }
- );
+ $db->update( 'in_transit', { data => JSON->new->encode($data) }, \%where );
}
sub update_user_data {
@@ -873,6 +884,12 @@ sub update_user_data {
my $db = $opt{db} // $self->{pg}->db;
my $new_data = $opt{user_data} // {};
+ my %where = ( user_id => $uid );
+
+ if ( $opt{train_id} ) {
+ $where{train_id} = $opt{train_id};
+ }
+
my $res_h = $db->select( 'in_transit', ['user_data'], { user_id => $uid } )
->expand->hash;
@@ -882,11 +899,8 @@ sub update_user_data {
$data->{$k} = $v;
}
- $db->update(
- 'in_transit',
- { user_data => JSON->new->encode($data) },
- { user_id => $uid }
- );
+ $db->update( 'in_transit',
+ { user_data => JSON->new->encode($data) }, \%where );
}
sub update_visibility {