Skip to content

Commit 446c5c0

Browse files
authored
Remove FIRMessaging_FAIL macro, log result code (#265)
This removes the `FIRMessaging_FAIL` macro which was using `__builtin_trap()`, and replaced with `NSAssert` calls. These `NSAssert` calls may not get called in release builds, and so we also log them with FIRLogger error messages. The RMQ database open error result code is now parsed and included in the error message to help us identify causes for #199 .
1 parent e69e62b commit 446c5c0

File tree

4 files changed

+48
-21
lines changed

4 files changed

+48
-21
lines changed

Example/Messaging/Tests/FIRMessagingFakeSocket.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ - (void)connectToHost:(NSString *)host
6666
self.inStream = CFBridgingRelease(inputStreamRef);
6767
self.outStream = CFBridgingRelease(outputStreamRef);
6868
if (!self.inStream || !self.outStream) {
69-
FIRMessaging_FAIL(@"cannot create a fake socket");
69+
NSAssert(NO, @"Cannot create a fake socket");
7070
return;
7171
}
7272

Firebase/Messaging/FIRMMessageCode.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ typedef NS_ENUM(NSInteger, FIRMessagingMessageCode) {
132132
kFIRMessagingMessageCodeRmq2PersistentStore004 = 13004, // I-FCM013004
133133
kFIRMessagingMessageCodeRmq2PersistentStore005 = 13005, // I-FCM013005
134134
kFIRMessagingMessageCodeRmq2PersistentStore006 = 13006, // I-FCM013006
135+
kFIRMessagingMessageCodeRmq2PersistentStoreErrorCreatingDatabase = 13007, // I-FCM013007
136+
kFIRMessagingMessageCodeRmq2PersistentStoreErrorOpeningDatabase = 13008, // I-FCM013008
137+
kFIRMessagingMessageCodeRmq2PersistentStoreInvalidRmqDirectory = 13009, // I-FCM013009
138+
kFIRMessagingMessageCodeRmq2PersistentStoreErrorCreatingTable = 13010, // I-FCM013010
135139
// FIRMessagingRmqManager.m
136140
kFIRMessagingMessageCodeRmqManager000 = 14000, // I-FCM014000
137141
// FIRMessagingSecureSocket.m

Firebase/Messaging/FIRMessagingDefines.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,6 @@
2727
#endif // FIRMessaging_VERBOSE_LOGGING
2828

2929

30-
// FIRMessaging_FAIL
31-
#ifdef DEBUG
32-
#define FIRMessaging_FAIL(format, ...) \
33-
do { \
34-
NSLog(format, ##__VA_ARGS__); \
35-
__builtin_trap(); \
36-
} while (false)
37-
#else
38-
#define FIRMessaging_FAIL(...) do { } while (0)
39-
#endif
40-
41-
4230
// WEAKIFY & STRONGIFY
4331
// Helper macro.
4432
#define _FIRMessaging_WEAKNAME(VAR) VAR ## _weak_

Firebase/Messaging/FIRMessagingRmq2PersistentStore.m

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@
102102
// table data handlers
103103
typedef void(^FCMOutgoingRmqMessagesTableHandler)(int64_t rmqId, int8_t tag, NSData *data);
104104

105+
// Utility to create an NSString from a sqlite3 result code
106+
NSString * _Nonnull FIRMessagingStringFromSQLiteResult(int result) {
107+
const char *errorStr = sqlite3_errstr(result);
108+
NSString *errorString = [NSString stringWithFormat:@"%d%s", result, errorStr];
109+
return errorString;
110+
}
111+
105112
@interface FIRMessagingRmq2PersistentStore () {
106113
sqlite3 *_database;
107114
}
@@ -187,6 +194,7 @@ + (NSString *)pathForDatabase:(NSString *)dbName inDirectory:(FIRMessagingRmqDir
187194
NSArray *paths;
188195
NSArray *components;
189196
NSString *dbNameWithExtension = [NSString stringWithFormat:@"%@.sqlite", dbName];
197+
NSString *errorMessage;
190198

191199
switch (directory) {
192200
case FIRMessagingRmqDirectoryDocuments:
@@ -206,7 +214,11 @@ + (NSString *)pathForDatabase:(NSString *)dbName inDirectory:(FIRMessagingRmqDir
206214
break;
207215

208216
default:
209-
FIRMessaging_FAIL(@"Invalid directory type %zd", directory);
217+
errorMessage = [NSString stringWithFormat:@"Invalid directory type %zd", directory];
218+
FIRMessagingLoggerError(kFIRMessagingMessageCodeRmq2PersistentStoreInvalidRmqDirectory,
219+
@"%@",
220+
errorMessage);
221+
NSAssert(NO, errorMessage);
210222
break;
211223
}
212224

@@ -219,9 +231,13 @@ - (void)createTableWithName:(NSString *)tableName command:(NSString *)command {
219231
if (sqlite3_exec(_database, [createDatabase UTF8String], NULL, NULL, &error) != SQLITE_OK) {
220232
// remove db before failing
221233
[self removeDatabase];
222-
FIRMessaging_FAIL(@"Couldn't create table: %@ %@",
223-
kCreateTableOutgoingRmqMessages,
224-
[NSString stringWithCString:error encoding:NSUTF8StringEncoding]);
234+
NSString *errorMessage = [NSString stringWithFormat:@"Couldn't create table: %@ %@",
235+
kCreateTableOutgoingRmqMessages,
236+
[NSString stringWithCString:error encoding:NSUTF8StringEncoding]];
237+
FIRMessagingLoggerError(kFIRMessagingMessageCodeRmq2PersistentStoreErrorCreatingTable,
238+
@"%@",
239+
errorMessage);
240+
NSAssert(NO, errorMessage);
225241
}
226242
}
227243

@@ -256,8 +272,17 @@ - (void)openDatabase:(NSString *)dbName {
256272
BOOL didOpenDatabase = YES;
257273
if (![fileManager fileExistsAtPath:path]) {
258274
// We've to separate between different versions here because of backwards compatbility issues.
259-
if (sqlite3_open([path UTF8String], &_database) != SQLITE_OK) {
260-
FIRMessaging_FAIL(@"%@ Could not open rmq database: %@", kFCMRmqStoreTag, path);
275+
int result = sqlite3_open([path UTF8String], &_database);
276+
if (result != SQLITE_OK) {
277+
NSString *errorString = FIRMessagingStringFromSQLiteResult(result);
278+
NSString *errorMessage =
279+
[NSString stringWithFormat:@"Could not open existing RMQ database at path %@, error: %@",
280+
path,
281+
errorString];
282+
FIRMessagingLoggerError(kFIRMessagingMessageCodeRmq2PersistentStoreErrorOpeningDatabase,
283+
@"%@",
284+
errorMessage);
285+
NSAssert(NO, errorMessage);
261286
didOpenDatabase = NO;
262287
return;
263288
}
@@ -267,8 +292,18 @@ - (void)openDatabase:(NSString *)dbName {
267292
[self createTableWithName:kTableLastRmqId command:kCreateTableLastRmqId];
268293
[self createTableWithName:kTableS2DRmqIds command:kCreateTableS2DRmqIds];
269294
} else {
270-
if (sqlite3_open([path UTF8String], &_database) != SQLITE_OK) {
271-
FIRMessaging_FAIL(@"%@ Could not open rmq database: %@", kFCMRmqStoreTag, path);
295+
// Calling sqlite3_open should create the database, since the file doesn't exist.
296+
int result = sqlite3_open([path UTF8String], &_database);
297+
if (result != SQLITE_OK) {
298+
NSString *errorString = FIRMessagingStringFromSQLiteResult(result);
299+
NSString *errorMessage =
300+
[NSString stringWithFormat:@"Could not create RMQ database at path %@, error: %@",
301+
path,
302+
errorString];
303+
FIRMessagingLoggerError(kFIRMessagingMessageCodeRmq2PersistentStoreErrorCreatingDatabase,
304+
@"%@",
305+
errorMessage);
306+
NSAssert(NO, errorMessage);
272307
didOpenDatabase = NO;
273308
} else {
274309
[self updateDbWithStringRmqID];

0 commit comments

Comments
 (0)