JSAN::Indexer::Creator - Convert the YAML Index to SQLite


JSAN documentation Contained in the JSAN distribution.

Index


Code Index:

NAME

Top

JSAN::Indexer::Creator -- Convert the YAML Index to SQLite

AUTHOR

Top

Casey West <casey@geeknest.com>.

COPYRIGHT

Top


JSAN documentation Contained in the JSAN distribution.

package JSAN::Indexer::Creator;
use strict;
use warnings;

use base 'Class::DBI';
use Class::DBI::DATA::Schema translate => [ 'MySQL', 'SQLite' ];
use LWP::Simple;
use YAML;

our $VERSION      = '0.05';
our $MASTER_INDEX = 'http://openjsan.org/index.yaml';

sub create_index_db {
    my ($class, $index, $dsn, $index_db, $location) = @_;
    if ($JSAN::Indexer::LOADER) {
        $_->db_Main->disconnect for $JSAN::Indexer::LOADER->classes;
    }
    unlink $index_db;
    $class->connection($dsn);
    $location ||= $MASTER_INDEX;

    my $yaml = get($location);
    die "Could not load YAML Index from $location" unless $yaml;
    
    my $yaml_index = Load($yaml);
    die "Couldn't parse YAML stream" unless $yaml_index;

    $class->run_data_sql;
    do {
        local $^W;
        $index = $index->new();
    };
    $class->_insert_data($index->loader, $yaml_index);
}

sub _insert_data {
    my ($self, $loader, $yaml) = @_;

    foreach my $login ( keys %{$yaml->{authors}} ) {
        my $author = $yaml->{authors}->{$login};
        $loader->find_class('author')->create({
            login => $login,
            doc   => $author->{doc},
            email => $author->{email},
            url   => $author->{url},
            name  => $author->{name},
        });
    }
    
    foreach my $name ( keys %{$yaml->{distributions}} ) {
        my $distribution = $yaml->{distributions}->{$name};
        my $dist = $loader->find_class('distribution')->create({
            name   => $name,
            doc    => $distribution->{doc},
        });
        my $releases = $distribution->{releases};
        
        foreach my $rel ( @{$releases} ) {
            $loader->find_class('release')->create({
                distribution => $dist->name,
                author       => $rel->{author},
                checksum     => $rel->{checksum},
                created      => $rel->{created},
                doc          => $rel->{doc},
                meta         => Dump($rel->{meta}),
                latest       => $rel->{latest},
                source       => $rel->{source},
                version      => $rel->{version},
                srcdir       => $rel->{srcdir},
            });
        }
    }
    
    foreach my $name ( keys %{$yaml->{libraries}} ) {
        my $library = $yaml->{libraries}->{$name};
        $loader->find_class('library')->create({
            name         => $name,
            version      => $library->{version},
            doc          => $library->{doc},
            distribution => $library->{distribution_name},
            release      => $loader->find_class('release')->search(
                distribution => $library->{distribution_name},
                version      => $library->{distribution_version},
            )->first->id,
        });
    }
}

1;

__DATA__

DROP TABLE IF EXISTS author;
CREATE TABLE author (
    login    varchar(100) not null primary key,
    name     varchar(100) not null,
    doc      varchar(100) not null,
    email    varchar(100) not null,
    url      varchar(100)
);

DROP TABLE IF EXISTS distribution;
CREATE TABLE distribution (
    name     varchar(100) not null primary key,
    doc      varchar(100) not null
);

DROP TABLE IF EXISTS release;
CREATE TABLE release (
    id           int not null auto_increment primary key,
    distribution varchar(100) not null references distribution,
    author       varchar(100) not null references author,
    checksum     varchar(100) not null,
    created      varchar(100) not null,
    doc          varchar(100) not null,
    meta         text,
    latest       int not null,
    source       varchar(100) not null,
    srcdir       varchar(100) not null,
    version      varchar(100)
);

DROP TABLE IF EXISTS library;
CREATE TABLE library (
    name         varchar(100) not null primary key,
    distribution varchar(100) not null references distribution,
    release      int not null references release,
    version      varchar(100),
    doc          varchar(100) not null
);