From f00990159ee619fee738cc27c0ab6fda8e3d978a Mon Sep 17 00:00:00 2001 From: miker Date: Fri, 11 Mar 2005 22:35:32 +0000 Subject: [PATCH] adding full marc21 record support git-svn-id: svn://svn.open-ils.org/ILS/trunk@321 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../src/extras/import/import_clean_marc.pl | 14 +++--- .../OpenILS/Application/Storage/CDBI.pm | 17 +++++-- .../Application/Storage/CDBI/biblio.pm | 15 +++++-- .../OpenILS/Application/Storage/Driver/Pg.pm | 10 ++++- .../OpenILS/Application/Storage/Publisher.pm | 44 ++++++++++++++++++- .../Application/Storage/Publisher/biblio.pm | 26 +++++------ .../src/perlmods/OpenILS/Utils/Fieldmapper.pm | 2 + .../src/sql/Postgres/005.schema.actors.sql | 18 ++++---- .../src/sql/Postgres/010.schema.biblio.sql | 13 ++++-- 9 files changed, 119 insertions(+), 40 deletions(-) diff --git a/Open-ILS/src/extras/import/import_clean_marc.pl b/Open-ILS/src/extras/import/import_clean_marc.pl index 05acd31019..558725d6f6 100755 --- a/Open-ILS/src/extras/import/import_clean_marc.pl +++ b/Open-ILS/src/extras/import/import_clean_marc.pl @@ -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; diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm index e5b791444d..1178979be2 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm @@ -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' ); diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/biblio.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/biblio.pm index 46a0ca4467..7c9ccc308d 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/biblio.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/biblio.pm @@ -42,14 +42,23 @@ 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/ ); #------------------------------------------------------------------------------- diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm index 8ffcf70892..e5bdf1f5a8 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm @@ -237,7 +237,9 @@ } ); $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; @@ -356,6 +358,12 @@ biblio::record_node->table( 'biblio.record_data' ); 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; diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher.pm index 96d5adf578..8b9b9bc970 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher.pm @@ -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( diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm index 024edce494..2d4746a5c5 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm @@ -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; diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm b/Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm index bda464bbb7..799a1eacf4 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm @@ -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' }, diff --git a/Open-ILS/src/sql/Postgres/005.schema.actors.sql b/Open-ILS/src/sql/Postgres/005.schema.actors.sql index 469241b7a3..92f4df0a98 100644 --- a/Open-ILS/src/sql/Postgres/005.schema.actors.sql +++ b/Open-ILS/src/sql/Postgres/005.schema.actors.sql @@ -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, diff --git a/Open-ILS/src/sql/Postgres/010.schema.biblio.sql b/Open-ILS/src/sql/Postgres/010.schema.biblio.sql index 158a3a4cc5..e7b6bce2ee 100644 --- a/Open-ILS/src/sql/Postgres/010.schema.biblio.sql +++ b/Open-ILS/src/sql/Postgres/010.schema.biblio.sql @@ -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, -- 2.43.2