Skip to content

Commit

Permalink
Minor refactoring
Browse files Browse the repository at this point in the history
Tests refactoring. Add reconnect method.
  • Loading branch information
oleggnidets-okta committed Dec 22, 2021
1 parent bd2cf9c commit 39d41a5
Show file tree
Hide file tree
Showing 11 changed files with 137 additions and 132 deletions.
84 changes: 50 additions & 34 deletions OHMySQL/Sources/OHMySQLQueryContext.m
Original file line number Diff line number Diff line change
Expand Up @@ -72,45 +72,50 @@ - (instancetype)initWithParentQueryContext:(OHMySQLQueryContext *)parentQueryCon
#pragma mark - Execute

- (BOOL)executeQueryRequest:(OHMySQLQueryRequest *)query error:(NSError *__autoreleasing *)error {
NSParameterAssert(query.queryString);
MYSQL *_mysql = self.mysql;
if (!self.storeCoordinator.isConnected || !_mysql) {
__unused NSString *errorString = [NSString stringWithUTF8String:mysql_error(_mysql)];
OHLogError(@"The connection is broken: %@", errorString);
OHLogError(@"Cannot connect to DB. Check your configuration properties.");


if (error) {
*error = contextError(@"Cannot connect to DB. Check your configuration properties.");
}
@synchronized(self) {
NSParameterAssert(query.queryString);

return NO;
}

CFAbsoluteTime queryStartTime = CFAbsoluteTimeGetCurrent();
mysql_set_server_option(_mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);

// To get proper length of string in different languages.
NSInteger queryStringLength = strlen(query.queryString.UTF8String);
NSInteger errorCode = mysql_real_query(_mysql, query.queryString.UTF8String, queryStringLength);

query.timeline.queryDuration = CFAbsoluteTimeGetCurrent() - queryStartTime;
if (errorCode) {
NSString *mysqlError = [NSString stringWithUTF8String:mysql_error(_mysql)];
OHLogError(@"Cannot execute query: %@", mysqlError);
if (error) {
*error = contextError(mysqlError);
if ((!self.storeCoordinator.isConnected || !self.mysql) && ![self.storeCoordinator reconnect]) {
__unused NSString *errorString = [NSString stringWithUTF8String:mysql_error(self.mysql)];
OHLogError(@"The connection is broken: %@", errorString);
OHLogError(@"Cannot connect to DB. Check your configuration properties.");

if (error) {
*error = contextError(@"Cannot connect to DB. Check your configuration properties.");
}

return NO;
}

CFAbsoluteTime queryStartTime = CFAbsoluteTimeGetCurrent();
mysql_set_server_option(self.mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);

// To get proper length of string in different languages.
NSInteger queryStringLength = strlen(query.queryString.UTF8String);
NSInteger errorCode = mysql_real_query(self.mysql, query.queryString.UTF8String, queryStringLength);

query.timeline.queryDuration = CFAbsoluteTimeGetCurrent() - queryStartTime;
if (errorCode) {
[self.storeCoordinator reconnect];

NSString *mysqlError = [NSString stringWithUTF8String:mysql_error(self.mysql)];
OHLogError(@"Cannot execute query: %@", mysqlError);

if (error) {
*error = contextError(mysqlError);
return NO;
}
}

return YES;
}

return YES;
}

- (NSArray<NSDictionary<NSString *,id> *> *)executeQueryRequestAndFetchResult:(OHMySQLQueryRequest *)query error:(NSError *__autoreleasing *)error {
// http://dev.mysql.com/doc/refman/5.7/en/c-api-threaded-clients.html
@synchronized (self) {
[self executeQueryRequest:query error:error];

if (error && *error) {
OHLogError(@"Cannot get results: %@", *error);
return nil;
Expand Down Expand Up @@ -264,10 +269,21 @@ - (BOOL)deleteObject:(NSObject<OHMappingProtocol> *)object error:(NSError **)err

- (NSArray<NSDictionary<NSString *,id> *> *)fetchResult {
MYSQL *mysql = self.mysql;
if (!mysql) { return nil; }

MYSQL_RES *result = mysql_store_result(mysql);
if (!result) { return nil; }
if (!mysql) {
return nil;
}

MYSQL_RES *result = mysql_use_result(mysql);
if (!result) {
if (mysql_field_count(mysql) == 0) {
OHLog(@"%@ rows affected\n", self.affectedRows);
} else {
OHLogWarn(@"Could not retrieve result set\n");
}

return nil;
}

MYSQL_FIELD *fields = mysql_fetch_fields(result);

Expand All @@ -280,8 +296,8 @@ - (BOOL)deleteObject:(NSObject<OHMappingProtocol> *)object error:(NSError **)err
for (CFIndex i=0; i<countOfFields; ++i) {
NSString *key = [NSString stringWithUTF8String:fields[i].name];
id value = [OHMySQLSerialization objectFromCString:row[i]
field:&fields[i]
encoding:self.storeCoordinator.encoding];
field:&fields[i]
encoding:self.storeCoordinator.encoding];
jsonDict[key] = value;
}

Expand Down
5 changes: 4 additions & 1 deletion OHMySQL/Sources/OHMySQLStoreCoordinator.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@

- (nonnull instancetype)initWithUser:(nonnull OHMySQLUser *)user;

/// Attempts to disconnect and then establish a connection to a MySQL database engine. Also tries establish SSL connection if it is specified.
- (BOOL)reconnect;

/// Attempts to establish a connection to a MySQL database engine. Also tries establish SSL connection if it is specified.
- (void)connect;
- (BOOL)connect;

/**
* @param database Name of the target db.
Expand Down
12 changes: 10 additions & 2 deletions OHMySQL/Sources/OHMySQLStoreCoordinator.m
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,13 @@ - (void)dealloc {
mysql_library_end;
}

- (void)connect {
- (BOOL)reconnect {
[self disconnect];

return [self connect];
}

- (BOOL)connect {
mysql_library_init;

_mysql = mysql_init(NULL);
Expand All @@ -65,13 +71,15 @@ - (void)connect {

if (!mysql_real_connect(_mysql, _user.serverName.UTF8String, _user.userName.UTF8String, _user.password.UTF8String, _user.dbName.UTF8String, (unsigned int)_user.port, _user.socket.UTF8String, 0)) {
OHLogError(@"Failed to connect to database: Error: %s", mysql_error(_mysql));
return ;
return NO;
}

OHLog(@"MySQL cipher: %s", mysql_get_ssl_cipher(_mysql));

self.store = [[OHMySQLStore alloc] initWithMySQL:_mysql];
[self configureConnectionForEncoding:self.encoding];

return YES;
}

- (void)configureConnectionForEncoding:(CharsetEncoding)encoding {
Expand Down
2 changes: 0 additions & 2 deletions SampleProject/OHMySQL.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -715,7 +715,6 @@
BUNDLE_LOADER = "$(TEST_HOST)";
DEBUG_INFORMATION_FORMAT = dwarf;
INFOPLIST_FILE = "OHMySQLTests/Supporting Files/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SyS.OHMySQLTests;
PRODUCT_NAME = "$(TARGET_NAME)";
Expand All @@ -729,7 +728,6 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
INFOPLIST_FILE = "OHMySQLTests/Supporting Files/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SyS.OHMySQLTests;
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
<Testables>
<TestableReference
skipped = "NO">
Expand Down
11 changes: 7 additions & 4 deletions SampleProject/OHMySQLTests/Helpers/XCTestCase+Database_Basic.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

NSString *const kDatabaseName = @"mysql";
NSString *const kTableName = @"TestTable";
NSString *const kDropTableString = @"DROP TABLE `TestTable`;";
NSString *const kDropTableString = @"DROP TABLE `TestTable`";

NSString * const kCreateTestTableQuery = @"CREATE TABLE `TestTable` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `name` varchar(255) default NULL, `surname` varchar(255) default NULL, `age` mediumint default NULL, PRIMARY KEY (`id`) ) AUTO_INCREMENT=1; INSERT INTO `TestTable` (`name`,`surname`,`age`) VALUES ('Bradley','Oneill',90),('Levi','Moses',25),('Orlando','Cummings',9),('Hasad','Maldonado',5),('Carlos','Lowery',57),('Axel','Doyle',74),('Hasad','Booth',60),('Hall','Walters',84),('Dustin','Velazquez',84),('Randall','Riggs',91); INSERT INTO `TestTable` (`name`,`surname`,`age`) VALUES ('Harper','Knowles',67),('Jasper','Massey',95),('Hop','Casey',2),('Timon','Bright',25),('Lionel','Mcintyre',74),('Denton','Kennedy',35),('Ethan','Jarvis',43),('Hasad','Stevens',56),('Benedict','Dudley',29),('Shad','Pace',94); INSERT INTO `TestTable` (`name`,`surname`,`age`) VALUES ('Asher','Williamson',70),('Sylvester','Baldwin',37),('Lucas','Bush',62),('Nissim','Harvey',43),('Anthony','Adkins',4),('Norman','Snow',26),('Coby','Oneill',82);";

static NSString *const kEmptyTableString = @"CREATE TABLE `TestTable` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `name` varchar(255) default NULL, `surname` varchar(255) default NULL, `age` mediumint default NULL, PRIMARY KEY (`id`) ) AUTO_INCREMENT=1; INSERT INTO `TestTable` (`name`,`surname`,`age`);";
static NSString *const kEmptyTableString = @"CREATE TABLE `TestTable` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `name` varchar(255) default NULL, `surname` varchar(255) default NULL, `age` mediumint default NULL, PRIMARY KEY (`id`) ) AUTO_INCREMENT=1; INSERT INTO `TestTable` (`name`,`surname`,`age`)";

@implementation XCTestCase (Database_Basic)

Expand Down Expand Up @@ -61,16 +61,19 @@ - (void)createTableWithQuery:(NSString *)query {
// when
OHMySQLQueryRequest *queryRequest = [[OHMySQLQueryRequest alloc] initWithQueryString:query];
NSError *error;

BOOL success = [self.mainQueryContext executeQueryRequest:queryRequest error:&error];

// then
XCTAssert(success && !error);
}

- (void)dropTableNamed:(NSString *)tableName {
NSString *dropQueryString = [NSString stringWithFormat:@"DROP TABLE %@;", tableName];
NSString *dropQueryString = [NSString stringWithFormat:@"DROP TABLE %@", tableName];
OHMySQLQueryRequest *dropQueryRequest =[[OHMySQLQueryRequest alloc] initWithQueryString:dropQueryString];
[self.mainQueryContext executeQueryRequest:dropQueryRequest error:nil];

NSError *error;
[self.mainQueryContext executeQueryRequest:dropQueryRequest error:&error];
}

- (void)createEmptyTable {
Expand Down
47 changes: 25 additions & 22 deletions SampleProject/OHMySQLTests/OHMySQLTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,28 +24,27 @@ @implementation OHMySQLTests
- (void)setUp {
[super setUp];
[OHMySQLTests configureDatabase];

[self createTable];
}

- (void)tearDown {

[super tearDown];
}

#pragma mark - Testing

- (void)test00SelectDatabase {
- (void)testSelectDatabase {
[self dropTableNamed:kTableName];

// when
OHResultErrorType result = [self.storeCoordinator selectDataBase:kDatabaseName];

// then
XCTAssert(result == OHResultErrorTypeNone);
}

- (void)test01CreateTable {
[self createTable];
}

- (void)test10InsertNewRow {
- (void)testInsertNewRow {
// given
NSDictionary *insertSet = @{ @"name" : @"Oleg", @"surname" : @"Hnidets", @"age" : @"21" };
OHMySQLQueryRequest *queryRequest = [OHMySQLQueryRequestFactory INSERT:kTableName
Expand All @@ -63,7 +62,7 @@ - (void)test10InsertNewRow {
XCTAssert(lastInsertedID > 0);
}

- (void)test11UpdateAll {
- (void)testUpdateAll {
// given
NSDictionary *updateSet = @{ @"name" : @"Oleg", @"surname" : @"Hnidets", @"age" : @"21" };
OHMySQLQueryRequest *queryRequest = [OHMySQLQueryRequestFactory UPDATE:kTableName
Expand All @@ -78,21 +77,22 @@ - (void)test11UpdateAll {
AssertIfError();
}

- (void)test12AffectedRows {
- (void)testAffectedRows {
// when
NSInteger numberOfRows = [self.mainQueryContext affectedRows].integerValue;
XCTAssert(numberOfRows != -1);
}

- (void)test13CountRecords {
- (void)testCountRecords {
// when
NSNumber *countOfObjects = [self countOfObjects];
// then
XCTAssertNotEqualObjects(countOfObjects, @0);
}

- (void)test14UpdateAllWithCondition {
- (void)testUpdateAllWithCondition {
// given
[self testInsertNewRow];
OHMySQLQueryRequest *queryRequest = [OHMySQLQueryRequestFactory UPDATE:kTableName set:@{ @"age" : @"25" } condition:@"name='Oleg'"];

// when
Expand All @@ -103,8 +103,9 @@ - (void)test14UpdateAllWithCondition {
AssertIfError();
}

- (void)test15DeleAllWithCondition {
- (void)testDeleAllWithCondition {
// given
[self testInsertNewRow];
OHMySQLQueryRequest *queryRequest = [OHMySQLQueryRequestFactory DELETE:kTableName condition:@"name='Oleg'"];

// when
Expand All @@ -116,15 +117,17 @@ - (void)test15DeleAllWithCondition {
AssertIfError();
}

- (void)test16Refresh {
- (void)testRefresh {
// when
[self testInsertNewRow];
OHResultErrorType result = [self.storeCoordinator refresh:OHRefreshOptionTables];
// then
XCTAssert(result == OHResultErrorTypeNone);
}

- (void)test17DeleteAllRecords {
- (void)testDeleteAllRecords {
// given
[self testInsertNewRow];
OHMySQLQueryRequest *queryRequest = [OHMySQLQueryRequestFactory DELETE:kTableName condition:nil];

// when
Expand All @@ -135,7 +138,7 @@ - (void)test17DeleteAllRecords {
AssertIfError();
}

- (void)test18DropTable {
- (void)testDropTable {
// given
OHMySQLQueryRequest *queryRequest =[[OHMySQLQueryRequest alloc] initWithQueryString:kDropTableString];

Expand All @@ -152,7 +155,7 @@ - (void)test18DropTable {
XCTAssert(totalTime > 0);
}

- (void)test19IncorrectPlainQuery {
- (void)testIncorrectPlainQuery {
// given
NSString *incorrectQueryString = [kDropTableString stringByReplacingOccurrencesOfString:@"TABLE" withString:@"TABL"];
OHMySQLQueryRequest *queryRequest =[[OHMySQLQueryRequest alloc] initWithQueryString:incorrectQueryString];
Expand All @@ -165,7 +168,7 @@ - (void)test19IncorrectPlainQuery {
AssertIfNoError();
}

- (void)test20IncorrectSelectQuery {
- (void)testIncorrectSelectQuery {
// given
NSString *incorrectQueryString = @"SELECT qwe FROM 'something'";
OHMySQLQueryRequest *queryRequest =[[OHMySQLQueryRequest alloc] initWithQueryString:incorrectQueryString];
Expand All @@ -178,14 +181,14 @@ - (void)test20IncorrectSelectQuery {
AssertIfNoError();
}

- (void)test21StoreInformation {
- (void)testStoreInformation {
// given
OHMySQLStore *store = self.storeCoordinator.store;
// then
XCTAssert(store.serverInfo && store.hostInfo && store.protocolInfo && store.serverVersion && store.status);
}

- (void)test22NotConnected {
- (void)testNotConnected {
// given
[self.storeCoordinator disconnect];
OHMySQLQueryRequest *queryRequest =[[OHMySQLQueryRequest alloc] initWithQueryString:kDropTableString];
Expand All @@ -194,11 +197,11 @@ - (void)test22NotConnected {
NSError *error;
BOOL success = [self.mainQueryContext executeQueryRequest:queryRequest error:&error];
// then
AssertIfNoError();
XCTAssert(success == NO);
AssertIfError();
XCTAssert(success == YES);
}

- (void)test23CheckConnection {
- (void)testCheckConnection {
// given
[self.storeCoordinator disconnect];

Expand Down
Loading

0 comments on commit 39d41a5

Please sign in to comment.