Skip to content

Commit 6d675d2

Browse files
committed
Pull the OAI writer back into MarcRecordWriterService.
1 parent 215e0b1 commit 6d675d2

File tree

3 files changed

+45
-63
lines changed

3 files changed

+45
-63
lines changed

app/jobs/generate_delta_dump_job.rb

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ def perform(stream, from_date: nil, effective_date: Time.zone.now, publish: true
2929
normalized_dump = delta_dump.build_normalized_dump(stream: stream)
3030

3131
base_name = "#{stream.organization.slug}#{"-#{stream.slug}" unless stream.default?}-#{effective_date.strftime('%FT%T')}-delta"
32-
writer = MarcRecordWriterService.new(base_name)
33-
oai_writer = ChunkedOaiMarcRecordWriterService.new(base_name, dump: normalized_dump, now: effective_date)
32+
writer = MarcRecordWriterService.new(base_name, dump: normalized_dump, now: now)
3433

3534
job_tracker.update(total: uploads.sum(&:marc_records_count))
3635

@@ -43,23 +42,15 @@ def perform(stream, from_date: nil, effective_date: Time.zone.now, publish: true
4342
records.each do |record|
4443
if record.status == 'delete'
4544
writer.write_delete(record)
46-
oai_writer.write_delete(record)
4745
else
4846
writer.write_marc_record(record)
49-
oai_writer.write_marc_record(record)
5047
end
5148
end
5249

5350
job_tracker.increment(records.size)
5451
end
5552

5653
writer.finalize
57-
oai_writer.finalize
58-
59-
writer.files.each do |as, file|
60-
normalized_dump.public_send(as).attach(io: File.open(file),
61-
filename: human_readable_filename(base_name, as))
62-
end
6354

6455
normalized_dump.update(published_at: effective_date)
6556
delta_dump.published_at = Time.zone.now if publish
@@ -68,29 +59,7 @@ def perform(stream, from_date: nil, effective_date: Time.zone.now, publish: true
6859
ensure
6960
writer.close
7061
writer.unlink
71-
72-
oai_writer.close
73-
oai_writer.unlink
7462
end
7563
end
7664
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
77-
78-
private
79-
80-
def human_readable_filename(base_name, file_type, counter = nil)
81-
as = case file_type
82-
when :deletes
83-
'deletes.del.txt'
84-
when :marc21
85-
'marc21.mrc.gz'
86-
when :marcxml
87-
'marcxml.xml.gz'
88-
when :oai_xml
89-
"oai-#{format('%010d', counter)}.xml.gz"
90-
else
91-
"#{file_type}.gz"
92-
end
93-
94-
"#{base_name}-#{as}"
95-
end
9665
end

app/jobs/generate_full_dump_job.rb

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def self.enqueue_some(older_than: 4.weeks, maximum: 2)
3333
end
3434
# rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity
3535

36-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
36+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
3737
def perform(stream, effective_date: Time.zone.now, publish: true)
3838
uploads = stream.uploads.active
3939

@@ -49,8 +49,7 @@ def perform(stream, effective_date: Time.zone.now, publish: true)
4949
normalized_dump = full_dump.build_normalized_dump(stream: stream)
5050

5151
base_name = "#{stream.organization.slug}#{"-#{stream.slug}" unless stream.default?}-#{Time.zone.today}-full"
52-
writer = MarcRecordWriterService.new(base_name)
53-
oai_writer = ChunkedOaiMarcRecordWriterService.new(base_name, dump: normalized_dump, now: effective_date)
52+
writer = MarcRecordWriterService.new(base_name, dump: normalized_dump, now: now)
5453

5554
begin
5655
NormalizedMarcRecordReader.new(uploads).each_slice(1000) do |records|
@@ -63,19 +62,13 @@ def perform(stream, effective_date: Time.zone.now, publish: true)
6362
next if record.status == 'delete'
6463

6564
writer.write_marc_record(record)
66-
oai_writer.write_marc_record(record)
6765
end
6866

6967
job_tracker.increment(records.size)
7068
end
7169

72-
oai_writer.finalize
7370
writer.finalize
7471

75-
writer.files.each do |as, file|
76-
normalized_dump.public_send(as).attach(io: File.open(file), filename: human_readable_filename(base_name, as))
77-
end
78-
7972
normalized_dump.update(published_at: effective_date)
8073
full_dump.published_at = Time.zone.now if publish
8174

@@ -85,25 +78,7 @@ def perform(stream, effective_date: Time.zone.now, publish: true)
8578
ensure
8679
writer.close
8780
writer.unlink
88-
89-
oai_writer.close
90-
oai_writer.unlink
9181
end
9282
end
93-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
94-
95-
def human_readable_filename(base_name, file_type)
96-
as = case file_type
97-
when :deletes
98-
'deletes.del.txt'
99-
when :marc21
100-
'marc21.mrc.gz'
101-
when :marcxml
102-
'marcxml.xml.gz'
103-
else
104-
"#{file_type}.gz"
105-
end
106-
107-
"#{base_name}-#{as}"
108-
end
83+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
10984
end

app/services/marc_record_writer_service.rb

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# frozen_string_literal: true
22

33
# Utility class for serializing MARC records to files
4-
class MarcRecordWriterService
5-
attr_reader :base_name, :files
4+
class MarcRecordWriterService # rubocop:disable Metrics/ClassLength
5+
attr_reader :base_name, :files, :dump, :now
66

7-
def initialize(base_name = nil, files: { errata: nil, marcxml: nil, marc21: nil, deletes: nil })
7+
def initialize(base_name = nil, dump:, now: Time.zone.now, files: { errata: nil, marcxml: nil, marc21: nil, deletes: nil })
88
@base_name = base_name
9+
@dump = dump
10+
@now = now
911
@files = files.compact
1012
@opened_files = []
1113
@writers = {}
@@ -16,32 +18,49 @@ def write_marc_record(record)
1618

1719
write_marc21_record(record)
1820
write_marcxml_record(record)
21+
write_oai_record(record)
1922
end
2023

2124
def write_delete(record)
2225
deletes_writer.puts(record.marc001)
26+
oai_writer.write_delete(record)
2327
end
2428

2529
def write_errata(message)
2630
writer(:errata).puts(message)
2731
end
2832

2933
def finalize
34+
oai_writer.finalize
35+
3036
@writers.each_value(&:close)
37+
38+
files.each do |as, file|
39+
dump.public_send(as).attach(io: File.open(file), filename: human_readable_filename(base_name, as))
40+
end
3141
end
3242

3343
def close
3444
@opened_files.each(&:close)
45+
46+
oai_writer.close
3547
end
3648

3749
def unlink
3850
@opened_files.each(&:unlink)
51+
oai_writer.unlink
3952

4053
FileUtils.rm_rf tempdir
4154
end
4255

4356
private
4457

58+
def write_oai_record(record)
59+
oai_writer.write_marc_record(record)
60+
rescue StandardError => e
61+
write_errata("#{record.marc001}: #{e}")
62+
end
63+
4564
def write_marc21_record(record)
4665
writer(:marc21).write(split_marc(record.augmented_marc))
4766
rescue StandardError => e
@@ -70,6 +89,10 @@ def deletes_writer
7089
@writers[:deletes] ||= file(:deletes)
7190
end
7291

92+
def oai_writer
93+
@writers[:oai] ||= ChunkedOaiMarcRecordWriterService.new(base_name, dump: dump, now: now)
94+
end
95+
7396
def gzipped_temp_file(name)
7497
Zlib::GzipWriter.new(temp_file(name))
7598
end
@@ -102,4 +125,19 @@ def valid?(record)
102125
def tempdir
103126
@tempdir ||= Dir.mktmpdir(base_name || 'marc_record_writer', Settings.marc_record_writer_tmpdir || Dir.tmpdir)
104127
end
128+
129+
def human_readable_filename(base_name, file_type)
130+
as = case file_type
131+
when :deletes
132+
'deletes.del.txt'
133+
when :marc21
134+
'marc21.mrc.gz'
135+
when :marcxml
136+
'marcxml.xml.gz'
137+
else
138+
"#{file_type}.gz"
139+
end
140+
141+
"#{base_name}-#{as}"
142+
end
105143
end

0 commit comments

Comments
 (0)