[Koha-patches] [PATCH] Items modification Performance improvement
Henri-Damien LAURENT
henridamien.laurent at biblibre.com
Wed Nov 4 22:30:51 CET 2009
---
C4/Items.pm | 84 +++++++++++++++++++++++++----------------------
t/db_dependent/Items.t | 33 +++++++++++++++++++
2 files changed, 78 insertions(+), 39 deletions(-)
create mode 100755 t/db_dependent/Items.t
diff --git a/C4/Items.pm b/C4/Items.pm
index 61126d9..9a1e81f 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -604,25 +604,20 @@ sub DelItem {
_koha_delete_item( $dbh, $itemnumber );
- # get the MARC record
- my $record = GetMarcBiblio($biblionumber);
- my $frameworkcode = GetFrameworkCode($biblionumber);
-
- # backup the record
- my $copy2deleted = $dbh->prepare("UPDATE deleteditems SET marc=? WHERE itemnumber=?");
- $copy2deleted->execute( $record->as_usmarc(), $itemnumber );
-
+#This looks quite odd to me Why would we need to save the whole bibliorecord ?
+# # get the MARC record
+# my $record = GetMarcBiblio($biblionumber);
+#
+# # backup the record
+# my $copy2deleted = $dbh->prepare("UPDATE deleteditems SET marc=? WHERE itemnumber=?");
+# $copy2deleted->execute( $record->as_usmarc(), $itemnumber );
+#
#search item field code
- my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField("items.itemnumber",$frameworkcode);
- my @fields = $record->field($itemtag);
+# my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField("items.itemnumber",$frameworkcode);
# delete the item specified
- foreach my $field (@fields) {
- if ( $field->subfield($itemsubfield) eq $itemnumber ) {
- $record->delete_field($field);
- }
- }
- &ModBiblioMarc( $record, $biblionumber, $frameworkcode );
+ my $frameworkcode = GetFrameworkCode($biblionumber);
+ _replace_item_field_in_biblio( undef, $biblionumber,$itemnumber, $frameworkcode );
logaction("CATALOGUING", "DELETE", $itemnumber, "item") if C4::Context->preference("CataloguingLog");
}
@@ -2268,13 +2263,15 @@ item information field.
sub _add_item_field_to_biblio {
my ($item_marc, $biblionumber, $frameworkcode) = @_;
+ my $dbh = C4::Context->dbh;
- my $biblio_marc = GetMarcBiblio($biblionumber);
- foreach my $field ($item_marc->fields()) {
- $biblio_marc->append_fields($field);
- }
+ my $biblio_xml = GetXmlBiblio($biblionumber);
+ my ($itemtag,$itemsubfield) = GetMarcFromKohaField("items.itemnumber",$frameworkcode);
+ my $itemField = $item_marc->field($itemtag);
+ my $itemXML = C4::Biblio::_field_xml_output($itemField);
+ substr($biblio_xml,-10,0,$itemXML);
+ $dbh->do(qq{UPDATE biblioitems set marcxml=? WHERE biblionumber=?},undef, $biblio_xml, $biblionumber);
- ModBiblioMarc($biblio_marc, $biblionumber, $frameworkcode);
}
=head2 _replace_item_field_in_biblio
@@ -2297,27 +2294,36 @@ sub _replace_item_field_in_biblio {
my $dbh = C4::Context->dbh;
# get complete MARC record & replace the item field by the new one
- my $completeRecord = GetMarcBiblio($biblionumber);
+ my $completeRecord = GetXmlBiblio($biblionumber);
my ($itemtag,$itemsubfield) = GetMarcFromKohaField("items.itemnumber",$frameworkcode);
- my $itemField = $ItemRecord->field($itemtag);
- my @items = $completeRecord->field($itemtag);
- my $found = 0;
- foreach (@items) {
- if ($_->subfield($itemsubfield) eq $itemnumber) {
- $_->replace_with($itemField);
- $found = 1;
- }
- }
+ my $itemXML;
+ if ($ItemRecord){
+ my $itemField = $ItemRecord->field($itemtag);
+ $itemXML = C4::Biblio::_field_xml_output($itemField);
+ }
+ my $done=0;
+ my $ofset_itemfield=0;
+ while (($ofset_itemfield=index($completeRecord,qq{<datafield tag="$itemtag" ind1=" " ind2=" ">},$ofset_itemfield ))>0){
+ my $ofset_itemfield_end=index(substr($completeRecord,$ofset_itemfield),qq{</datafield>});
+ warn "$ofset_itemfield $ofset_itemfield_end";
+ my $field_string=substr($completeRecord,$ofset_itemfield,$ofset_itemfield_end);
+ if (my $index=index($field_string,qq{code="$itemsubfield">$itemnumber</subfield})>0){
+ substr($completeRecord,$ofset_itemfield,$ofset_itemfield_end+length(qq{</datafield>}),"".$itemXML) and $done=1;
+ $dbh->do(qq{UPDATE biblioitems set marcxml=? WHERE biblionumber=?},undef, $completeRecord, $biblionumber);
+ return;
+ }
+ if ($ofset_itemfield_end>-1){
+ $ofset_itemfield+= $ofset_itemfield_end+length(qq{</datafield>});
+ }
+ else {
+ $ofset_itemfield=length($completeRecord);
+ }
+ }
- unless ($found) {
- # If we haven't found the matching field,
- # just add it. However, this means that
- # there is likely a bug.
- $completeRecord->append_fields($itemField);
+ unless ($done) {
+ #Add XML at the end of record
+ _add_item_field_to_biblio($ItemRecord,$biblionumber,$frameworkcode)
}
-
- # save the record
- ModBiblioMarc($completeRecord, $biblionumber, $frameworkcode);
}
=head2 _repack_item_errors
diff --git a/t/db_dependent/Items.t b/t/db_dependent/Items.t
new file mode 100755
index 0000000..c3b4788
--- /dev/null
+++ b/t/db_dependent/Items.t
@@ -0,0 +1,33 @@
+use strict;
+use warnings;
+use Test::More tests=>18;
+
+BEGIN {use_ok('C4::Items') }
+use C4::Biblio;
+use C4::Dates;
+use C4::Debug;
+
+print "ok 1\n";
+use YAML;
+
+#
+# Budget Periods :
+#
+my $field=MARC::Field->new('200'," "," ",a=>"Title",b=>'itemtype');
+my $biblio=MARC::Record->new();
+$biblio->append_fields($field);
+my ($biblionumber)=AddBiblio($biblio,'');
+my ($biblionumber,$biblioitemnumber,$itemnumber)=AddItem({barcode=>1231241,location=>"MyLOC"},$biblionumber);
+$debug && warn Dump(GetItem($itemnumber));
+my ($biblionumber,$biblioitemnumber,$itemnumber2)=AddItem({barcode=>'ACAD',location=>"MyLOC2"},$biblionumber);
+$debug && warn Dump(GetItem($itemnumber2));
+my $bibliorecord=GetMarcBiblio($biblionumber);
+$debug && warn $bibliorecord->as_formatted;
+ModItem({dateaccessioned=>2009-01-01,location=>'TESTS2'},$biblionumber,$itemnumber);
+my $bibliorecord=GetMarcBiblio($biblionumber);
+$debug && warn $bibliorecord->as_formatted;
+print localtime;
+for (my $i=1;$i<10000;$i++){
+ModItem({location=>"TEST$i"},$biblionumber,$itemnumber2);
+}
+print localtime
--
1.6.3.3
More information about the Koha-patches
mailing list