44
55import Foundation
66
7- struct SQLRowToStatementConverter {
8- let tableName : String
9- let columns : [ String ]
10- let primaryKeyColumn : String ?
11- let databaseType : DatabaseType
7+ internal struct SQLRowToStatementConverter {
8+ internal let tableName : String
9+ internal let columns : [ String ]
10+ internal let primaryKeyColumn : String ?
11+ internal let databaseType : DatabaseType
1212
1313 private static let maxRows = 50_000
1414
15- func generateInserts( rows: [ [ String ? ] ] ) -> String {
15+ internal func generateInserts( rows: [ [ String ? ] ] ) -> String {
1616 let capped = rows. prefix ( Self . maxRows)
1717 let quotedTable = quoteColumn ( tableName)
1818 let quotedColumns = columns. map { quoteColumn ( $0) } . joined ( separator: " , " )
@@ -23,7 +23,7 @@ struct SQLRowToStatementConverter {
2323 } . joined ( separator: " \n " )
2424 }
2525
26- func generateUpdates( rows: [ [ String ? ] ] ) -> String {
26+ internal func generateUpdates( rows: [ [ String ? ] ] ) -> String {
2727 let capped = rows. prefix ( Self . maxRows)
2828
2929 return capped. map { row in
@@ -39,9 +39,10 @@ struct SQLRowToStatementConverter {
3939 let setClause : String
4040 let whereClause : String
4141
42- if let pkColumn = primaryKeyColumn {
43- let pkIndex = columns. firstIndex ( of: pkColumn)
44- let pkValue = pkIndex. map { row. indices. contains ( $0) ? row [ $0] : nil } ?? nil
42+ if let pkColumn = primaryKeyColumn,
43+ let pkIndex = columns. firstIndex ( of: pkColumn) ,
44+ row. indices. contains ( pkIndex) {
45+ let pkValue = row [ pkIndex]
4546
4647 let setClauses = columns. enumerated ( ) . compactMap { index, col -> String ? in
4748 guard col != pkColumn else { return nil }
@@ -83,7 +84,11 @@ struct SQLRowToStatementConverter {
8384 guard let value else {
8485 return " NULL "
8586 }
86- return " ' \( value. replacingOccurrences ( of: " ' " , with: " '' " ) ) ' "
87+ var escaped = value. replacingOccurrences ( of: " ' " , with: " '' " )
88+ if databaseType == . mysql || databaseType == . mariadb {
89+ escaped = escaped. replacingOccurrences ( of: " \\ " , with: " \\ \\ " )
90+ }
91+ return " ' \( escaped) ' "
8792 }
8893
8994 private func quoteColumn( _ name: String ) -> String {
0 commit comments