KiokuDB::Tutorial::JA(3)

NAME
(XX)

KiokuDB::Tutorial - KiokuDBXXXXX

Install
(XXXXXX)

KiokuDBXXXXXXXXXXXXXXXXXXXXXXTask::KiokuDBXXXXXXXXXXXXXXXXXX

KiokuDBXMooseXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX

KiokuDBXXXXXXXXXXXXXXXXXXXXX DBIXXXXXXXXXXXXXXXDBDXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXKiokuDB::Backend::HashXXXXXXXXXXXXXXXXX XXXXXXXXXXKiokuDB::Backend::DBDXKiokuDB::Backend::DBIXXXXXXXXXXXXXXXX

KiokuDB::Backend::DBDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

CREATING A DIRECTORY
(XXXXXXXXX)

KiokuDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    my $dir = KiokuDB->new(
        backend => KiokuDB::Backend::Hash->new
    );

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXDSNXXXXXXXXXXXXXX

    KiokuDB->connect("hash");

    KiokuDB->connect("dbi:SQLite:dbname=foo", create => 1);

    KiokuDB->connect("bdb:dir=foo", create => 1);

XXXXXXXXXXXX

    KiokuDB->connect("/path/to/my_db.yml");
    KiokuDB->connect("/path/to/dir");

XXXXXXXXXXXXXXXX:

    backend:
      class: KiokuDB::Backend::DBI
      dsn: dbi:SQLite:dbname=/tmp/test.db
      create: 1

USING THE DBI BACKEND
(DBIXXXXXXXXX)

2XXXXXXXXXXXXXXXXXDBIXXXXXXXXXXXX 1XXXXXXXDBIXXXXXXXXXXXX - XXXXXXXXXXXXXXXXXXX XXXXXXXXXXX2XXXXXXXXXXXXXXXXXXXXXXXXXXX KiokuDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXX$dirXXXXXXXXXXXXXX:

    my $dir = KiokuDB->connect(
        "dbi:SQLite:dbname=kiokudb_tutorial.db",
        create => 1,
    );

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    my $dir = KiokuDB->connect(
        $dsn,
        user     => $user,
        password => $password,
    );

INSERTING OBJECTS
(XXXXXXXXXXXX)

MooseXXXXXXXXXXXXXXXXXXXX:

    package Person;
    use Moose;

    has name => (
        isa => "Str",
        is  => "rw",
    );

XXXXXXXXXXXXX:

    my $obj = Person->new( name => "Homer Simpson" );

XXXXXXXXXXXXXXXXXXXXXXXX:

    my $scope = $dir->new_scope;

    my $homer_id = $dir->store($obj);

XXXXKiokuDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1XXXXXXXXXXXXXXXXXKiokuDBXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXMooseXXXXXXXXXXX

2XXXXXXXXXXXXXXXXXXXXXXXXXXXXIDXXXXXX XXXXXXXIDXXXXXXXXXKiokuDBXXXXXUUIDXXXXXXXX IDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXIDXXXXXXXXXXXXXXXXXXXXXX:

    $dir->store( homer => $obj );

XXXX$objXIDX"homer"XXXXXXIDXXXXXXXXUUIDXXXXXXXXXXX

3XXXXXXXXKiokuDBXXXscopeXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXweakXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX

LOADING OBJECTS
(XXXXXXXXXXX)

XXXXXXXXXXHomerXXXXXXX"store"XXXXIDXXXXXXXX

    my $homer = $dir->lookup($homer_id);

$scopeX$objXXXXXXXXXXXXXXX$homerX$objXXXXXXXXXXXXXXXXXXX

    refaddr($homer) == refaddr($obj)

XXXXXXXXXXXXXXX (KiokuDB::LiveObjects)XXXXXXXXX "XX"XXXXXXKiokuDBXXXXXXXXXXXX

$objX$scopeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    my $scope = $dir->new_scope;

    my $homer = $dir->lookup($homer_id);

