Skip to content

Commit 3f71464

Browse files
committed
Upgrading to MySQL8, all test passed
Still keeping the downcast compatibility for MySQL 5.7.21, although these mysql options are no long supported as the conflicts of the both versions: - MYSQL_OPT_USE_REMOTE_CONNECTION - MYSQL_OPT_USE_EMBEDDED_CONNECTION - MYSQL_OPT_GUESS_CONNECTION - MYSQL_SET_CLIENT_IP - MYSQL_SECURE_AUTH - MYSQL_OPT_SSL_VERIFY_SERVER_CERT
1 parent ae7469d commit 3f71464

File tree

4 files changed

+39
-19
lines changed

4 files changed

+39
-19
lines changed

Sources/PerfectMySQL/MySQL.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,23 @@ public final class MySQL {
100100

101101
/// Commits the transaction
102102
public func commit() -> Bool {
103-
return 1 == mysql_commit(mysqlPtr)
103+
var res = mysql_commit(mysqlPtr)
104+
var FALSE = 0
105+
return memcmp(&res, &FALSE, MemoryLayout.size(ofValue: res)) != 0
104106
}
105107

106108
/// Rolls back the transaction
107109
public func rollback() -> Bool {
108-
return 1 == mysql_rollback(mysqlPtr)
110+
var res = mysql_rollback(mysqlPtr)
111+
var FALSE = 0
112+
return memcmp(&res, &FALSE, MemoryLayout.size(ofValue: res)) != 0
109113
}
110114

111115
/// Checks whether any more results exist
112116
public func moreResults() -> Bool {
113-
return 1 == mysql_more_results(mysqlPtr)
117+
var res = mysql_more_results(mysqlPtr)
118+
var FALSE = 0
119+
return memcmp(&res, &FALSE, MemoryLayout.size(ofValue: res)) != 0
114120
}
115121

116122
/// Returns/initiates the next result in multiple-result executions
@@ -169,22 +175,24 @@ public final class MySQL {
169175
return MYSQL_OPT_WRITE_TIMEOUT
170176
case MySQLOpt.MYSQL_OPT_USE_RESULT:
171177
return MYSQL_OPT_USE_RESULT
178+
/*
172179
case MySQLOpt.MYSQL_OPT_USE_REMOTE_CONNECTION:
173180
return MYSQL_OPT_USE_REMOTE_CONNECTION
174-
case MySQLOpt.MYSQL_OPT_USE_EMBEDDED_CONNECTION:
181+
case MySQLOpt.MYSQL_OPT_USE_EMBEDDED_CONNECTION:
175182
return MYSQL_OPT_USE_EMBEDDED_CONNECTION
176183
case MySQLOpt.MYSQL_OPT_GUESS_CONNECTION:
177184
return MYSQL_OPT_GUESS_CONNECTION
178185
case MySQLOpt.MYSQL_SET_CLIENT_IP:
179186
return MYSQL_SET_CLIENT_IP
180187
case MySQLOpt.MYSQL_SECURE_AUTH:
181188
return MYSQL_SECURE_AUTH
189+
*/
182190
case MySQLOpt.MYSQL_REPORT_DATA_TRUNCATION:
183191
return MYSQL_REPORT_DATA_TRUNCATION
184192
case MySQLOpt.MYSQL_OPT_RECONNECT:
185193
return MYSQL_OPT_RECONNECT
186-
case MySQLOpt.MYSQL_OPT_SSL_VERIFY_SERVER_CERT:
187-
return MYSQL_OPT_SSL_VERIFY_SERVER_CERT
194+
//case MySQLOpt.MYSQL_OPT_SSL_VERIFY_SERVER_CERT:
195+
//return MYSQL_OPT_SSL_VERIFY_SERVER_CERT
188196
case MySQLOpt.MYSQL_PLUGIN_DIR:
189197
return MYSQL_PLUGIN_DIR
190198
case MySQLOpt.MYSQL_DEFAULT_AUTH:

Sources/PerfectMySQL/MySQLStmt.swift

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,15 @@ public final class MySQLStmt {
210210
/// Executes a prepared statement, binding parameters if needed
211211
public func execute() -> Bool {
212212
if paramBindsOffset > 0 {
213-
guard let paramBinds = self.paramBinds,
214-
0 == mysql_stmt_bind_param(ptr, paramBinds) else {
213+
guard let paramBinds = self.paramBinds else {
215214
return false
216215
}
216+
var res = mysql_stmt_bind_param(ptr, paramBinds)
217+
var FALSE = 0
218+
let cmp = memcmp(&res, &FALSE, MemoryLayout.size(ofValue: res))
219+
guard cmp == 0 else {
220+
return false
221+
}
217222
}
218223
let r = mysql_stmt_execute(ptr)
219224
return r == 0
@@ -354,7 +359,7 @@ public final class MySQLStmt {
354359
private func genBind<T: UnsignedInteger>(type: enum_field_types, value: T) -> MYSQL_BIND {
355360
var bind = MYSQL_BIND()
356361
bind.buffer_type = type
357-
bind.is_unsigned = 1
362+
memset(&(bind.is_unsigned), 1, MemoryLayout.size(ofValue: bind.is_unsigned))
358363
bind.buffer_length = UInt(MemoryLayout<T>.size)
359364
let b = UnsafeMutablePointer<T>.allocate(capacity: 1)
360365
b.initialize(to: value)
@@ -634,7 +639,9 @@ public final class MySQLStmt {
634639

635640
private func valueForField(_ n: Int) -> Any? {
636641
var bind = binds[n]
637-
guard bind.is_null.pointee == 0 else {
642+
var FALSE = 0
643+
var cmp = memcmp(bind.is_null, &FALSE, MemoryLayout.size(ofValue: bind.is_null.pointee))
644+
guard cmp == 0 else {
638645
return nil
639646
}
640647
let genType = mysqlTypeToGeneralType(bind.buffer_type)
@@ -649,7 +656,8 @@ public final class MySQLStmt {
649656
default: return nil
650657
}
651658
case .integer:
652-
if bind.is_unsigned == 1 {
659+
cmp = memcmp(&(bind.is_unsigned), &FALSE, MemoryLayout.size(ofValue: bind.is_unsigned))
660+
if cmp != 0 {
653661
switch bind.buffer_type {
654662
case MYSQL_TYPE_LONGLONG:
655663
return bind.buffer.assumingMemoryBound(to: UInt64.self).pointee
@@ -762,8 +770,8 @@ public final class MySQLStmt {
762770
var bind = bindField(field)
763771
bind.length = lengthBuffers.advanced(by: i)
764772
bind.length.initialize(to: 0)
765-
bind.is_null = isNullBuffers.advanced(by: i)
766-
bind.is_null.initialize(to: 0)
773+
bind.is_null = unsafeBitCast(isNullBuffers.advanced(by: i), to: type(of: bind.is_null))
774+
memset(bind.is_null, 0, MemoryLayout.size(ofValue: bind.is_null.pointee))
767775

768776
let genType = mysqlTypeToGeneralType(field)
769777
switch genType {
@@ -777,7 +785,7 @@ public final class MySQLStmt {
777785
}
778786
case .integer:
779787
if (f.flags & _UNSIGNED_FLAG) == _UNSIGNED_FLAG {
780-
bind.is_unsigned = 1
788+
memset(&(bind.is_unsigned), 1, MemoryLayout.size(ofValue: bind.is_unsigned))
781789
switch bind.buffer_type {
782790
case MYSQL_TYPE_LONGLONG:
783791
bind = bindBuffer(bind, type: UInt64.self);
@@ -825,7 +833,10 @@ public final class MySQLStmt {
825833
default: break
826834
}
827835
case .integer:
828-
if bind.is_unsigned == 1 {
836+
var FALSE = 0
837+
var res = bind.is_unsigned
838+
let cmp = memcmp(&res, &FALSE, MemoryLayout.size(ofValue: res))
839+
if cmp != 0 {
829840
switch bind.buffer_type {
830841
case MYSQL_TYPE_LONGLONG:
831842
bind.buffer.assumingMemoryBound(to: UInt64.self).deallocate()

Sources/PerfectMySQL/PerfectMySQL.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,11 @@ public enum MySQLOpt {
9696
MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
9797
MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
9898
MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
99-
MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
100-
MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
99+
//MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
100+
//MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
101101
MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
102-
MYSQL_OPT_SSL_VERIFY_SERVER_CERT, MYSQL_PLUGIN_DIR, MYSQL_DEFAULT_AUTH,
102+
//MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
103+
MYSQL_PLUGIN_DIR, MYSQL_DEFAULT_AUTH,
103104
MYSQL_OPT_BIND,
104105
MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CERT,
105106
MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CAPATH, MYSQL_OPT_SSL_CIPHER,

Tests/PerfectMySQLTests/PerfectMySQLTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ class PerfectMySQLTests: XCTestCase {
281281
let mysql = rawMySQL
282282
XCTAssert(mysql.query(statement: "DROP TABLE IF EXISTS all_data_types"))
283283

284-
let qres = mysql.query(statement: "CREATE TABLE `all_data_types` (`varchar` VARCHAR( 20 ),\n`tinyint` TINYINT,\n`text` TEXT,\n`date` DATE,\n`smallint` SMALLINT,\n`mediumint` MEDIUMINT,\n`int` INT,\n`bigint` BIGINT,\n`ubigint` BIGINT UNSIGNED,\n`float` FLOAT( 10, 2 ),\n`double` DOUBLE,\n`decimal` DECIMAL( 10, 2 ),\n`datetime` DATETIME,\n`timestamp` TIMESTAMP,\n`time` TIME,\n`year` YEAR,\n`char` CHAR( 10 ),\n`tinyblob` TINYBLOB,\n`tinytext` TINYTEXT,\n`blob` BLOB,\n`mediumblob` MEDIUMBLOB,\n`mediumtext` MEDIUMTEXT,\n`longblob` LONGBLOB,\n`longtext` LONGTEXT,\n`enum` ENUM( '1', '2', '3' ),\n`set` SET( '1', '2', '3' ),\n`bool` BOOL,\n`binary` BINARY( 20 ),\n`varbinary` VARBINARY( 20 ) ) ENGINE = MYISAM")
284+
let qres = mysql.query(statement: "CREATE TABLE `all_data_types` (`varchar` VARCHAR( 32 ),\n`tinyint` TINYINT,\n`text` TEXT,\n`date` DATE,\n`smallint` SMALLINT,\n`mediumint` MEDIUMINT,\n`int` INT,\n`bigint` BIGINT,\n`ubigint` BIGINT UNSIGNED,\n`float` FLOAT( 10, 2 ),\n`double` DOUBLE,\n`decimal` DECIMAL( 10, 2 ),\n`datetime` DATETIME,\n`timestamp` TIMESTAMP,\n`time` TIME,\n`year` YEAR,\n`char` CHAR( 10 ),\n`tinyblob` TINYBLOB,\n`tinytext` TINYTEXT,\n`blob` BLOB,\n`mediumblob` MEDIUMBLOB,\n`mediumtext` MEDIUMTEXT,\n`longblob` LONGBLOB,\n`longtext` LONGTEXT,\n`enum` ENUM( '1', '2', '3' ),\n`set` SET( '1', '2', '3' ),\n`bool` BOOL,\n`binary` BINARY( 20 ),\n`varbinary` VARBINARY( 20 ) ) ENGINE = MYISAM")
285285
XCTAssert(qres == true, mysql.errorMessage())
286286

287287
for _ in 1...2 {

0 commit comments

Comments
 (0)