@josuelmm/capacitor-background-geolocation 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
- package/LICENSE +17 -0
- package/NOTICE.md +32 -0
- package/Package.swift +45 -0
- package/README.md +402 -0
- package/android/build.gradle +79 -0
- package/android/proguard-rules.pro +1 -0
- package/android/src/main/AndroidManifest.xml +83 -0
- package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
- package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
- package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
- package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
- package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
- package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
- package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
- package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
- package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
- package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
- package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
- package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
- package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
- package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
- package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
- package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
- package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
- package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
- package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
- package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
- package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
- package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
- package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
- package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
- package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
- package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
- package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
- package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
- package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
- package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
- package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/values/strings.xml +15 -0
- package/android/src/main/res/xml/authenticator.xml +7 -0
- package/android/src/main/res/xml/syncadapter.xml +9 -0
- package/dist/esm/definitions.d.ts +1052 -0
- package/dist/esm/definitions.js +142 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +92 -0
- package/dist/esm/web.js +242 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +415 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +418 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
- package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
- package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
- package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
- package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
- package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
- package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
- package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
- package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
- package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
- package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
- package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
- package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
- package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
- package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
- package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
- package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
- package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
- package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
- package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
- package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
- package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
- package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
- package/package.json +82 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURSQLiteLocationDAO.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 10/06/16.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <sqlite3.h>
|
|
9
|
+
#import <CoreLocation/CoreLocation.h>
|
|
10
|
+
#import "MAURSQLiteHelper.h"
|
|
11
|
+
#import "MAURGeolocationOpenHelper.h"
|
|
12
|
+
#import "MAURSQLiteLocationDAO.h"
|
|
13
|
+
#import "MAURLocationContract.h"
|
|
14
|
+
|
|
15
|
+
@implementation MAURSQLiteLocationDAO {
|
|
16
|
+
FMDatabaseQueue* queue;
|
|
17
|
+
MAURGeolocationOpenHelper *helper;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
#pragma mark Singleton Methods
|
|
21
|
+
|
|
22
|
+
+ (instancetype) sharedInstance
|
|
23
|
+
{
|
|
24
|
+
static MAURSQLiteLocationDAO *instance = nil;
|
|
25
|
+
static dispatch_once_t onceToken;
|
|
26
|
+
dispatch_once(&onceToken, ^{
|
|
27
|
+
instance = [[self alloc] init];
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
return instance;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
- (id) init {
|
|
34
|
+
if (self = [super init]) {
|
|
35
|
+
helper = [[MAURGeolocationOpenHelper alloc] init];
|
|
36
|
+
queue = [helper getWritableDatabase];
|
|
37
|
+
}
|
|
38
|
+
return self;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
- (NSArray<MAURLocation*>*) getValidLocations
|
|
42
|
+
{
|
|
43
|
+
__block NSMutableArray* locations = [[NSMutableArray alloc] init];
|
|
44
|
+
|
|
45
|
+
NSString *sql = [[self getLocationSelectString] stringByAppendingString: @" WHERE " @LC_COLUMN_NAME_STATUS @" = ? ORDER BY " @LC_COLUMN_NAME_RECORDED_AT];
|
|
46
|
+
|
|
47
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
48
|
+
FMResultSet *rs = [database executeQuery:sql, [NSString stringWithFormat:@"%ld", MAURLocationPostPending]];
|
|
49
|
+
while([rs next]) {
|
|
50
|
+
MAURLocation *location = [self convertToLocation:rs];
|
|
51
|
+
[locations addObject:location];
|
|
52
|
+
}
|
|
53
|
+
// TODO
|
|
54
|
+
// NSLog(@"Retrieving locations failed code: %d: message: %s", sqlite3_errcode(database), sqlite3_errmsg(database));
|
|
55
|
+
|
|
56
|
+
[rs close];
|
|
57
|
+
}];
|
|
58
|
+
|
|
59
|
+
return locations;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
- (NSArray<MAURLocation*>*) getAllLocations
|
|
63
|
+
{
|
|
64
|
+
__block NSMutableArray* locations = [[NSMutableArray alloc] init];
|
|
65
|
+
|
|
66
|
+
NSString *sql = [[self getLocationSelectString] stringByAppendingString: @" ORDER BY " @LC_COLUMN_NAME_RECORDED_AT];
|
|
67
|
+
|
|
68
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
69
|
+
FMResultSet *rs = [database executeQuery:sql];
|
|
70
|
+
while([rs next]) {
|
|
71
|
+
MAURLocation *location = [self convertToLocation:rs];
|
|
72
|
+
[locations addObject:location];
|
|
73
|
+
}
|
|
74
|
+
// TODO
|
|
75
|
+
// NSLog(@"Retrieving locations failed code: %d: message: %s", sqlite3_errcode(database), sqlite3_errmsg(database));
|
|
76
|
+
|
|
77
|
+
[rs close];
|
|
78
|
+
}];
|
|
79
|
+
|
|
80
|
+
return locations;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
- (NSArray<MAURLocation*>*) getLocationsForSync
|
|
84
|
+
{
|
|
85
|
+
__block NSMutableArray* locations = [[NSMutableArray alloc] init];
|
|
86
|
+
|
|
87
|
+
[queue inTransaction:^(FMDatabase *database, BOOL *rollback) {
|
|
88
|
+
NSString *sql = [[self getLocationSelectString] stringByAppendingString: @" WHERE " @LC_COLUMN_NAME_STATUS @" = ? ORDER BY " @LC_COLUMN_NAME_RECORDED_AT];
|
|
89
|
+
|
|
90
|
+
FMResultSet *rs = [database executeQuery:sql, [NSString stringWithFormat:@"%ld", MAURLocationPostPending]];
|
|
91
|
+
while([rs next]) {
|
|
92
|
+
MAURLocation *location = [self convertToLocation:rs];
|
|
93
|
+
[locations addObject:location];
|
|
94
|
+
}
|
|
95
|
+
[rs close];
|
|
96
|
+
|
|
97
|
+
// v4.5.1 FIX (CRITICAL): mark the rows we just selected as SyncPending — NOT Deleted.
|
|
98
|
+
// The previous code UPDATEd the WHOLE table to Deleted before the upload had even started,
|
|
99
|
+
// losing every fix on HTTP failure / network drop. Now:
|
|
100
|
+
// PostPending → SyncPending (in-flight, do not re-include)
|
|
101
|
+
// on success in the network task: SyncPending → Deleted (deleteSyncedLocationsBefore:)
|
|
102
|
+
// on failure in the network task: SyncPending → PostPending (restoreFailedSyncLocations)
|
|
103
|
+
NSString *upd = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
|
|
104
|
+
if (![database executeUpdate:upd,
|
|
105
|
+
[NSString stringWithFormat:@"%ld", MAURLocationSyncPending],
|
|
106
|
+
[NSString stringWithFormat:@"%ld", MAURLocationPostPending]]) {
|
|
107
|
+
NSLog(@"Marking PostPending → SyncPending failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
|
|
108
|
+
}
|
|
109
|
+
}];
|
|
110
|
+
|
|
111
|
+
return locations;
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
- (NSNumber*) getLocationsForSyncCount
|
|
116
|
+
{
|
|
117
|
+
__block NSNumber* rowCount = nil;
|
|
118
|
+
|
|
119
|
+
[queue inTransaction:^(FMDatabase *database, BOOL *rollback) {
|
|
120
|
+
NSString *sql = @"SELECT COUNT(*) FROM " @LC_TABLE_NAME @" WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
|
|
121
|
+
|
|
122
|
+
FMResultSet *rs = [database executeQuery:sql, [NSString stringWithFormat:@"%ld", MAURLocationPostPending]];
|
|
123
|
+
if ([rs next]) {
|
|
124
|
+
rowCount = [NSNumber numberWithInt:[rs intForColumnIndex:0]];
|
|
125
|
+
}
|
|
126
|
+
[rs close];
|
|
127
|
+
}];
|
|
128
|
+
|
|
129
|
+
return rowCount;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
- (NSNumber*) persistLocation:(MAURLocation*)location intoDatabase:(FMDatabase*)database
|
|
133
|
+
{
|
|
134
|
+
NSNumber* locationId = nil;
|
|
135
|
+
NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
|
|
136
|
+
NSNumber *recordedAt = [NSNumber numberWithDouble:timestamp];
|
|
137
|
+
|
|
138
|
+
NSString *sql = @"INSERT INTO " @LC_TABLE_NAME @" ("
|
|
139
|
+
@LC_COLUMN_NAME_TIME
|
|
140
|
+
@COMMA_SEP @LC_COLUMN_NAME_ACCURACY
|
|
141
|
+
@COMMA_SEP @LC_COLUMN_NAME_SPEED
|
|
142
|
+
@COMMA_SEP @LC_COLUMN_NAME_BEARING
|
|
143
|
+
@COMMA_SEP @LC_COLUMN_NAME_ALTITUDE
|
|
144
|
+
@COMMA_SEP @LC_COLUMN_NAME_LATITUDE
|
|
145
|
+
@COMMA_SEP @LC_COLUMN_NAME_LONGITUDE
|
|
146
|
+
@COMMA_SEP @LC_COLUMN_NAME_PROVIDER
|
|
147
|
+
@COMMA_SEP @LC_COLUMN_NAME_LOCATION_PROVIDER
|
|
148
|
+
@COMMA_SEP @LC_COLUMN_NAME_STATUS
|
|
149
|
+
@COMMA_SEP @LC_COLUMN_NAME_RECORDED_AT
|
|
150
|
+
@COMMA_SEP @LC_COLUMN_NAME_EVENTS_JSON
|
|
151
|
+
@COMMA_SEP @LC_COLUMN_NAME_BATTERY_LEVEL
|
|
152
|
+
@COMMA_SEP @LC_COLUMN_NAME_IS_CHARGING
|
|
153
|
+
@") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
|
154
|
+
|
|
155
|
+
// v4.5: serialize driving events array to JSON for SQLite storage.
|
|
156
|
+
NSString *eventsJson = nil;
|
|
157
|
+
if (location.drivingEvents != nil && [location.drivingEvents count] > 0) {
|
|
158
|
+
NSError *jerr = nil;
|
|
159
|
+
NSData *jd = [NSJSONSerialization dataWithJSONObject:location.drivingEvents options:0 error:&jerr];
|
|
160
|
+
if (jd != nil) eventsJson = [[NSString alloc] initWithData:jd encoding:NSUTF8StringEncoding];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
BOOL success = [database executeUpdate:sql,
|
|
164
|
+
[NSNumber numberWithDouble:[location.time timeIntervalSince1970]],
|
|
165
|
+
location.accuracy,
|
|
166
|
+
location.speed,
|
|
167
|
+
location.heading,
|
|
168
|
+
location.altitude,
|
|
169
|
+
location.latitude,
|
|
170
|
+
location.longitude,
|
|
171
|
+
location.provider ?: [NSNull null],
|
|
172
|
+
location.locationProvider ?: [NSNull null],
|
|
173
|
+
location.isValid == YES ? @(1) : @(0),
|
|
174
|
+
recordedAt,
|
|
175
|
+
eventsJson ?: [NSNull null],
|
|
176
|
+
location.batteryLevel ?: [NSNull null],
|
|
177
|
+
location.isCharging ?: [NSNull null]
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
if (success) {
|
|
181
|
+
locationId = [NSNumber numberWithLongLong:[database lastInsertRowId]];
|
|
182
|
+
} else {
|
|
183
|
+
NSLog(@"Inserting location %@ failed code: %d: message: %@", location.time, [database lastErrorCode], [database lastErrorMessage]);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return locationId;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
- (NSNumber*) persistLocation:(MAURLocation*)location
|
|
190
|
+
{
|
|
191
|
+
__block NSNumber* locationId = nil;
|
|
192
|
+
|
|
193
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
194
|
+
locationId = [self persistLocation:location intoDatabase:database];
|
|
195
|
+
}];
|
|
196
|
+
|
|
197
|
+
return locationId;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
- (NSNumber*) persistLocation:(MAURLocation*)location limitRows:(NSInteger)maxRows
|
|
201
|
+
{
|
|
202
|
+
__block NSNumber *locationId;
|
|
203
|
+
NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
|
|
204
|
+
NSNumber *recordedAt = [NSNumber numberWithDouble:timestamp];
|
|
205
|
+
|
|
206
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
207
|
+
NSInteger rowCount = 0;
|
|
208
|
+
NSString *sql = @"SELECT COUNT(*) FROM " @LC_TABLE_NAME;
|
|
209
|
+
|
|
210
|
+
FMResultSet *rs = [database executeQuery:sql];
|
|
211
|
+
if ([rs next]) {
|
|
212
|
+
rowCount = [rs intForColumnIndex:0];
|
|
213
|
+
}
|
|
214
|
+
[rs close];
|
|
215
|
+
|
|
216
|
+
if (rowCount < maxRows) {
|
|
217
|
+
locationId = [self persistLocation:location intoDatabase:database];
|
|
218
|
+
return;
|
|
219
|
+
} else if (rowCount > maxRows) {
|
|
220
|
+
sql = [NSString stringWithFormat:@"DELETE FROM %1$@ WHERE %2$@ IN (SELECT %2$@ FROM %1$@ ORDER BY %3$@ LIMIT %4$ld);VACUUM;",
|
|
221
|
+
@LC_TABLE_NAME, @LC_COLUMN_NAME_ID, @LC_COLUMN_NAME_RECORDED_AT, (rowCount - maxRows)];
|
|
222
|
+
if (![database executeStatements:sql]) {
|
|
223
|
+
NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// get oldest location id to be overwritten
|
|
228
|
+
sql = @"SELECT MIN(" @LC_COLUMN_NAME_ID ") FROM " @LC_TABLE_NAME @" WHERE " @LC_COLUMN_NAME_RECORDED_AT
|
|
229
|
+
@" = (SELECT min(" @LC_COLUMN_NAME_RECORDED_AT @") FROM " @LC_TABLE_NAME @" )";
|
|
230
|
+
rs = [database executeQuery:sql];
|
|
231
|
+
if ([rs next]) {
|
|
232
|
+
locationId = [NSNumber numberWithLongLong:[rs longLongIntForColumnIndex:0]];
|
|
233
|
+
}
|
|
234
|
+
[rs close];
|
|
235
|
+
|
|
236
|
+
sql = @"UPDATE " @LC_TABLE_NAME @" SET "
|
|
237
|
+
@LC_COLUMN_NAME_TIME @EQ_BIND
|
|
238
|
+
@COMMA_SEP @LC_COLUMN_NAME_ACCURACY @EQ_BIND
|
|
239
|
+
@COMMA_SEP @LC_COLUMN_NAME_SPEED @EQ_BIND
|
|
240
|
+
@COMMA_SEP @LC_COLUMN_NAME_BEARING @EQ_BIND
|
|
241
|
+
@COMMA_SEP @LC_COLUMN_NAME_ALTITUDE @EQ_BIND
|
|
242
|
+
@COMMA_SEP @LC_COLUMN_NAME_LATITUDE @EQ_BIND
|
|
243
|
+
@COMMA_SEP @LC_COLUMN_NAME_LONGITUDE @EQ_BIND
|
|
244
|
+
@COMMA_SEP @LC_COLUMN_NAME_PROVIDER @EQ_BIND
|
|
245
|
+
@COMMA_SEP @LC_COLUMN_NAME_LOCATION_PROVIDER @EQ_BIND
|
|
246
|
+
@COMMA_SEP @LC_COLUMN_NAME_STATUS @EQ_BIND
|
|
247
|
+
@COMMA_SEP @LC_COLUMN_NAME_RECORDED_AT @EQ_BIND
|
|
248
|
+
@COMMA_SEP @LC_COLUMN_NAME_EVENTS_JSON @EQ_BIND
|
|
249
|
+
@COMMA_SEP @LC_COLUMN_NAME_BATTERY_LEVEL @EQ_BIND
|
|
250
|
+
@COMMA_SEP @LC_COLUMN_NAME_IS_CHARGING @EQ_BIND
|
|
251
|
+
@" WHERE " @LC_COLUMN_NAME_ID @EQ_BIND;
|
|
252
|
+
|
|
253
|
+
// v4.5.1: serialize events for UPDATE path so old values don't bleed onto new locations
|
|
254
|
+
NSString *eventsJsonForUpdate = nil;
|
|
255
|
+
if (location.drivingEvents != nil && [location.drivingEvents count] > 0) {
|
|
256
|
+
NSError *jerr = nil;
|
|
257
|
+
NSData *jd = [NSJSONSerialization dataWithJSONObject:location.drivingEvents options:0 error:&jerr];
|
|
258
|
+
if (jd != nil) eventsJsonForUpdate = [[NSString alloc] initWithData:jd encoding:NSUTF8StringEncoding];
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
BOOL success = [database executeUpdate:sql,
|
|
262
|
+
[NSNumber numberWithDouble:[location.time timeIntervalSince1970]],
|
|
263
|
+
location.accuracy,
|
|
264
|
+
location.speed,
|
|
265
|
+
location.heading,
|
|
266
|
+
location.altitude,
|
|
267
|
+
location.latitude,
|
|
268
|
+
location.longitude,
|
|
269
|
+
location.provider ?: [NSNull null],
|
|
270
|
+
location.locationProvider ?: [NSNull null],
|
|
271
|
+
location.isValid == YES ? @(1) : @(0),
|
|
272
|
+
recordedAt,
|
|
273
|
+
eventsJsonForUpdate ?: [NSNull null],
|
|
274
|
+
location.batteryLevel ?: [NSNull null],
|
|
275
|
+
location.isCharging ?: [NSNull null],
|
|
276
|
+
locationId
|
|
277
|
+
];
|
|
278
|
+
|
|
279
|
+
if (!success) {
|
|
280
|
+
NSLog(@"Inserting location %@ failed code: %d: message: %@", location.time, [database lastErrorCode], [database lastErrorMessage]);
|
|
281
|
+
locationId = [NSNumber numberWithInt:-1];
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
}];
|
|
285
|
+
|
|
286
|
+
return locationId;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
- (BOOL) deleteLocation:(NSNumber*)locationId error:(NSError * __autoreleasing *)outError
|
|
290
|
+
{
|
|
291
|
+
__block BOOL success;
|
|
292
|
+
NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_ID @" = ?";
|
|
293
|
+
|
|
294
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
295
|
+
if ([database executeUpdate:sql, [NSString stringWithFormat:@"%ld", MAURLocationDeleted], locationId]) {
|
|
296
|
+
success = YES;
|
|
297
|
+
} else {
|
|
298
|
+
int errorCode = [database lastErrorCode];
|
|
299
|
+
NSString *errorMessage = [database lastErrorMessage];
|
|
300
|
+
NSLog(@"Delete location %@ failed code: %d: message: %@", locationId, errorCode, errorMessage);
|
|
301
|
+
|
|
302
|
+
if (outError != NULL) {
|
|
303
|
+
NSDictionary *errorDictionary = @{
|
|
304
|
+
NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil)
|
|
305
|
+
};
|
|
306
|
+
*outError = [NSError errorWithDomain:Domain code:errorCode userInfo:errorDictionary];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
success = NO;
|
|
310
|
+
}
|
|
311
|
+
}];
|
|
312
|
+
|
|
313
|
+
return success;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
- (BOOL) deleteAllLocations:(NSError * __autoreleasing *)outError
|
|
317
|
+
{
|
|
318
|
+
__block BOOL success;
|
|
319
|
+
NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ?";
|
|
320
|
+
|
|
321
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
322
|
+
if ([database executeUpdate:sql, [NSString stringWithFormat:@"%ld", MAURLocationDeleted]]) {
|
|
323
|
+
success = YES;
|
|
324
|
+
} else {
|
|
325
|
+
int errorCode = [database lastErrorCode];
|
|
326
|
+
NSString *errorMessage = [database lastErrorMessage];
|
|
327
|
+
NSLog(@"Deleting all locations failed code: %d: message: %@", errorCode, errorMessage);
|
|
328
|
+
|
|
329
|
+
if (outError != NULL) {
|
|
330
|
+
NSDictionary *errorDictionary = @{
|
|
331
|
+
NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil)
|
|
332
|
+
};
|
|
333
|
+
*outError = [NSError errorWithDomain:Domain code:errorCode userInfo:errorDictionary];
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
success = NO;
|
|
337
|
+
}
|
|
338
|
+
}];
|
|
339
|
+
|
|
340
|
+
return success;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
- (BOOL) deleteSyncedLocationsBefore:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError
|
|
344
|
+
{
|
|
345
|
+
__block BOOL success = YES;
|
|
346
|
+
// v4.5.1 — operate on SyncPending (the rows the network task is/was uploading), not on
|
|
347
|
+
// PostPending (those are still queued for real-time POST and must NOT be touched).
|
|
348
|
+
NSString *sql = @"UPDATE " @LC_TABLE_NAME
|
|
349
|
+
@" SET " @LC_COLUMN_NAME_STATUS @" = ? "
|
|
350
|
+
@" WHERE " @LC_COLUMN_NAME_STATUS @" = ? AND " @LC_COLUMN_NAME_RECORDED_AT @" <= ?";
|
|
351
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
352
|
+
if (![database executeUpdate:sql,
|
|
353
|
+
@(MAURLocationDeleted),
|
|
354
|
+
@(MAURLocationSyncPending),
|
|
355
|
+
@(cutoff)]) {
|
|
356
|
+
int errorCode = [database lastErrorCode];
|
|
357
|
+
NSString *errorMessage = [database lastErrorMessage];
|
|
358
|
+
NSLog(@"deleteSyncedLocationsBefore failed code: %d: message: %@", errorCode, errorMessage);
|
|
359
|
+
if (outError != NULL) {
|
|
360
|
+
*outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
|
|
361
|
+
}
|
|
362
|
+
success = NO;
|
|
363
|
+
}
|
|
364
|
+
}];
|
|
365
|
+
return success;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
- (BOOL) restoreStaleSyncLocationsOlderThan:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError
|
|
369
|
+
{
|
|
370
|
+
// v4.5.1 — rows left as SyncPending because the previous sync's task was killed
|
|
371
|
+
// (app suspended mid-upload, OS process death, manual kill) never reach their
|
|
372
|
+
// success/failure callback. Call at the start of each sync window to rescue them.
|
|
373
|
+
__block BOOL success = YES;
|
|
374
|
+
NSString *sql = @"UPDATE " @LC_TABLE_NAME
|
|
375
|
+
@" SET " @LC_COLUMN_NAME_STATUS @" = ? "
|
|
376
|
+
@" WHERE " @LC_COLUMN_NAME_STATUS @" = ? AND " @LC_COLUMN_NAME_RECORDED_AT @" < ?";
|
|
377
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
378
|
+
if (![database executeUpdate:sql,
|
|
379
|
+
@(MAURLocationPostPending),
|
|
380
|
+
@(MAURLocationSyncPending),
|
|
381
|
+
@(cutoff)]) {
|
|
382
|
+
int errorCode = [database lastErrorCode];
|
|
383
|
+
NSString *errorMessage = [database lastErrorMessage];
|
|
384
|
+
NSLog(@"restoreStaleSyncLocations failed code: %d: message: %@", errorCode, errorMessage);
|
|
385
|
+
if (outError != NULL) {
|
|
386
|
+
*outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
|
|
387
|
+
}
|
|
388
|
+
success = NO;
|
|
389
|
+
}
|
|
390
|
+
}];
|
|
391
|
+
return success;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
- (BOOL) restoreFailedSyncLocations:(NSError * __autoreleasing *)outError
|
|
395
|
+
{
|
|
396
|
+
// v4.5.1 — undo the in-flight transition: SyncPending → PostPending so the next sync window
|
|
397
|
+
// (or real-time post) re-tries them.
|
|
398
|
+
__block BOOL success = YES;
|
|
399
|
+
NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
|
|
400
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
401
|
+
if (![database executeUpdate:sql, @(MAURLocationPostPending), @(MAURLocationSyncPending)]) {
|
|
402
|
+
int errorCode = [database lastErrorCode];
|
|
403
|
+
NSString *errorMessage = [database lastErrorMessage];
|
|
404
|
+
NSLog(@"restoreFailedSyncLocations failed code: %d: message: %@", errorCode, errorMessage);
|
|
405
|
+
if (outError != NULL) {
|
|
406
|
+
*outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
|
|
407
|
+
}
|
|
408
|
+
success = NO;
|
|
409
|
+
}
|
|
410
|
+
}];
|
|
411
|
+
return success;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
- (BOOL) deletePendingSyncLocations:(NSError * __autoreleasing *)outError
|
|
415
|
+
{
|
|
416
|
+
__block BOOL success = YES;
|
|
417
|
+
NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
|
|
418
|
+
|
|
419
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
420
|
+
if (![database executeUpdate:sql, [NSString stringWithFormat:@"%ld", MAURLocationDeleted], [NSString stringWithFormat:@"%ld", MAURLocationPostPending]]) {
|
|
421
|
+
int errorCode = [database lastErrorCode];
|
|
422
|
+
NSString *errorMessage = [database lastErrorMessage];
|
|
423
|
+
NSLog(@"deletePendingSyncLocations failed code: %d: message: %@", errorCode, errorMessage);
|
|
424
|
+
if (outError != NULL) {
|
|
425
|
+
*outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
|
|
426
|
+
}
|
|
427
|
+
success = NO;
|
|
428
|
+
}
|
|
429
|
+
}];
|
|
430
|
+
|
|
431
|
+
return success;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
- (BOOL) clearDatabase
|
|
435
|
+
{
|
|
436
|
+
__block BOOL success;
|
|
437
|
+
|
|
438
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
439
|
+
NSString *sql = [NSString stringWithFormat: @"DROP TABLE %@", @LC_TABLE_NAME];
|
|
440
|
+
if (![database executeStatements:sql]) {
|
|
441
|
+
NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
|
|
442
|
+
}
|
|
443
|
+
sql = [MAURLocationContract createTableSQL];
|
|
444
|
+
if (![database executeStatements:sql]) {
|
|
445
|
+
NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
|
|
446
|
+
success = NO;
|
|
447
|
+
} else {
|
|
448
|
+
success = YES;
|
|
449
|
+
}
|
|
450
|
+
}];
|
|
451
|
+
|
|
452
|
+
return success;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
- (NSString*) getDatabaseName
|
|
456
|
+
{
|
|
457
|
+
return [helper getDatabaseName];
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
- (NSString*) getDatabasePath
|
|
461
|
+
{
|
|
462
|
+
return [helper getDatabasePath];
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
- (NSString*) getLocationSelectString {
|
|
466
|
+
return @"SELECT " @LC_COLUMN_NAME_ID
|
|
467
|
+
@COMMA_SEP @LC_COLUMN_NAME_TIME
|
|
468
|
+
@COMMA_SEP @LC_COLUMN_NAME_ACCURACY
|
|
469
|
+
@COMMA_SEP @LC_COLUMN_NAME_SPEED
|
|
470
|
+
@COMMA_SEP @LC_COLUMN_NAME_BEARING
|
|
471
|
+
@COMMA_SEP @LC_COLUMN_NAME_ALTITUDE
|
|
472
|
+
@COMMA_SEP @LC_COLUMN_NAME_LATITUDE
|
|
473
|
+
@COMMA_SEP @LC_COLUMN_NAME_LONGITUDE
|
|
474
|
+
@COMMA_SEP @LC_COLUMN_NAME_PROVIDER
|
|
475
|
+
@COMMA_SEP @LC_COLUMN_NAME_LOCATION_PROVIDER
|
|
476
|
+
@COMMA_SEP @LC_COLUMN_NAME_STATUS
|
|
477
|
+
@COMMA_SEP @LC_COLUMN_NAME_RECORDED_AT
|
|
478
|
+
@COMMA_SEP @LC_COLUMN_NAME_EVENTS_JSON
|
|
479
|
+
@COMMA_SEP @LC_COLUMN_NAME_BATTERY_LEVEL
|
|
480
|
+
@COMMA_SEP @LC_COLUMN_NAME_IS_CHARGING
|
|
481
|
+
@" FROM " @LC_TABLE_NAME;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
- (MAURLocation*) convertToLocation:(FMResultSet*)rs {
|
|
485
|
+
MAURLocation *location = [[MAURLocation alloc] init];
|
|
486
|
+
location.locationId = [NSNumber numberWithLongLong:[rs longLongIntForColumnIndex:0]];
|
|
487
|
+
NSTimeInterval timestamp = [rs doubleForColumnIndex:1];
|
|
488
|
+
location.time = [NSDate dateWithTimeIntervalSince1970:timestamp];
|
|
489
|
+
location.accuracy = [NSNumber numberWithDouble:[rs doubleForColumnIndex:2]];
|
|
490
|
+
location.speed = [NSNumber numberWithDouble:[rs doubleForColumnIndex:3]];
|
|
491
|
+
location.heading = [NSNumber numberWithDouble:[rs doubleForColumnIndex:4]];
|
|
492
|
+
location.altitude = [NSNumber numberWithDouble:[rs doubleForColumnIndex:5]];
|
|
493
|
+
location.latitude = [NSNumber numberWithDouble:[rs doubleForColumnIndex:6]];
|
|
494
|
+
location.longitude = [NSNumber numberWithDouble:[rs doubleForColumnIndex:7]];
|
|
495
|
+
location.provider = [rs stringForColumnIndex:8];
|
|
496
|
+
location.locationProvider = [NSNumber numberWithInt:[rs intForColumnIndex:9]];
|
|
497
|
+
location.isValid = [rs intForColumnIndex:10] == 1 ? YES : NO;
|
|
498
|
+
NSTimeInterval recordedAt = [rs longForColumnIndex:11];
|
|
499
|
+
location.recordedAt = [NSDate dateWithTimeIntervalSince1970:recordedAt];
|
|
500
|
+
// v4.5: events / battery / charging
|
|
501
|
+
NSString *eventsJson = [rs stringForColumnIndex:12];
|
|
502
|
+
if (eventsJson != nil && eventsJson.length > 0) {
|
|
503
|
+
NSError *jerr = nil;
|
|
504
|
+
id parsed = [NSJSONSerialization JSONObjectWithData:[eventsJson dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&jerr];
|
|
505
|
+
if ([parsed isKindOfClass:[NSMutableArray class]]) location.drivingEvents = parsed;
|
|
506
|
+
else if ([parsed isKindOfClass:[NSArray class]]) location.drivingEvents = [parsed mutableCopy];
|
|
507
|
+
}
|
|
508
|
+
if (![rs columnIndexIsNull:13]) location.batteryLevel = @([rs intForColumnIndex:13]);
|
|
509
|
+
if (![rs columnIndexIsNull:14]) location.isCharging = @([rs intForColumnIndex:14] == 1);
|
|
510
|
+
return location;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
- (void) dealloc {
|
|
514
|
+
[helper close];
|
|
515
|
+
[queue close];
|
|
516
|
+
helper = nil;
|
|
517
|
+
queue = nil;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
@end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURSQLiteOpenHelper.h
|
|
3
|
+
// version: 1.0.0
|
|
4
|
+
//
|
|
5
|
+
// A helper class to manage database creation and version management.
|
|
6
|
+
// heavily inspired by Android implementation
|
|
7
|
+
// https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/database/sqlite/SQLiteOpenHelper.java
|
|
8
|
+
//
|
|
9
|
+
// Note: Not for direct use, but as subclass instead (abstract class in java terminology)
|
|
10
|
+
//
|
|
11
|
+
// Created by Marian Hello on 22/06/16.
|
|
12
|
+
//
|
|
13
|
+
|
|
14
|
+
#ifndef MAURSQLiteOpenHelper_h
|
|
15
|
+
#define MAURSQLiteOpenHelper_h
|
|
16
|
+
|
|
17
|
+
#import <Foundation/Foundation.h>
|
|
18
|
+
#import "FMDB.h"
|
|
19
|
+
|
|
20
|
+
@interface MAURSQLiteOpenHelper : NSObject
|
|
21
|
+
|
|
22
|
+
- (instancetype)init:(NSString*)name version:(NSInteger)version;
|
|
23
|
+
- (NSDictionary*) getDatabaseMetadata;
|
|
24
|
+
- (NSString*) getDatabaseName;
|
|
25
|
+
- (NSString*) getDatabasePath;
|
|
26
|
+
- (FMDatabaseQueue*) getReadableDatabase;
|
|
27
|
+
- (FMDatabaseQueue*) getWritableDatabase;
|
|
28
|
+
- (void) close;
|
|
29
|
+
|
|
30
|
+
@end
|
|
31
|
+
|
|
32
|
+
#endif /* MAURSQLiteOpenHelper_h */
|