Files
compiled.world/lib/CW/Migration.pm
2026-08-15 23:05:57 -06:00

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;