Skip to content

Commit

Permalink
Merge pull request #9 from IBM-Swift/issue_8
Browse files Browse the repository at this point in the history
Avoid memory leak in parameter creation
  • Loading branch information
shmuelk committed Mar 5, 2017
2 parents bea4182 + 25141c7 commit 18f6366
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions Sources/SwiftKueryPostgreSQL/PostgreSQLConnection.swift
Expand Up @@ -180,22 +180,30 @@ public class PostgreSQLConnection: Connection {
}

private func executeQueryWithParameters(query: String, parameters: [Any?], onCompletion: @escaping ((QueryResult) -> ())) {
var parameterPointers = [UnsafeMutablePointer<Int8>?]()
var parameterData = [UnsafePointer<Int8>?]()
// At the moment we only create string parameters. Binary parameters should be added.
for parameter in parameters {
var pointer: UnsafeMutablePointer<Int8>?
if parameter != nil {
let value = AnyCollection("\(parameter!)".utf8CString)
pointer = UnsafeMutablePointer<Int8>.allocate(capacity: Int(value.count))
for (index, byte) in value.enumerated() {
pointer![index] = byte
}
if let parameter = parameter {
let parameterString = String(describing: parameter)
let count = parameterString.lengthOfBytes(using: .utf8) + 1
parameterPointers.append(UnsafeMutablePointer<Int8>.allocate(capacity: Int(count)))
memcpy(parameterPointers[parameterPointers.count-1]!, UnsafeRawPointer(parameterString), count)
parameterData.append(parameterPointers.last!)
}
else {
parameterData.append(nil)
}
parameterData.append(pointer)
}

_ = parameterData.withUnsafeBufferPointer { buffer in
PQsendQueryParams(connection, query, Int32(parameters.count), nil, buffer.isEmpty ? nil : buffer.baseAddress, nil, nil, 0)
}

for pointer in parameterPointers {
free(pointer)
}

PQsetSingleRowMode(connection)
processQueryResult(query: query, onCompletion: onCompletion)
}
Expand Down

0 comments on commit 18f6366

Please sign in to comment.