@@ -67,20 +67,29 @@ public actor PostgresSQLStorage {
6767
6868 public struct ProgramInput {
6969 public let program : Program
70+ public let programHash : String
71+ public let programBase64 : String
7072 public let fuzzerId : Int
7173 public let mutatorNames : [ String ]
7274 public let contributorNames : [ String ]
75+ public let parentHash : String ?
7376
7477 public init (
7578 program: Program ,
79+ programHash: String ,
80+ programBase64: String ,
7681 fuzzerId: Int ,
7782 mutatorNames: [ String ] ,
78- contributorNames: [ String ]
83+ contributorNames: [ String ] ,
84+ parentHash: String ?
7985 ) {
8086 self . program = program
87+ self . programHash = programHash
88+ self . programBase64 = programBase64
8189 self . fuzzerId = fuzzerId
8290 self . mutatorNames = mutatorNames
8391 self . contributorNames = contributorNames
92+ self . parentHash = parentHash
8493 }
8594 }
8695
@@ -369,6 +378,7 @@ public actor PostgresSQLStorage {
369378 }
370379
371380 public func addProgramToBatch( _ programInput: ProgramInput ) {
381+ /*
372382 guard let programHash = try? DatabaseUtils.calculateProgramHash(program: programInput.program) else {
373383 if self.enableLogging {
374384 self.logger.warning("Failed to calculate program hash, skipping program")
@@ -385,6 +395,7 @@ public actor PostgresSQLStorage {
385395 }
386396
387397 seenProgramHashes.insert(programHash)
398+ */
388399 pendingPrograms. append ( programInput)
389400 }
390401
@@ -421,6 +432,7 @@ public actor PostgresSQLStorage {
421432
422433 if !programsToStore. isEmpty {
423434 // Group by fuzzerId to use storeProgramsBatch
435+ // TODO Aleksi: Is this even necessary?
424436 let groupedPrograms = Dictionary ( grouping: programsToStore, by: { $0. fuzzerId} )
425437 for (fuzzerId, programInputs) in groupedPrograms {
426438 _ = try await storeProgramsBatch ( programInputs: programInputs, fuzzerId: fuzzerId)
@@ -441,66 +453,8 @@ public actor PostgresSQLStorage {
441453 }
442454
443455 private func _storeProgramsBatchImpl( programInputs: [ ProgramInput ] , fuzzerId: Int ) async throws -> [ String ] {
444- // Pre-calculate all hashes and sort to ensure consistent lock ordering
445- struct PreparedProgram {
446- let hash : String
447- let input : ProgramInput
448- let parentHash : String ?
449- let programData : String
450- }
451-
452- var preparedPrograms : [ PreparedProgram ] = [ ]
453-
454- for programInput in programInputs {
455- let program = programInput. program
456-
457- // Calculate program hash
458- let programHash : String
459- do {
460- programHash = try DatabaseUtils . calculateProgramHash ( program: program)
461- } catch {
462- if self . enableLogging {
463- self . logger. warning ( " Failed to calculate hash for program, skipping: \( error) " )
464- }
465- continue
466- }
467-
468- // Calculate parent hash if exists
469- let parentHash : String ?
470- if let parentProgram = program. parent {
471- do {
472- parentHash = try DatabaseUtils . calculateProgramHash ( program: parentProgram)
473- } catch {
474- if self . enableLogging {
475- self . logger. warning ( " Failed to calculate parent hash, using nil: \( error) " )
476- }
477- parentHash = nil
478- }
479- } else {
480- parentHash = nil
481- }
482-
483- // Encode program (must be done after parent hash calculation)
484- let programData : String
485- do {
486- programData = try DatabaseUtils . encodeProgramToBase64 ( program: program)
487- } catch {
488- if self . enableLogging {
489- self . logger. warning ( " Failed to encode program with hash \( programHash) , skipping: \( error) " )
490- }
491- continue
492- }
493-
494- preparedPrograms. append ( PreparedProgram (
495- hash: programHash,
496- input: programInput,
497- parentHash: parentHash,
498- programData: programData
499- ) )
500- }
501-
502456 // Sort by hash - ensures all workers acquire locks in the same order
503- preparedPrograms . sort { $0. hash < $1. hash }
457+ let sortedProgramInputs = programInputs . sorted { $0. programHash < $1. programHash }
504458
505459 return try await databasePool. withConnection { connection in
506460 var programHashes : [ String ] = [ ]
@@ -511,11 +465,10 @@ public actor PostgresSQLStorage {
511465 var insertedCount = 0
512466 var skippedCount = 0
513467
514- for prepared in preparedPrograms {
515- let programHash = prepared. hash
516- let programInput = prepared. input
517- let mutatorNames = programInput. mutatorNames
518- let contributorNames = programInput. contributorNames
468+ for input in sortedProgramInputs {
469+ let programHash = input. programHash
470+ let mutatorNames = input. mutatorNames
471+ let contributorNames = input. contributorNames
519472
520473 // Format as PostgreSQL arrays: ARRAY['name1', 'name2', ...]
521474 let mutatorsArray : String
@@ -539,7 +492,7 @@ public actor PostgresSQLStorage {
539492 // Single unified INSERT into the program table (previously split between fuzzer and program tables)
540493 let programQuery = PostgresQuery ( stringLiteral: """
541494 INSERT INTO program (program_hash, fuzzer_id, inserted_at, program_base64, created_at, source_mutators, contributors, parent_program_hash)
542- VALUES (' \( programHash) ', \( fuzzerId) , NOW(), ' \( prepared . programData ) ', NOW(), \( mutatorsArray) , \( contributorsArray) , \( prepared . parentHash != nil ? " ' \( prepared . parentHash!) ' " : " NULL " ) )
495+ VALUES (' \( programHash) ', \( fuzzerId) , NOW(), ' \( input . programBase64 ) ', NOW(), \( mutatorsArray) , \( contributorsArray) , \( input . parentHash != nil ? " ' \( input . parentHash!) ' " : " NULL " ) )
543496 ON CONFLICT (program_hash) DO NOTHING
544497 RETURNING program_hash
545498 """ )
@@ -683,7 +636,7 @@ public actor PostgresSQLStorage {
683636 }
684637
685638 var allPrograms : [ Program ] = [ ]
686- var seenHashes = Set < String > ( )
639+ // var seenHashes = Set<String>()
687640 let batchSize = 5000 // Fetch 5k programs at a time
688641 var offset = 0
689642 var totalFetched = 0
@@ -696,6 +649,7 @@ public actor PostgresSQLStorage {
696649 }
697650
698651 // Deduplicate and add to results
652+ /*
699653 for program in batch {
700654 do {
701655 let hash = try DatabaseUtils.calculateProgramHash(program: program)
@@ -710,6 +664,7 @@ public actor PostgresSQLStorage {
710664 }
711665 }
712666 }
667+ */
713668
714669 totalFetched += batch. count
715670
0 commit comments