After writing a Mojolicious application 
<https://github.com/mimosinnet/lecturers-management> in Mojo::SQLite, some 
transactions doesn't seem to be immediately committed to the database. I 
wonder if this is related to SQLite Write-Ahead Logging 
<http://sqlite.org/wal.html> or how I have defined Mojo::SQLite (I am 
afraid it is the latter  :(  ). This is the logic I have followed:

--> As some modules need to access the database, I have defined a module 
that loads the database 
<https://github.com/mimosinnet/lecturers-management/blob/master/lib/GestioMaster/Obj/DB.pm>
:

*package GestioMaster::Obj::DB;*
use Mojo::Base -base;

use Mojo::SQLite;
use GestioMaster::Model::DB;

has sqlite => sub { Mojo::SQLite->new('sqlite:db/master.db') };

has model  => sub {
my $self = shift;
return GestioMaster::Model::DB->new( sqlite =>  $self->sqlite );
};

--> This module is used when loading the application 
<https://github.com/mimosinnet/lecturers-management/blob/master/lib/GestioMaster.pm>
:

package GestioMaster;
use Mojo::Base 'Mojolicious';
*use GestioMaster::Obj::DB;*

sub startup {
  my $self = shift;
  my $config = $self->plugin('Config');
  $self->helper( model => sub { 
state $model = GestioMaster::Obj::DB->new->model;
   });
...

--> Accessing the database is defined in the Model 
<https://github.com/mimosinnet/lecturers-management/blob/master/lib/GestioMaster/Model/DB.pm>
: 

package GestioMaster::Model::DB;
use Mojo::Base -base;
has 'sqlite';
...
sub un_modul {
my ($self, $modul) = @_;
return $self->sqlite->db->select('moduls',undef,{ modul => $modul})->hash;
}
...

--> The same module is also used to define registers from the database 
<https://github.com/mimosinnet/lecturers-management/blob/master/lib/GestioMaster/Obj/Modul.pm>
:

package *GestioMaster::Obj::Modul*;
use Mojo::Base -base;
# Object that makes database available
*use GestioMaster::Obj::DB;*

has _model => sub { GestioMaster::Obj::DB->new->model  };
has modul => "";

has un_modul => sub { 
my $self = shift;
return $self->_model->un_modul( $self->modul );
};

has ident => sub { shift->un_modul->{'ident'} };
has coord => sub { shift->un_modul->{'coord'} };
has nom_modul => sub { shift->un_modul->{'nom_modul'}; };
...


--> This builds an array-ref of registers 
<https://github.com/mimosinnet/lecturers-management/blob/master/lib/GestioMaster/Controller/Moduls/Modul.pm>
:

package GestioMaster::Controller::Moduls::Modul;
use Mojo::Base -base;
use *GestioMaster::Obj::Modul*;

has moduls => sub {
my $self = shift;
my @moduls = qw/M1 M2a M2b M3a M3b M3d M3e M4 M5a M5b M5c M5d M6/;
my $mod_obj = [];
foreach my $mod ( @moduls  ) {
push @{$mod_obj}, *GestioMaster::Obj::Modul*->new( modul => $mod );
}
return $mod_obj;
};

d) Used in the controller 
<https://github.com/mimosinnet/lecturers-management/blob/master/lib/GestioMaster/Controller/Public.pm>
:

package GestioMaster::Controller::Public;
use GestioMaster::Controller::Moduls::Modul;
state $moduls = GestioMaster::Controller::Moduls::Modul->new->moduls;

sub inici  { shift->render( moduls => $moduls ) }


e) That promised straightforward templates 
<https://github.com/mimosinnet/lecturers-management/blob/master/templates/public/inici.html.ep>
: 

% foreach my $mod ( @{ $moduls } ) {
<li><a href="<%= '/pub/modul/' . $mod->modul %>"><%= $mod->modul . ": " . 
$mod->nom_modul %></a></li>
% }


So far so good, till the application started to write to the database and 
noticed some transactions were not immediately committed :O


My questions:

a) Opening the database in two different modules has an effect on how 
transactions are committed?
b) Could this be solved by "Application-Initiated Checkpoints 
<http://sqlite.org/wal.html#application_initiated_checkpoints>"?
c) If the application has to be rewritten, how can the database defined 
in package *GestioMaster* be accessed from *GestioMaster::Obj::Modul*?

Thanks! 

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to