dawarich/app/services/users/import_data/json_streamer.rb
2025-09-23 20:39:12 +02:00

55 lines
No EOL
1.4 KiB
Ruby

# frozen_string_literal: true
require 'yajl'
class Users::ImportData::JsonStreamer
def initialize(zip_entry)
@zip_entry = zip_entry
@memory_tracker = Users::ImportData::MemoryTracker.new
end
def stream_parse
Rails.logger.info "Starting JSON streaming for #{@zip_entry.name} (#{@zip_entry.size} bytes)"
@memory_tracker.log("before_streaming")
data = {}
@zip_entry.get_input_stream do |input_stream|
parser = Yajl::Parser.new(symbolize_keys: false)
# Set up the parser to handle objects
parser.on_parse_complete = proc do |parsed_data|
Rails.logger.info "JSON streaming completed, parsed #{parsed_data.keys.size} entity types"
# Process each entity type
parsed_data.each do |entity_type, entity_data|
if entity_data.is_a?(Array)
Rails.logger.info "Streamed #{entity_type}: #{entity_data.size} items"
end
end
data = parsed_data
@memory_tracker.log("after_parsing")
end
# Stream parse the JSON
begin
parser.parse(input_stream)
rescue Yajl::ParseError => e
raise StandardError, "Invalid JSON format in data file: #{e.message}"
end
end
@memory_tracker.log("streaming_completed")
data
rescue StandardError => e
Rails.logger.error "JSON streaming failed: #{e.message}"
raise e
end
private
attr_reader :zip_entry
end