73 lines
1.5 KiB
Perl
73 lines
1.5 KiB
Perl
package CW::Migration;
|
|
|
|
use Moo;
|
|
use feature qw(state say);
|
|
use File::Find;
|
|
|
|
has dbh => (
|
|
is => 'ro',
|
|
required => 1
|
|
);
|
|
|
|
sub migrate {
|
|
my ($self) = @_;
|
|
|
|
return $self->_perform_migrations(pop)
|
|
if !ref($self) && $self eq __PACKAGE__;
|
|
|
|
$self->dbh->do(<<'SQL');
|
|
CREATE TABLE IF NOT EXISTS migrations (
|
|
id VARCHAR(4),
|
|
migration_sql TEXT NOT NULL,
|
|
PRIMARY KEY (id)
|
|
);
|
|
SQL
|
|
|
|
my $id = $self->id;
|
|
my $already_migrated = $self->already_migrated;
|
|
|
|
if ($already_migrated) {
|
|
say "[Migration] $id already migrated";
|
|
return;
|
|
}
|
|
|
|
$self->dbh->do( $self->sql );
|
|
$self->dbh->do( "INSERT INTO migrations (id, migration_sql) VALUES (?, ?)",
|
|
undef, $id, $self->sql );
|
|
say "[Migration] $id migrated successfully";
|
|
}
|
|
|
|
sub already_migrated {
|
|
my ($self) = @_;
|
|
|
|
my ($exists_check) =
|
|
$self->dbh->selectrow_array(
|
|
"SELECT 1 FROM migrations WHERE id = ? LIMIT 1",
|
|
undef, $self->id );
|
|
|
|
return $exists_check;
|
|
}
|
|
|
|
# static
|
|
|
|
sub _perform_migrations {
|
|
my ( $class, $dbh ) = @_;
|
|
|
|
find(
|
|
{
|
|
wanted => sub {
|
|
return unless /\.pm$/;
|
|
my @parts = split( /\/+/, $File::Find::name );
|
|
my $file = $parts[-1];
|
|
my $class = "CW::Migration::" . ( $file =~ s/\.pm$//r );
|
|
eval "use $class";
|
|
my $migration = $class->new( dbh => $dbh );
|
|
$migration->migrate;
|
|
}
|
|
},
|
|
'lib/CW/Migration'
|
|
);
|
|
}
|
|
|
|
1;
|