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
105143end
0 commit comments