The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# My::Builder
#  A local Module::Build subclass for building the database
#
# $Id: Builder.pm 8633 2009-08-18 16:00:58Z FREQUENCY@cpan.org $

package My::Builder;

use strict;
use warnings;

use base 'Module::Build';

use Cwd ();
use File::Spec ();
use Carp ();

use DBI ();
use DBD::SQLite ();

my $ORIG_DIR = Cwd::cwd();

# These are utility commands for getting into and out of our build directory
sub _chdir_or_die {
  my $dir = File::Spec->catfile(@_);
  chdir $dir or Carp::croak("Failed to chdir to $dir: $!");
}
sub _chdir_back {
  chdir $ORIG_DIR or Carp::croak("Failed to chdir to $ORIG_DIR: $!");
}

sub ACTION_code {
  my ($self) = @_;

  _chdir_or_die('lib', 'Video', 'FourCC');

  unless (-f 'codecs.dat') {
    print "Opening database source file\n";
    open(my $fh, '<', 'source-data.sql') or die("Failed: $!\n");

    my $dbh = DBI->connect(
      'dbi:SQLite:dbname=codecs.dat',
      'notused', # cannot be null, or DBI complains
      'notused',
      {
        RaiseError => 1,
        PrintError => 0,
      }
    );

    # Use a transaction for faster insertion
    $dbh->begin_work;

    print "Creating database structure\n";
    $dbh->do(q{
      CREATE TABLE fourcc
      (
        fourcc char(4) NOT NULL,
        "owner" varchar(100),
        registered date,
        description varchar(200) NOT NULL, 
        CONSTRAINT fourcc_pkey PRIMARY KEY (fourcc)
      );
      CREATE UNIQUE INDEX idx_fourcc ON fourcc (fourcc);
    });

    # This slurps the entire source file into memory -- this is less than
    # efficient, but builds don't take long and ~60KB isn't bad.
    print "Inserting database data\n";
    while (<$fh>) {
      chomp $_;
      $dbh->do($_);
    }
    $dbh->commit;

    # Vacuum the resulting database
    print "Optimizing database\n";
    $dbh->do('VACUUM fourcc');

    print "Writing database\n";
    $dbh->disconnect;
  }

  _chdir_back();

  return $self->SUPER::ACTION_code;
}

sub ACTION_clean {
  my ($self) = @_;

  my $rc = $self->SUPER::ACTION_clean;
  _chdir_or_die('lib', 'Video', 'FourCC');

  if (-f 'codecs.dat') {
    print "Deleting generated database\n";
    unlink('codecs.dat') or die "Failed: $!\n";
  }

  _chdir_back();


  return $rc;
}

1;