XXXXXXXHomerXXXXXXXXXXXXXXXXXXXXXXXX PerlXXXXXXXXXXXXXXXXXX KiokuDBXXXXXXXXXXXXXXXXXXXXXX

WHAT WAS STORED
(XXXXXXXX)

XXXXXXXXXXXXXXXXXXXSQLXXXXXXXXXXXXXXXXXX:

    % sqlite3 kiokudb_tutorial.db
    SQLite version 3.4.0
    Enter ".help" for instructions
    sqlite>

XXXXXXXXXXXXX2XXXXXXXXXXXX"entries"X"gin_index"XX:

    sqlite> .tables
    entries    gin_index

"gin_index"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

"entries"XXXXXXXX:

    sqlite> .schema entries
    CREATE TABLE entries (
      id varchar NOT NULL,
      data blob NOT NULL,
      class varchar,
      root boolean NOT NULL,
      tied char(1),
      PRIMARY KEY (id)
    );

XXXXXXXX"id"X"data"XXXKiokuDBXXXXXXXXXXXXXXXXIDXXXX XXXXXXXXBLOBXXXXXXXXXXXXXXX

DBIXXXXXXXXXXXXXXXXXXXXXKiokuDB::Serializer::JSONXXXXX XXXXXXXXXXXXXXXX

XXXX"sqlite"XXXXXXX"line"XXXXXXXXXXXXXXXXXXXXXXXXXXX:

    sqlite> .mode line

XXXXXXXXXXXXXXX:

    sqlite> select id, data from entries;
       id = 201C5B55-E759-492F-8F20-A529C7C02C8B
     data = {"__CLASS__":"Person","data":{"name":"Homer Simpson"},"id":"201C5B55-E759-492F-8F20-A529C7C02C8B","root":true}

XXXXXXX"name"XXXblobXX"data"XXXXXXXXXXXXXXXXXXXXXXXXX

"data"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

KiokuDB::Backend::DBDXXXXXXXXXXXXXXXXXXXXXXXXXXX"id"XX"data"XXXXXXXXXXX

OBJECT RELATIONSHIPS
(XXXXXXXXXXXXXXXX)

"Person"XXXX"name"XXXXXXXXXXXXXXXXXXXXXXX:

    package Person;

    has spouse => (
        isa => "Person",
        is  => "rw",
        weak_ref => 1,
    );

"spouse"XXXXXPersonXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXX:

    my $marge_id = $dir->store(
        Person->new( name => "Marge Simpson" ),
    );

XXXXXXXXXXXXXXXXXXXXXXX2XXXXXXXXXXXXX:

    {
        my $scope = $dir->new_scope;

        my ( $marge, $homer ) = $dir->lookup( $marge_id, $homer_id );

        $marge->spouse($homer);
        $homer->spouse($marge);

        $dir->store( $marge, $homer );
    }

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX

"spouse"XX"weak_ref"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXLinkDBX"spouse"XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXIDXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXX:

    {
        my $scope = $dir->new_scope;

        my $homer = $dir->lookup($homer_id);

        print $homer->spouse->name; # Marge Simpson
    }

    {
        my $scope = $dir->new_scope;

        my $marge = $dir->lookup($marge_id);

        print $marge->spouse->name; # Homer Simpson

        refaddr($marge) == refaddr($marge->spouse->spouse); # true
    }

KiokuDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX"spouse"XXXXXXXXXXXX(IDX) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  The purpose of "new_scope"
("new_scope"XXX)

"new_scope"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXX"lookup"XX$homerXXXXXXXXXXX "spouse"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXweakXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX

XXXXXXXXXXX:

    {
        my $scope = $dir->new_scope;

        # do all KiokuDB work in here
    }

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

WebXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

