shlist

share and manage lists between multiple people
Log | Files | Refs

commit 9935a10111d138217f154cd0f207662437cadaac
parent 7a039fb7e4d0becfecce7721dc03d65262c9bba5
Author: Kyle Milz <kyle@0x30.net>
Date:   Tue, 23 Feb 2016 22:14:24 -0700

server: move message handling to its own function

Diffstat:
Mserver/sl | 101+++++++++++++++++++++++++++++++++++++++++--------------------------------------
1 file changed, 52 insertions(+), 49 deletions(-)

diff --git a/server/sl b/server/sl @@ -92,67 +92,70 @@ while (my $client_socket = $server_socket->accept()) { my $db = database->new($db_file); $db->prepare_stmt_handles(); - while (1) { - # Database errors and socket connect errors both modify this - # value. Make sure it's reset - undef $@; - - # Wait for an entire message to be received - my ($ver, $msg_type, $request) = recv_msg($client_socket); - - $db->{dbh}->begin_work; - - # Every message type except 'device_add' needs to include - # 'device_id' in the request. Check that here. - my $device = undef; - if ($msg_type != $msg_num{device_add}) { - (my $err, $device) = get_device($db, $request->{device_id}); - - if ($err) { - send_msg($client_socket, $ver, $msg_type, make_error($err)); - $db->{dbh}->commit; - next; - } - } + handle_message($client_socket, $db) while (1); +} + +sub handle_message { + my ($client_socket, $db) = @_; - # Call appropriate message handler. Each handler returns both - # data that should be sent back over the main socket and - # notification data that gets sent over vendor specific API. - my ($response, $notify) = $msg_func[$msg_type]->($db, $request->{data}, $device); + # Make sure this gets reset + undef $@; - $db->{dbh}->commit; - if ($@) { - $log->print("db transaction aborted: $@\n"); + # Wait for an entire message to be received + my ($ver, $msg_type, $request) = recv_msg($client_socket); - # now rollback to undo the incomplete changes - # but do it in an eval{} as it may also fail - eval { $db->{dbh}->rollback }; + $db->{dbh}->begin_work; - $response->{status} = 'err'; - $response->{reason} = 'database transaction aborted'; + # Every message type except 'device_add' needs to include 'device_id' in + # the request. Check that here. + my $device = undef; + if ($msg_type != $msg_num{device_add}) { + (my $err, $device) = get_device($db, $request->{device_id}); - send_msg($client_socket, $ver, $msg_type, $response); - next; + if ($err) { + send_msg($client_socket, $ver, $msg_type, make_error($err)); + $db->{dbh}->commit; + return; } + } - # Respond to client over the main socket - send_msg($client_socket, $ver, $msg_type, $response); + # Call appropriate message handler. Each handler returns both data that + # should be sent back over the main socket and notification data that + # gets sent over vendor specific API. + my ($response, $notify) = $msg_func[$msg_type]->($db, $request->{data}, $device); - # Some messages don't send notifications - next if (! defined $notify); + $db->{dbh}->commit; + if ($@) { + $log->print("db transaction aborted: $@\n"); - # Don't send notifications when there was en error - next if ($response->{status} eq 'err'); + # now rollback to undo the incomplete changes but do it in an + # eval{} as it may also fail + eval { $db->{dbh}->rollback }; - # Encode the notification message and find its size - my $msg = encode_json($notify); - my $msg_len = length($msg); + $response->{status} = 'err'; + $response->{reason} = 'database transaction aborted'; - # Send to notification daemons - send_unix("../apnd.socket", $msg, $msg_len) unless ($args{t}); - send_unix("../gcmd.socket", $msg, $msg_len) unless ($args{t}); - send_unix("../testd.socket", $msg, $msg_len) if ($args{t}); + send_msg($client_socket, $ver, $msg_type, $response); + return; } + + # Respond to client over the main socket + send_msg($client_socket, $ver, $msg_type, $response); + + # Some messages don't send notifications + return if (! defined $notify); + + # Don't send notifications when there was en error + return if ($response->{status} eq 'err'); + + # Encode the notification message and find its size + my $msg = encode_json($notify); + my $msg_len = length($msg); + + # Send to notification daemons + send_unix("../apnd.socket", $msg, $msg_len) unless ($args{t}); + send_unix("../gcmd.socket", $msg, $msg_len) unless ($args{t}); + send_unix("../testd.socket", $msg, $msg_len) if ($args{t}); } # Takes a request and verifies device_id is present and valid