X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=sql%2Fbase%2Fbase.sql;h=cb096d0c928c7bf2b6857510f04b6714547aa117;hp=ab7b654a6f85958147e0d4174fe3589a144412e8;hb=b152406444c1dabacfa2da3b8fc2cd9434fd314f;hpb=7af21df77fb31c255c21c4a37addf7c645d42731 diff --git a/sql/base/base.sql b/sql/base/base.sql index ab7b654..cb096d0 100644 --- a/sql/base/base.sql +++ b/sql/base/base.sql @@ -622,7 +622,7 @@ CREATE OR REPLACE FUNCTION migration_tools.expand_barcode (TEXT, TEXT, INTEGER, return $barcode if (length($prefix) + length($new_barcode) + length($suffix)) > $maxlen; return "$prefix$new_barcode$suffix"; -$$ LANGUAGE PLPERL STABLE; +$$ LANGUAGE PLPERLU STABLE; CREATE OR REPLACE FUNCTION migration_tools.attempt_cast (TEXT,TEXT,TEXT) RETURNS RECORD AS $$ DECLARE @@ -729,7 +729,7 @@ CREATE OR REPLACE FUNCTION migration_tools.add_codabar_checkdigit (TEXT) RETURNS my $remainder = $total % 10; my $checkdigit = ($remainder == 0) ? $remainder : 10 - $remainder; return $barcode . $checkdigit; -$$ LANGUAGE PLPERL STRICT STABLE; +$$ LANGUAGE PLPERLU STRICT STABLE; CREATE OR REPLACE FUNCTION migration_tools.attempt_phone (TEXT,TEXT) RETURNS TEXT AS $$ DECLARE @@ -1138,7 +1138,8 @@ BEGIN WHEN TRUE THEN (rmf.amount / 100.0) * ac.price ELSE rmf.amount END, - renewal_remaining = rcd.max_renewals + renewal_remaining = rcd.max_renewals, + grace_period = rrf.grace_period FROM config.rule_circ_duration rcd, config.rule_recurring_fine rrf, @@ -1625,4 +1626,100 @@ END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION migration_tools.marc_parses( TEXT ) RETURNS BOOLEAN AS $func$ + +use MARC::Record; +use MARC::File::XML (BinaryEncoding => 'UTF-8'); +use MARC::Charset; + +MARC::Charset->assume_unicode(1); + +my $xml = shift; + +eval { my $r = MARC::Record->new_from_xml( $xml ); }; +if ($@) { + return 0; +} else { + return 1; +} + +$func$ LANGUAGE PLPERLU; +COMMENT ON FUNCTION migration_tools.marc_parses(TEXT) IS 'Return boolean indicating if MARCXML string is parseable by MARC::File::XML'; + +CREATE OR REPLACE FUNCTION migration_tools.simple_export_library_config(dir TEXT, orgs INT[]) RETURNS VOID AS $FUNC$ +BEGIN + EXECUTE $$COPY (SELECT * FROM actor.hours_of_operation WHERE id IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/actor_hours_of_operation'$$; + EXECUTE $$COPY (SELECT org_unit, close_start, close_end, reason FROM actor.org_unit_closed WHERE org_unit IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/actor_org_unit_closed'$$; + EXECUTE $$COPY (SELECT org_unit, name, value FROM actor.org_unit_setting WHERE org_unit IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/actor_org_unit_setting'$$; + EXECUTE $$COPY (SELECT name, owning_lib, holdable, hold_verify, opac_visible, circulate FROM asset.copy_location WHERE owning_lib IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/asset_copy_location'$$; + EXECUTE $$COPY (SELECT grp, org_unit, penalty, threshold FROM permission.grp_penalty_threshold WHERE org_unit IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/permission_grp_penalty_threshold'$$; + EXECUTE $$COPY (SELECT owning_lib, label, label_sortkey FROM asset.call_number_prefix WHERE owning_lib IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/asset_call_number_prefix'$$; + EXECUTE $$COPY (SELECT owning_lib, label, label_sortkey FROM asset.call_number_suffix WHERE owning_lib IN ($$ || + ARRAY_TO_STRING(orgs, ',') || $$)$$ || + $$) TO '$$ || dir || $$/asset_call_number_suffix'$$; + EXECUTE $$COPY config.rule_circ_duration TO '$$ || dir || $$/config_rule_circ_duration'$$; + EXECUTE $$COPY config.rule_age_hold_protect TO '$$ || dir || $$/config_age_hold_protect'$$; + EXECUTE $$COPY config.rule_max_fine TO '$$ || dir || $$/config_rule_max_fine'$$; + EXECUTE $$COPY config.rule_recurring_fine TO '$$ || dir || $$/config_rule_recurring_fine'$$; +END; +$FUNC$ LANGUAGE PLPGSQL; + +CREATE OR REPLACE FUNCTION migration_tools.simple_import_library_config(dir TEXT) RETURNS VOID AS $FUNC$ +BEGIN + EXECUTE $$COPY actor.hours_of_operation FROM '$$ || dir || $$/actor_hours_of_operation'$$; + EXECUTE $$COPY actor.org_unit_closed (org_unit, close_start, close_end, reason) FROM '$$ || dir || $$/actor_org_unit_closed'$$; + EXECUTE $$COPY actor.org_unit_setting (org_unit, name, value) FROM '$$ || dir || $$/actor_org_unit_setting'$$; + EXECUTE $$COPY asset.copy_location (name, owning_lib, holdable, hold_verify, opac_visible, circulate) FROM '$$ || dir || $$/asset_copy_location'$$; + EXECUTE $$COPY permission.grp_penalty_threshold (grp, org_unit, penalty, threshold) FROM '$$ || dir || $$/permission_grp_penalty_threshold'$$; + EXECUTE $$COPY asset.call_number_prefix (owning_lib, label, label_sortkey) FROM '$$ || dir || $$/asset_call_number_prefix'$$; + EXECUTE $$COPY asset.call_number_suffix (owning_lib, label, label_sortkey) FROM '$$ || dir || $$/asset_call_number_suffix'$$; + + -- import any new circ rules + PERFORM migration_tools.simple_import_new_rows_by_value(cir, 'config', 'rule_circ_duration', 'id', 'name'); + PERFORM migration_tools.simple_import_new_rows_by_value(cir, 'config', 'rule_age_hold_protect', 'id', 'name'); + PERFORM migration_tools.simple_import_new_rows_by_value(cir, 'config', 'rule_max_fine', 'id', 'name'); + PERFORM migration_tools.simple_import_new_rows_by_value(cir, 'config', 'rule_recurring_fine', 'id', 'name'); + +END; +$FUNC$ LANGUAGE PLPGSQL; + + +CREATE OR REPLACE FUNCTION migration_tools.simple_import_new_rows_by_value(dir TEXT, schemaname TEXT, tablename TEXT, idcol TEXT, matchcol TEXT) RETURNS VOID AS $FUNC$ +DECLARE + name TEXT; + loopq TEXT; + existsq TEXT; + ct INTEGER; + cols TEXT[]; + copyst TEXT; +BEGIN + EXECUTE $$DROP TABLE IF EXISTS tmp_$$ || tablename; + EXECUTE $$CREATE TEMPORARY TABLE tmp_$$ || tablename || $$ AS SELECT * FROM $$ || schemaname || '.' || tablename || $$ LIMIT 0$$; + EXECUTE $$COPY tmp_$$ || tablename || $$ FROM '$$ || dir || '/' || schemaname || '_' || tablename || $$'$$; + loopq := 'SELECT ' || matchcol || ' FROM tmp_' || tablename || ' ORDER BY ' || idcol; + existsq := 'SELECT COUNT(*) FROM ' || schemaname || '.' || tablename || ' WHERE ' || matchcol || ' = $1'; + SELECT ARRAY_AGG(column_name::TEXT) INTO cols FROM information_schema.columns WHERE table_schema = schemaname AND table_name = tablename AND column_name <> idcol; + FOR name IN EXECUTE loopq LOOP + EXECUTE existsq INTO ct USING name; + IF ct = 0 THEN + RAISE NOTICE 'inserting %.% row for %', schemaname, tablename, name; + copyst := 'INSERT INTO ' || schemaname || '.' || tablename || ' (' || ARRAY_TO_STRING(cols, ',') || ') SELECT ' || ARRAY_TO_STRING(cols, ',') || + ' FROM tmp_' || tablename || ' WHERE ' || matchcol || ' = $1'; + EXECUTE copyst USING name; + END IF; + END LOOP; +END; +$FUNC$ LANGUAGE PLPGSQL;