REFERENCES IN THE DATABASE
(XXXXXXXXXXXXXX)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    sqlite> select id, data from entries;
       id = 201C5B55-E759-492F-8F20-A529C7C02C8B
     data = {"__CLASS__":"Person","data":{"name":"Homer Simpson","spouse":{"$ref":"05A8D61C-6139-4F51-A748-101010CC8B02.data"}},"id":"201C5B55-E759-492F-8F20-A529C7C02C8B","root":true}

       id = 05A8D61C-6139-4F51-A748-101010CC8B02
     data = {"__CLASS__":"Person","data":{"name":"Marge Simpson","spouse":{"$ref":"201C5B55-E759-492F-8F20-A529C7C02C8B.data"}},"id":"05A8D61C-6139-4F51-A748-101010CC8B02","root":true}

"spouse"XXXXXXJSONXXXXXXXXXXXXXXXXXXXX XXXXXXXXX$refXXXXXXXXXXXXXXXXXXUUIDXXXXXX

XXXXXXXXXXXXKiokuDBXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX"JPSON"X JavaScript Persistent Object notation(<http://www.jpson.org>)XXXXXXXXX KiokuDB::Backend::StorableXXXXXKiokuDB::EntryXKiokuDB::ReferenceXXXXXXXX XXXXXstorableXXXXXXXXXXXXXXX

OBJECT SETS
(XXXXXXXXX)

XXXXXXXXXXXXXX(1X1XXXXX)XXSet::ObjectXXXXXXXXXXXXXXXX

"Person"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    package Person;

    has children => (
        does => "KiokuDB::Set",
        is   => "rw",
    );

KiokuDB::SetXXXXXXXXSet::ObjectXKiokuDBXXXXXXXXX

    my @kids = map { Person->new( name => $_ ) } qw(maggie lisa bart);

    use KiokuDB::Util qw(set);

    my $set = set(@kids);

    $homer->children($set);

    $dir->store($homer);

"set"XXXXXXXXXXXXKiokuDB::Set::TransientXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXX

"weak_set"XXXXXXXXXXXXXX XXXX(XXXXXXXX"parent"XXXXXXX)XXXXXXXXXXXXXXXXX Set::Object::WeakXXXXXXXXXXXXXX

XXXXXXXXXXXXSet::ObjectXXXXXXXXXXXXXXXXX

    my @kids = $dir->lookup($homer_id)->children->members;

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @kidsXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXKiokuDB::Set::DefferedXKiokuDB::Set::LoadedXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

THE TYPEMAP
KiokuDBXXXXXXXXXXXXXXXXKiokuDB::CollapserXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXKiokuDB::EntryXX "XXX"XXXXXXXXXXXXXXX

collapserXXXKiokuDB::TypeMapXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXtypemapXXXXXXX

typemapXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX(XXXX"DBI"XXXXXXXXXXXXX XSXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXMooseXXXXXXXXXXXXXMooseXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXX(DateTime, Path::ClassXX>)XX XXXXXXtypemapXXXXXXXXXKiokuDBXXXXXXXXXtypemapXXXXXXX XXXXXXXXXXXXXX

XXXXXXXKiokuDBXClass::AccessorXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXX:

    my $dir = KiokuDB->new(
        backend => $backend,
        typemap => KiokuDB::TypeMap->new(
            entries => {
                "My::Object" => KiokuDB::TypeMap::Entry::Naive->new,
            },
        ),
    );

KiokuDB::TypeMap::Entry::NaiveXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX

collapser XXXXXXXXXXXXXXXKiokuDB::TypeMap::ResolverXX XXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXX"ref $object"XXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXtypemapXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX"isa_entries"XXXXXXXXXX

    KiokuDB::TypeMap->new(
        isa_entries => {
            "My::Object" => KiokuDB::TypeMap::Entry::Naive->new,
        },
    );

XXXXXXXXXX("ref" keyed)XXXXXXXXXXXXXXX isaXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  Typemap Entries
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX

    KiokuDB::TypeMap::Entry::Callback->new(
        collapse => sub {
            my $object = shift;

            ...

            return @some_args;
        },
        expand => sub {
            my ( $class, @some_args ) = @_;

            ...

            return $object;
        },
    );

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXtypemapXISAXXXXXPath::ClassX:

    'Path::Class::Entity' => KiokuDB::TypeMap::Entry::Callback->new(
        intrinsic => 1,
        collapse  => "stringify",
        expand    => "new",
    );

"intrinsic"XXXXXXXXXXXXXXXXX

typemapXXXXXXXXXXXXXKiokuDB::Typemap::Entry::PassthroughXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXX

XXXXXXXXXXXXXXStorableXXXXXX(XXXXXXXXXXXXXXXXXXXXXX)X XXXXXXXXXKiokuDB::Backend::Serialize::StorableXXXXXXXX DateTimeXXXXXXstorableXXXXXXXXXX:

    'DateTime' => KiokuDB::Backend::Entry::Passthrough->new( intrinsic => 1 )

  Intrinsic vs. First Class
KiokuDBXXXXXXXXXXXXXXXXXXIDXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXDateTimeXXPath::ClassXXXXXURIXXXXXXXXXXXXXX XXXXXXXX

KiokuDBXintrinsiclyXXXXXXXXXXXXXXX XXXXXXXXXXXXXXIDXXXXKiokuDB::EntryXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXX2XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXX:

    use Path::Class;

    my $path = file(qw(path to foo));

    $obj_1->file($path);

    $obj_2->file($path);

    $dir->store( $obj_1, $obj_2 );

XXXXXXXXXXXXXXXXXXXXXXXXX $obj_1X$obj_2XXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    refaddr($obj_1->file) == refaddr($obj_2->file)

$obj_1X$obj_2XXXX$pathXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXIDXXXXXXXXXXXXXXX XXXXXXXXXXXX

  The Default Typemap
XXXXXXXXXXXXXXXXXXXXtypemapXXXXXXXX XXXXXXXXCPANXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX KiokuDB::TypeMap::DefaultXXXXXXXXXXX

SIMPLE SEARCHES
(XXXXX)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXAPIXXXXXXXXKiokuDB::Backend::DBIXXXXXXXXXXXXXX XXXXXXSQLXwhereXXXXXXXXXXXXXXXXXXXXX (XXXXXXXXXXXXXXXXXXXXXXXXXX)

"search"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXData::Stream::BulkXXXXXXXXXXXXX:

    my $stream = $dir->search({ name => "Homer Simpson" });

    while ( my $block = $stream->next ) {
        foreach my $object ( @$block ) {
            # $object->name eq "Homer Simpson"
       }
    }

XXXAPIXXXXXXXXXXXXXXXXXXDBIx::Class 0.09XXXXXXXX XXXXXXXXXXX

  DBI SEARCH COLUMNS
XXXXXXXAPIXXXXXXDBIXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXX'name'XXXXXXXXXX:

    my $dir = KiokuDB->connect(
        "dbi:SQLite:dbname=foo",
        columns => [
            # specify extra columns for the 'entries' table
            # in the same format you pass to DBIC's add_columns

            name => {
                data_type => "varchar",
                is_nullable => 1, # probably important
            },
        ],
    );

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"kioku dump"XXXX XXXXXXXXXXX"create => 1"XXXXX"kioku load"XXXXXXXXXXX

XXXXXXXXXXXXXXHomerXXXXXXXXXXXXXXXXXX:

    {
        my $s = $dir->new_scope;
        $dir->update( $dir->lookup( $homer_id ) );
    }

XXXXXXXXXXXXXXXXX:

       id = 201C5B55-E759-492F-8F20-A529C7C02C8B
     name = Homer Simpson

GETTING STARTED WITH BDB
(BDBXXXXX)

KiokuDBXXXXXXXXXXXXXXXXXKiokuDB::Backend::DBDXX(XX:DBIXXXXXXXXXXXYAPC::Asia 2009XXXXXX)X XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Search::GINXXXXXXXXXXXXXXXXXXX

KiokuDB::Backend::DBIXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXSearch::GINXXXXXX XXXXXXXXXXXXXXXXXXXKiokuDB::Backend::BDBXXXXXXXXXXXXXX (XX:YAPC::Asia 2009XXXXXXXXXXXXXXXX)

  Installing KiokuDB::Backend::BDB
KiokuDB::Backend::BDBXXBerkeleyDBXXXXXXXXXXX XXXXXXXXXXXXBerkeley DBXXXXXXXXBerkeley DBXXXXXURLXXXXXX <http://www.oracle.com/technology/software/products/berkeley-db/db/index.html>.

BerkeleyDB(XXXXX)XXXX"/usr/local/BerkeleyDB.4.7"XXXXXXXXXXXX XXXXBerkeleyDB(XXXXX)XX"/usr/local/BerkeleyDB"XXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

BerkeleyDBXXXXXXXXXXXXKiokuDB::Backend::BDBXXXXXXXXXXXXXXXXXXX KiokuDBXXXXXXXXXXXXXX

  Using KiokuDB::Backend::BDB
BDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX"create"XXXXXXXXXXXXXXXX

    my $backend = KiokuDB::Backend::BDB->new(
        manager => {
            home   => Path::Class::Dir->new(qw(path to storage)),
            create => 1,
        },
    );

BDBXXXXXXXXBerkeleyDB::ManagerXXXXXXXXXXBerkeleyDBXXXXXXXXXX BerkeleyDB::ManagerXXXXXXX"manager"XXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    my $dir = KiokuDB->new( backend => $backend );

XXXXXXXXXXX"create"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XX"connect"XXXXXXXXXXX:

    my $dir = KiokuDB->connect( "bdb:dir=path/to/storage", create => 1 );

TRANSACTIONS
(XXXXXXXX)

XXXXXXXXXXX(KiokuDB::Backend::Role::TXNXXXXXXXX)XXXXXXXXXXXXXXXXXXXXXX

DBIx::ClassXXXXXXXXXXXXXXXXXX:

    $dir->txn_do(sub {
        $dir->store($obj);
    });

BerkeleyDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX

KiokuDBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    $dir->txn_do(sub {
        my $scope = $dir->new_scope;

        $obj->name("Dancing Hippy");
        $dir->store($obj);

        die "an error";
    });

"name"XXXXXXXXXXXXXXX"store"XXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX

QUERIES
(XXX)

KiokuDB::Backend::BDB::GINXKiokuDB::Backend::BDBXXXXXXXX Serach::GINXXXXXXXXXXXXXXXXXX

Search::GINXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PostgresXXXGIN apiXXXXXXXXXXXXX GINXXGeneralized Inverted Indexes(XX:XXXXXX)XXXXX

Search::GINXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXSearch::GINXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Search::GIN::Extract::Callback XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    my $dir = KiokuDB->new(
        backend => KiokuDB::Backend::BDB::GIN->new(
            extract => Search::GIN::Extract::Callback->new(
                extract => sub {
                    my ( $obj, $extractor, @args ) = @_;

                    if ( $obj->isa("Person") ) {
                        return {
                            type => "user",
                            name => $obj->name,
                        };
                    }

                    return;
                },
            ),
        ),
    );

    $dir->store( @random_objects );

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    my $query = Search::GIN::Query::Manual->new(
        values => {
            type => "person",
        },
    );

    my $stream = $dir->search($query);

XXXXXXXXXXXXXData::Stream::BulkXXXXXXXXXXXX XXXXXXXXXXXXXXX

    while ( my $block = $stream->next ) {
        foreach my $person ( @$block ) {
            print "found a person: ", $person->name;
        }
    }

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:

    my @people = $stream->all;

Search::GINXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXSearch::GIN::Extract::ClassXXXX XXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXX
XXXXXXX (ktat@cpan.org)

PerlXXXXXXXXXX Project XXX PerlXXXXXXXXXXXXXXXXXXXXXXXX

 http://perldocjp.sourceforge.jp/
 http://sourceforge.jp/projects/perldocjp/
 http://www.freeml.com/ctrl/html/MLInfoForm/perldocjp@freeml.com
 http://www.perldoc.jp/