User Tools

Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

dbagent-cut [2018-08-21 09:48] (current)
Line 1: Line 1:
 +
 +====DB agent code sample====
 +
 +<code perl >
 +
 +#​--------------------
 +#--- CONTROLLER 1 ---
 +#​--------------------
 +
 +package DBagent::​Controller;​
 +
 +use utf8;
 +use strict;
 +use warnings;
 +use Mojo::Base '​Mojolicious::​Controller';​
 +use Mojo::Util qw(md5_sum dumper quote encode url_unescape);​
 +use Mojo::JSON qw(encode_json decode_json false true);
 +use File::​Basename;​
 +use Filesys::​Df;​
 +use File::stat;
 +use POSIX;
 +
 +...
 +
 +sub db_dump {
 +    my $self = shift;
 +
 +    my $name = $self->​req->​param('​name'​);​
 +    my $store = $self->​req->​param('​store'​);​
 +    my $login = $self->​req->​param('​login'​);​
 +    my $password = $self->​req->​param('​password'​);​
 +    my $cb = $self->​req->​param('​cb'​);​
 +    my $job_id = $self->​req->​param('​job_id'​);​
 +    my $magic = $self->​req->​param('​magic'​);​
 +
 +    return $self->​render(json => { success => 0 }) unless $name;
 +
 +    return $self->​render(json => { success => 0 }) unless $store;
 +    return $self->​render(json => { success => 0 }) unless $login;
 +    return $self->​render(json => { success => 0 }) unless $password;
 +
 +    return $self->​render(json => { success => 0 }) unless $cb;
 +    return $self->​render(json => { success => 0 }) unless $job_id;
 +    return $self->​render(json => { success => 0 }) unless $magic;
 +
 +
 +    my $sub = Mojo::​IOLoop::​Subprocess->​new;​
 +
 +    $sub->​run(
 +        sub {
 +            my $sub = shift;
 +            my $app = $self->​app;​
 +            my $dir = $app->​app->​config('​datadir'​);​
 +
 +            $app->​log->​info("​--- The dump begins name=$name job=$job_id"​);​
 +            my $file = $app->​agent->​db_dump($name,​ $dir);
 +
 +            unless ($file) {
 +                $app->​log->​info("​--- The dump unsuccessful name=$name job_id=$job_id"​);​
 +                return undef;
 +            }
 +            $app->​log->​info("​--- The dump is done name=$name job_id=$job_id file=$file"​);​
 +
 +            # ---Upload the dump ---
 +            $app->​log->​info("​--- The upload begins file=$file job_id=$job_id store=$store"​);​
 +
 +            my $store = aStoreI->​new($store,​ $login, $password);
 +            unless ($store->​alive) {
 +                unlink $file;
 +                $app->​log->​info("​--- The upload unsuccessful because store is dead store=$store job_id=$job_id"​);​
 +                return undef;
 +            }
 +            my $res = $store->​data_put($file);​
 +
 +            my $size = stat($file)->​size;​
 +            my $res_size = $res->​{list}->​[0]->​{size} || 0;
 +            my $res_file = $res->​{list}->​[0]->​{size} || '';​
 +
 +            $app->​log->​info("​--- The upload size is $res_size res_file=$res_file job_id=$job_id"​);​
 +
 +            unless ($res_size == $size) {
 +                $app->​log->​info("​--- The upload unsuccessful name=$name job_id=$job_id file=$file"​);​
 +                unlink $file;
 +                $store->​data_delete($file);​
 +                return undef;
 +            }
 +            $app->​log->​info("​--- The upload is done name=$name job_id=$job_id file=$file"​);​
 +            unlink $file;
 +            $name;
 +        },
 +        sub {
 +            my ($sub, $err, @results) = @_;
 +        }
 +    );
 +    $self->​render(json => { success => 1 });
 +}
 +
 +sub db_restore {
 +    my $self = shift;
 +
 +    my $store = $self->​req->​param('​store'​);​
 +    my $login = $self->​req->​param('​login'​);​
 +    my $password = $self->​req->​param('​password'​);​
 +    my $file = $self->​req->​param('​file'​);​
 +    my $new_name = $self->​req->​param('​new_name'​);​
 +
 +    my $sub = Mojo::​IOLoop::​Subprocess->​new;​
 +
 +    $sub->​run(
 +        sub {
 +            my $sub = shift;
 +            my $app = $self->​app;​
 +
 +            my $cb = $self->​req->​param('​cb'​);​
 +            my $job_id = $self->​req->​param('​job_id'​);​
 +            my $magic = $self->​req->​param('​magic'​);​
 +
 +            return $self->​render(json => { success => 0 }) unless $store;
 +            return $self->​render(json => { success => 0 }) unless $login;
 +            return $self->​render(json => { success => 0 }) unless $password;
 +            return $self->​render(json => { success => 0 }) unless $file;
 +            return $self->​render(json => { success => 0 }) unless $new_name;
 +
 +            return $self->​render(json => { success => 0 }) unless $cb;
 +            return $self->​render(json => { success => 0 }) unless $job_id;
 +            return $self->​render(json => { success => 0 }) unless $magic;
 +
 +            $self->​app->​log->​info("​---The download begins file=$file job=$job_id"​);​
 +
 +            my $st = aStoreI->​new($store,​ $login, $password);
 +            unless ($st->​alive) {
 +                $self->​app->​log->​info("​---The download unsuccessful because store is dead store=$store job_id=$job_id"​);​
 +                return undef;
 +            }
 +
 +            my $res = $st->​data_get($file,​ $app->​config('​datadir'​));​
 +            $app->​log->​info("​---The download done store=$store job_id=$job_id file=$res"​);​
 +
 +            $app->​log->​info("​---The restore begins job_id=$job_id new_name=$new_name file=$res"​);​
 +            my $restore = $app->​agent->​db_restore($res,​ $new_name);
 +            $app->​log->​info("​---The restore done job_id=$job_id new_name=$new_name file=$res"​);​
 +
 +        },
 +        sub {
 +            my ($sub, $err, @results) = @_;
 +        }
 +    );
 +    $self->​render(json => { success => 1 });
 +}
 +
 +1;
 +</​code>​
 +----
 +[<>]