adding full marc21 record support
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 11 Mar 2005 22:35:32 +0000 (22:35 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 11 Mar 2005 22:35:32 +0000 (22:35 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@321 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/extras/import/import_clean_marc.pl
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/biblio.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm
Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm
Open-ILS/src/sql/Postgres/005.schema.actors.sql
Open-ILS/src/sql/Postgres/010.schema.biblio.sql

index 05acd31..558725d 100755 (executable)
@@ -87,13 +87,17 @@ while ( my $xml = <> ) {
 
                if ($new_id) {
 
-                       $ns->xml_to_nodeset;
-                       my $nodeset = $ns->nodeset;
-                       $_->owner_doc( $new_id ) for (@$nodeset);
+                       #$ns->xml_to_nodeset;
+                       #my $nodeset = $ns->nodeset;
+                       #$_->owner_doc( $new_id ) for (@$nodeset);
+
+                       my $rec = new Fieldmapper::biblio::record_marc;
+                       $rec->id( $new_id );
+                       $rec->marc( $ns->xml );
                
                        $req = $st_server->request(
-                               'open-ils.storage.biblio.record_node.batch.create',
-                               @$nodeset,
+                               'open-ils.storage.biblio.record_marc.create',
+                               $rec,
                        );
 
                        $req->wait_complete;
index e5b7914..1178979 100644 (file)
@@ -158,19 +158,25 @@ sub delete {
        my $self = shift;
        my $arg = shift;
 
+       my $class = ref($self) || $self;
+
        if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
                $self = $self->retrieve($arg);
+               unless (defined $self) {
+                       $log->debug("ARG! Couldn't retrieve record ".$arg->id, DEBUG);
+                       throw OpenSRF::EX::WARN ("ARG! Couldn't retrieve record ");
+               }
        }
 
        if ($class->find_column( 'last_xact_id' )) {
                my $xact_id = $self->current_xact_id;
                throw Error unless ($xact_id);
-               $self->last_xact_id( $self->current_xact_id );
-               $self->update;
+               $self->last_xact_id( $class->current_xact_id );
+               $self->SUPER::update;
        }
 
        $self->SUPER::delete;
-       return $arg;
+       return 1;
 }
 
 sub update {
@@ -261,9 +267,14 @@ sub import {
        #-------------------------------------------------------------------------------
        biblio::record_note->has_a( record => 'biblio::record_entry' );
        #-------------------------------------------------------------------------------
+       biblio::record_mods->is_a( id => 'biblio::record_entry' );
+       #-------------------------------------------------------------------------------
+       biblio::record_marc->is_a( id => 'biblio::record_entry' );
+       #-------------------------------------------------------------------------------
        biblio::record_entry->has_a( creator => 'actor::user' );
        biblio::record_entry->has_a( editor => 'actor::user' );
        biblio::record_entry->might_have( mods_entry => 'biblio::record_mods' => qw/mods/ );
+       biblio::record_entry->might_have( marc_entry => 'biblio::record_marc' => qw/marc/ );
        biblio::record_entry->has_many( notes => 'biblio::record_note' );
        biblio::record_entry->has_many( nodes => 'biblio::record_node', { order_by => 'intra_doc_id' } );
        biblio::record_entry->has_many( call_numbers => 'asset::call_number' );
index 46a0ca4..7c9ccc3 100644 (file)
@@ -43,13 +43,22 @@ biblio::record_node->columns( All => qw/id owner_doc intra_doc_id
 
 
 #-------------------------------------------------------------------------------
+package biblio::record_marc;
+use base qw/biblio/;
+
+biblio::record_marc->table( 'biblio_record_marc' );
+biblio::record_marc->columns( All => qw/id marc/ );
+#biblio::record_marc->columns( Stringify => qw/marc/ );
+#biblio::record_marc->is_a( id => qw/biblio::record_entry/ );
+
+#-------------------------------------------------------------------------------
 package biblio::record_mods;
 use base qw/biblio/;
 
 biblio::record_mods->table( 'biblio_record_mods' );
 biblio::record_mods->columns( All => qw/id mods/ );
-biblio::record_note->columns( Stringify => qw/mods/ );
-#biblio::record_note->is_a( id => qw/biblio::record_entry/ );
+#biblio::record_mods->columns( Stringify => qw/mods/ );
+#biblio::record_mods->is_a( id => qw/biblio::record_entry/ );
 
 #-------------------------------------------------------------------------------
 package biblio::record_note;
@@ -58,7 +67,7 @@ use base qw/biblio/;
 biblio::record_note->table( 'biblio_record_note' );
 biblio::record_note->columns( All => qw/id record value creator
                                        editor create_date edit_date/ );
-biblio::record_note->columns( Stringify => qw/value/ );
+#biblio::record_note->columns( Stringify => qw/value/ );
 #biblio::record_note->is_a( record => qw/biblio::record_entry/ );
 
 #-------------------------------------------------------------------------------
index 8ffcf70..e5bdf1f 100644 (file)
                                }
                        );
                        $log->debug("Registered 'disconnect' callback [$dc_cb] for new trasaction with Open-ILS XACT-ID [$xact_id]", DEBUG);
-                       $client->session->session_data( disconnect_cb => $dc_cb );
+                       if ($client and $client->session) {
+                               $client->session->session_data( disconnect_cb => $dc_cb );
+                       }
                }
 
                return 1;
        biblio::record_node->sequence( 'biblio.record_data_id_seq' );
        
        #---------------------------------------------------------------------
+       package biblio::record_marc;
+       
+       biblio::record_marc->table( 'biblio.record_marc' );
+       biblio::record_marc->sequence( 'biblio.record_marc_id_seq' );
+
+       #---------------------------------------------------------------------
        package biblio::record_mods;
        
        biblio::record_mods->table( 'biblio.record_mods' );
index 96d5adf..8b9b9bc 100644 (file)
@@ -2,6 +2,7 @@ package OpenILS::Application::Storage::Publisher;
 use base qw/OpenILS::Application::Storage/;
 our $VERSION = 1;
 
+use OpenSRF::EX qw/:try/;;
 use OpenSRF::Utils::Logger;
 my $log = 'OpenSRF::Utils::Logger';
 
@@ -20,6 +21,25 @@ use OpenILS::Application::Storage::Publisher::biblio;
 use OpenILS::Application::Storage::Publisher::config;
 use OpenILS::Application::Storage::Publisher::metabib;
 
+sub retrieve_node {
+       my $self = shift;
+       my $client = shift;
+       my @ids = @_;
+
+       my $cdbi = $self->{cdbi};
+
+       for my $id ( @ids ) {
+               next unless ($id);
+
+               my ($rec) = $cdbi->fast_fieldmapper($id);
+               $client->respond( $rec ) if ($rec);
+
+               last if ($self->api_name !~ /list/o);
+       }
+       return undef;
+}
+
+
 sub create_node {
        my $self = shift;
        my $client = shift;
@@ -30,7 +50,7 @@ sub create_node {
        my $success;
        try {
                my $rec = $cdbi->create($node);
-               $success = $rec->id;
+               $success = 1 if ($rec);
        } catch Error with {
                $success = 0;
        };
@@ -57,7 +77,7 @@ sub delete_node {
 
        my $success = 1;
        try {
-               $cdbi->delete($node);
+               $success = $cdbi->delete($node);
        } catch Error with {
                $success = 0;
        };
@@ -95,6 +115,26 @@ for my $fmclass ( Fieldmapper->classes ) {
        my $registration_class = __PACKAGE__ . "::$class";
        my $api_prefix = 'open-ils.storage.'.$api_class;
 
+       # Create the retrieve method
+       unless ( __PACKAGE__->is_registered( $api_prefix.'.retrieve' ) ) {
+               __PACKAGE__->register_method(
+                       api_name        => $api_prefix.'.retrieve',
+                       method          => 'retrieve_node',
+                       api_level       => 1,
+                       cdbi            => $cdbi,
+               );
+       }
+
+       # Create the batch retrieve method
+       unless ( __PACKAGE__->is_registered( $api_prefix.'.batch.retrieve' ) ) {
+               __PACKAGE__->register_method(
+                       api_name        => $api_prefix.'.batch.retrieve',
+                       method          => 'batch_call',
+                       api_level       => 1,
+                       cdbi            => $cdbi,
+               );
+       }
+
        # Create the create method
        unless ( __PACKAGE__->is_registered( $api_prefix.'.create' ) ) {
                __PACKAGE__->register_method(
index 024edce..2d4746a 100644 (file)
@@ -131,19 +131,19 @@ sub get_record_entry {
        }
        return undef;
 }
-__PACKAGE__->register_method(
-       method          => 'get_record_entry',
-       api_name        => 'open-ils.storage.biblio.record_entry.retrieve',
-       api_level       => 1,
-       argc            => 1,
-);
-__PACKAGE__->register_method(
-       method          => 'get_record_entry',
-       api_name        => 'open-ils.storage.biblio.record_entry.retrieve.list',
-       api_level       => 1,
-       argc            => 1,
-       stream          => 1,
-);
+#__PACKAGE__->register_method(
+#      method          => 'get_record_entry',
+#      api_name        => 'open-ils.storage.biblio.record_entry.retrieve',
+#      api_level       => 1,
+#      argc            => 1,
+#);
+#__PACKAGE__->register_method(
+#      method          => 'get_record_entry',
+#      api_name        => 'open-ils.storage.biblio.record_entry.retrieve.list',
+#      api_level       => 1,
+#      argc            => 1,
+#      stream          => 1,
+#);
 
 sub create_record_node {
        my $self = shift;
index bda464b..799a1ea 100644 (file)
@@ -35,6 +35,8 @@ sub _init {
                'Fieldmapper::biblio::record_node'              => { hint               => 'brn',
                                                                     proto_fields       => { children => 1 } },
                'Fieldmapper::biblio::record_entry'             => { hint => 'bre'  },
+               'Fieldmapper::biblio::record_mods'              => { hint => 'brm'  },
+               'Fieldmapper::biblio::record_marc'              => { hint => 'brx'  },
                'Fieldmapper::config::bib_source'               => { hint => 'cbs'  },
                'Fieldmapper::config::metabib_field'            => { hint => 'cmf'  },
                'Fieldmapper::metabib::metarecord'              => { hint => 'mmr'  },
index 469241b..92f4df0 100644 (file)
@@ -85,17 +85,17 @@ CREATE INDEX actor_org_unit_address_idx ON actor.org_unit (address);
 -- Some PINES test libraries
 INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (NULL, 1, 'PINES', 'Georgia PINES Consortium');
 
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 2, 'ARL', 'Athens Regional Library System');
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 3, 'ARL-ATH', 'Athens-Clark County Library');
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 3, 'ARL-BOG', 'Bogart Branch Library');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 2, 'ARL', 'Athens Regional Library System');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 3, 'ARL-ATH', 'Athens-Clark County Library');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 3, 'ARL-BOG', 'Bogart Branch Library');
 
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 2, 'MGRL', 'Middle Georgia Regional Library System');
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 3, 'MGRL-RC', 'Rocky Creek Branch Library');
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 3, 'MGRL-WA', 'Washington Memorial Library');
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 4, 'MGRL-MM', 'Bookmobile');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 2, 'MGRL', 'Middle Georgia Regional Library System');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 3, 'MGRL-RC', 'Rocky Creek Branch Library');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 3, 'MGRL-WA', 'Washington Memorial Library');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 4, 'MGRL-MM', 'Bookmobile');
 
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 2, 'HOU', 'Houston County Library System');
-INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (curval('actor.org_unit_id_seq'::TEXT), 3, 'HOU-WR', 'Nola Brantley Memorial Library');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 2, 'HOU', 'Houston County Library System');
+INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (currval('actor.org_unit_id_seq'::TEXT), 3, 'HOU-WR', 'Nola Brantley Memorial Library');
 
 CREATE TABLE actor.usr_access_entry (
        id              BIGSERIAL       PRIMARY KEY,
index 158a3a4..e7b6bce 100644 (file)
@@ -21,14 +21,19 @@ CREATE TABLE biblio.record_entry (
        source          INT,
        last_xact_id    TEXT            NOT NULL DEFAULT 'none'
 );
-CREATE INDEX biblio_record_entry_creator_idx ON biblio.record_note ( creator );
-CREATE INDEX biblio_record_entry_editor_idx ON biblio.record_note ( editor );
-CREATE UNIQUE INDEX biblio_record_unique_tcn ON (tcn_source,tcn_value) WHERE deleted IS FALSE;
+CREATE INDEX biblio_record_entry_creator_idx ON biblio.record_entry ( creator );
+CREATE INDEX biblio_record_entry_editor_idx ON biblio.record_entry ( editor );
+CREATE UNIQUE INDEX biblio_record_unique_tcn ON biblio.record_entry (tcn_source,tcn_value) WHERE deleted IS FALSE;
 
 CREATE TABLE biblio.record_mods (
        id      BIGINT  PRIMARY KEY,
        mods    TEXT    NOT NULL
-)
+);
+
+CREATE TABLE biblio.record_marc (
+       id      BIGINT  PRIMARY KEY,
+       marc    TEXT    NOT NULL
+);
 
 CREATE TABLE biblio.record_data (
        id              BIGSERIAL       PRIMARY KEY,