adding storage method open-ils.storage.asset.merge_record_assets to call stored proc...
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 29 Aug 2007 20:29:43 +0000 (20:29 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 29 Aug 2007 20:29:43 +0000 (20:29 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@7742 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/asset.pm
Open-ILS/src/sql/Pg/020.schema.functions.sql
Open-ILS/src/sql/Pg/040.schema.asset.sql

index 04c71ba..0900662 100644 (file)
@@ -794,5 +794,31 @@ __PACKAGE__->register_method(
        api_level       => 1,
 );
 
+sub merge_record_assets {
+       my $self = shift;
+       my $client = shift;
+       my $target = shift;
+       my @sources = @_;
+
+       my $count = 0;
+       for my $source ( @sources ) {
+               $count += asset::call_number
+                               ->db_Main
+                               ->selectcol_arrayref(
+                                       "SELECT asset.merge_record_assets(?,?);",
+                                       {},
+                                       $target,
+                                       $source
+                               )->[0];
+       }
+
+       return $count;
+}
+__PACKAGE__->register_method(
+       api_name        => 'open-ils.storage.asset.merge_record_assets',
+       method          => 'merge_record_assets',
+       argc            => 2,
+       api_level       => 1,
+)
 
 1;
index 04368ab..9a17029 100644 (file)
@@ -171,3 +171,4 @@ CREATE AGGREGATE array_accum (
        stype = anyarray,
        initcond = '{}'
 );
+
index 23cdf67..ecc93cd 100644 (file)
@@ -174,5 +174,36 @@ CREATE VIEW stats.fleshed_call_number AS
         FROM    asset.call_number cn
                 JOIN metabib.rec_descriptor rd ON (rd.record = cn.record);
 
+CREATE OR REPLACE FUNCTION asset.merge_record_assets( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
+DECLARE
+       moved_cns INT := 0;
+       source_cn asset.call_number%ROWTYPE;
+       target_cn asset.call_number%ROWTYPE;
+BEGIN
+       FOR source_cn IN SELECT * FROM asset.call_number WHERE record = source_record LOOP
+
+               SELECT  INTO target_cn *
+                 FROM  asset.call_number
+                 WHERE label = source_cn.label
+                       AND owning_lib = source_cn.owning_lib
+                       AND record = source_cn.record;
+
+               IF FOUND THEN
+                       UPDATE  asset.copy
+                         SET   call_number = target_cn.id
+                         WHERE call_number = source_cn.id;
+               ELSE
+                       UPDATE  asset.call_number
+                         SET   record = target_record
+                         WHERE id = source_cn.id;
+               END IF;
+
+               moved_cns := moved_cns + 1;
+       END LOOP;
+
+       RETURN moved_cns;
+END;
+$func$ LANGUAGE plpgsql;
 
 COMMIT;
+