@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,335 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURSQLiteConfigurationDAO.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 01/12/2017.
|
|
6
|
+
// Copyright © 2017 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <sqlite3.h>
|
|
10
|
+
#import <CoreLocation/CoreLocation.h>
|
|
11
|
+
#import "MAURSQLiteHelper.h"
|
|
12
|
+
#import "MAURGeolocationOpenHelper.h"
|
|
13
|
+
#import "MAURSQLiteConfigurationDAO.h"
|
|
14
|
+
#import "MAURConfigurationContract.h"
|
|
15
|
+
#import "MAURConfig.h"
|
|
16
|
+
|
|
17
|
+
@implementation MAURSQLiteConfigurationDAO {
|
|
18
|
+
FMDatabaseQueue* queue;
|
|
19
|
+
MAURGeolocationOpenHelper *helper;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#pragma mark Singleton Methods
|
|
23
|
+
|
|
24
|
+
+ (instancetype) sharedInstance
|
|
25
|
+
{
|
|
26
|
+
static MAURSQLiteConfigurationDAO *instance = nil;
|
|
27
|
+
static dispatch_once_t onceToken;
|
|
28
|
+
dispatch_once(&onceToken, ^{
|
|
29
|
+
instance = [[self alloc] init];
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
return instance;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (id) init {
|
|
36
|
+
if (self = [super init]) {
|
|
37
|
+
helper = [[MAURGeolocationOpenHelper alloc] init];
|
|
38
|
+
queue = [helper getWritableDatabase];
|
|
39
|
+
}
|
|
40
|
+
return self;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
- (BOOL) persistConfiguration:(MAURConfig*)config
|
|
44
|
+
{
|
|
45
|
+
__block BOOL success = NO;
|
|
46
|
+
|
|
47
|
+
NSError *error = nil;
|
|
48
|
+
|
|
49
|
+
NSString *httpHeadersString = [config getHttpHeadersAsString:&error];
|
|
50
|
+
if (error != nil) {
|
|
51
|
+
NSLog(@"Http headers serialization error: %@", error);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
NSString *templateString = [config getTemplateAsString:&error];
|
|
56
|
+
if (error != nil) {
|
|
57
|
+
NSLog(@"Template serialization error: %@", error);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
NSString *sql = @"INSERT OR REPLACE INTO " @CC_TABLE_NAME @" ("
|
|
62
|
+
@CC_COLUMN_NAME_ID
|
|
63
|
+
@COMMA_SEP @CC_COLUMN_NAME_RADIUS
|
|
64
|
+
@COMMA_SEP @CC_COLUMN_NAME_DISTANCE_FILTER
|
|
65
|
+
@COMMA_SEP @CC_COLUMN_NAME_DESIRED_ACCURACY
|
|
66
|
+
@COMMA_SEP @CC_COLUMN_NAME_DEBUG
|
|
67
|
+
@COMMA_SEP @CC_COLUMN_NAME_ACTIVITY_TYPE
|
|
68
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_TITLE
|
|
69
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_TEXT
|
|
70
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_LARGE
|
|
71
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_SMALL
|
|
72
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_COLOR
|
|
73
|
+
@COMMA_SEP @CC_COLUMN_NAME_STOP_TERMINATE
|
|
74
|
+
@COMMA_SEP @CC_COLUMN_NAME_START_BOOT
|
|
75
|
+
@COMMA_SEP @CC_COLUMN_NAME_START_FOREGROUND
|
|
76
|
+
@COMMA_SEP @CC_COLUMN_NAME_STOP_ON_STILL
|
|
77
|
+
@COMMA_SEP @CC_COLUMN_NAME_LOCATION_PROVIDER
|
|
78
|
+
@COMMA_SEP @CC_COLUMN_NAME_INTERVAL
|
|
79
|
+
@COMMA_SEP @CC_COLUMN_NAME_FASTEST_INTERVAL
|
|
80
|
+
@COMMA_SEP @CC_COLUMN_NAME_ACTIVITIES_INTERVAL
|
|
81
|
+
@COMMA_SEP @CC_COLUMN_NAME_URL
|
|
82
|
+
@COMMA_SEP @CC_COLUMN_NAME_SYNC_URL
|
|
83
|
+
@COMMA_SEP @CC_COLUMN_NAME_SYNC_THRESHOLD
|
|
84
|
+
@COMMA_SEP @CC_COLUMN_NAME_SYNC_ENABLED
|
|
85
|
+
@COMMA_SEP @CC_COLUMN_NAME_HEADERS
|
|
86
|
+
@COMMA_SEP @CC_COLUMN_NAME_SAVE_BATTERY
|
|
87
|
+
@COMMA_SEP @CC_COLUMN_NAME_MAX_LOCATIONS
|
|
88
|
+
@COMMA_SEP @CC_COLUMN_NAME_PAUSE_LOCATION_UPDATES
|
|
89
|
+
@COMMA_SEP @CC_COLUMN_NAME_TEMPLATE
|
|
90
|
+
@COMMA_SEP @CC_COLUMN_NAME_LAST_UPDATED_AT
|
|
91
|
+
@COMMA_SEP @CC_COLUMN_NAME_CONFIG_JSON
|
|
92
|
+
@") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,DateTime('now'),?)";
|
|
93
|
+
|
|
94
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
95
|
+
success = [database executeUpdate:sql,
|
|
96
|
+
@(1), // config id
|
|
97
|
+
[config hasStationaryRadius] ? config.stationaryRadius : @CC_COLUMN_NAME_NULLABLE,
|
|
98
|
+
[config hasDistanceFilter] ? config.distanceFilter : @CC_COLUMN_NAME_NULLABLE,
|
|
99
|
+
[config hasDesiredAccuracy] ? config.desiredAccuracy : @CC_COLUMN_NAME_NULLABLE,
|
|
100
|
+
[config hasDebug] ? config._debug : @CC_COLUMN_NAME_NULLABLE,
|
|
101
|
+
[config hasActivityType] ? config.activityType : @CC_COLUMN_NAME_NULLABLE,
|
|
102
|
+
[NSNull null], // unsupported notificationTitle
|
|
103
|
+
[NSNull null], // unsupported notificationText
|
|
104
|
+
[NSNull null], // unsupported notificationIconLarge
|
|
105
|
+
[NSNull null], // unsupported notificationIconSmall
|
|
106
|
+
[NSNull null], // unsupported notificationIconColor
|
|
107
|
+
[config hasStopOnTerminate] ? config._stopOnTerminate : @CC_COLUMN_NAME_NULLABLE,
|
|
108
|
+
[NSNull null], // unsupported startOnBoot,
|
|
109
|
+
[NSNull null], // unsupported startForeground
|
|
110
|
+
[NSNull null], // unsupported stopOnStillActivity
|
|
111
|
+
[config hasLocationProvider] ? config.locationProvider : @CC_COLUMN_NAME_NULLABLE,
|
|
112
|
+
[NSNull null], // unsupported interval
|
|
113
|
+
[NSNull null], // unsupported fastestInterval
|
|
114
|
+
[config hasActivitiesInterval] ? config.activitiesInterval : @CC_COLUMN_NAME_NULLABLE,
|
|
115
|
+
[config hasUrl] ? config.url : @CC_COLUMN_NAME_NULLABLE,
|
|
116
|
+
[config hasSyncUrl] ? config.syncUrl : @CC_COLUMN_NAME_NULLABLE,
|
|
117
|
+
[config hasSyncThreshold] ? config.syncThreshold : @CC_COLUMN_NAME_NULLABLE,
|
|
118
|
+
[config hasSyncEnabled] ? [NSNumber numberWithBool:[config syncEnabled]] : @CC_COLUMN_NAME_NULLABLE,
|
|
119
|
+
(httpHeadersString != nil) ? httpHeadersString : @CC_COLUMN_NAME_NULLABLE,
|
|
120
|
+
[config hasSaveBatteryOnBackground] ? config._saveBatteryOnBackground : @CC_COLUMN_NAME_NULLABLE,
|
|
121
|
+
[config hasMaxLocations] ? config.maxLocations : @CC_COLUMN_NAME_NULLABLE,
|
|
122
|
+
[config hasPauseLocationUpdates] ? config._pauseLocationUpdates : @CC_COLUMN_NAME_NULLABLE,
|
|
123
|
+
(templateString != nil) ? templateString : @CC_COLUMN_NAME_NULLABLE,
|
|
124
|
+
// v4.5: full Config as JSON for paridad con Android
|
|
125
|
+
[self serializeConfigToJson:config]
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
if (success) {
|
|
129
|
+
NSLog(@"Configuration persisted succesfuly");
|
|
130
|
+
} else {
|
|
131
|
+
NSLog(@"Persisting configuration has failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
|
|
132
|
+
}
|
|
133
|
+
}];
|
|
134
|
+
|
|
135
|
+
return success;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
- (MAURConfig*) retrieveConfiguration
|
|
139
|
+
{
|
|
140
|
+
__block MAURConfig *config = nil;
|
|
141
|
+
|
|
142
|
+
NSString *sql = @"SELECT "
|
|
143
|
+
CC_COLUMN_NAME_ID
|
|
144
|
+
@COMMA_SEP @CC_COLUMN_NAME_RADIUS
|
|
145
|
+
@COMMA_SEP @CC_COLUMN_NAME_DISTANCE_FILTER
|
|
146
|
+
@COMMA_SEP @CC_COLUMN_NAME_DESIRED_ACCURACY
|
|
147
|
+
@COMMA_SEP @CC_COLUMN_NAME_DEBUG
|
|
148
|
+
@COMMA_SEP @CC_COLUMN_NAME_ACTIVITY_TYPE
|
|
149
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_TITLE
|
|
150
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_TEXT
|
|
151
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_LARGE
|
|
152
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_SMALL
|
|
153
|
+
@COMMA_SEP @CC_COLUMN_NAME_NOTIF_COLOR
|
|
154
|
+
@COMMA_SEP @CC_COLUMN_NAME_STOP_TERMINATE
|
|
155
|
+
@COMMA_SEP @CC_COLUMN_NAME_START_BOOT
|
|
156
|
+
@COMMA_SEP @CC_COLUMN_NAME_START_FOREGROUND
|
|
157
|
+
@COMMA_SEP @CC_COLUMN_NAME_STOP_ON_STILL
|
|
158
|
+
@COMMA_SEP @CC_COLUMN_NAME_LOCATION_PROVIDER
|
|
159
|
+
@COMMA_SEP @CC_COLUMN_NAME_INTERVAL
|
|
160
|
+
@COMMA_SEP @CC_COLUMN_NAME_FASTEST_INTERVAL
|
|
161
|
+
@COMMA_SEP @CC_COLUMN_NAME_ACTIVITIES_INTERVAL
|
|
162
|
+
@COMMA_SEP @CC_COLUMN_NAME_URL
|
|
163
|
+
@COMMA_SEP @CC_COLUMN_NAME_SYNC_URL
|
|
164
|
+
@COMMA_SEP @CC_COLUMN_NAME_SYNC_THRESHOLD
|
|
165
|
+
@COMMA_SEP @CC_COLUMN_NAME_SYNC_ENABLED
|
|
166
|
+
@COMMA_SEP @CC_COLUMN_NAME_HEADERS
|
|
167
|
+
@COMMA_SEP @CC_COLUMN_NAME_SAVE_BATTERY
|
|
168
|
+
@COMMA_SEP @CC_COLUMN_NAME_MAX_LOCATIONS
|
|
169
|
+
@COMMA_SEP @CC_COLUMN_NAME_PAUSE_LOCATION_UPDATES
|
|
170
|
+
@COMMA_SEP @CC_COLUMN_NAME_TEMPLATE
|
|
171
|
+
@COMMA_SEP @CC_COLUMN_NAME_CONFIG_JSON
|
|
172
|
+
@" FROM " @CC_TABLE_NAME @" WHERE " @CC_COLUMN_NAME_ID @" = 1";
|
|
173
|
+
|
|
174
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
175
|
+
FMResultSet *rs = [database executeQuery:sql];
|
|
176
|
+
while([rs next]) {
|
|
177
|
+
config = [[MAURConfig alloc] init];
|
|
178
|
+
if ([self isNonNull:rs columnIndex:1]) {
|
|
179
|
+
config.stationaryRadius = [NSNumber numberWithInt:[rs intForColumnIndex:1]];
|
|
180
|
+
}
|
|
181
|
+
if ([self isNonNull:rs columnIndex:2]) {
|
|
182
|
+
config.distanceFilter = [NSNumber numberWithInt:[rs intForColumnIndex:2]];
|
|
183
|
+
}
|
|
184
|
+
if ([self isNonNull:rs columnIndex:3]) {
|
|
185
|
+
config.desiredAccuracy = [NSNumber numberWithInt:[rs intForColumnIndex:3]];
|
|
186
|
+
}
|
|
187
|
+
if ([self isNonNull:rs columnIndex:4]) {
|
|
188
|
+
config._debug = [NSNumber numberWithBool:[rs intForColumnIndex:4] == 1 ? YES : NO];
|
|
189
|
+
}
|
|
190
|
+
if ([self isNonNull:rs columnIndex:5]) {
|
|
191
|
+
config.activityType = [rs stringForColumnIndex:5];
|
|
192
|
+
}
|
|
193
|
+
if ([self isNonNull:rs columnIndex:11]) {
|
|
194
|
+
config._stopOnTerminate = [NSNumber numberWithBool:[rs intForColumnIndex:11] == 1 ? YES : NO];
|
|
195
|
+
}
|
|
196
|
+
if ([self isNonNull:rs columnIndex:15]) {
|
|
197
|
+
config.locationProvider = [NSNumber numberWithInt:[rs intForColumnIndex:15]];
|
|
198
|
+
}
|
|
199
|
+
if ([self isNonNull:rs columnIndex:18]) {
|
|
200
|
+
config.activitiesInterval = [NSNumber numberWithInt:[rs intForColumnIndex:18]];
|
|
201
|
+
}
|
|
202
|
+
if ([self isNonNull:rs columnIndex:19]) {
|
|
203
|
+
config.url = [rs stringForColumnIndex:19];
|
|
204
|
+
}
|
|
205
|
+
if ([self isNonNull:rs columnIndex:20]) {
|
|
206
|
+
config.syncUrl = [rs stringForColumnIndex:20];
|
|
207
|
+
}
|
|
208
|
+
if ([self isNonNull:rs columnIndex:21]) {
|
|
209
|
+
config.syncThreshold = [NSNumber numberWithInt:[rs intForColumnIndex:21]];
|
|
210
|
+
}
|
|
211
|
+
id syncEnabledVal = [rs objectForColumnIndex:22];
|
|
212
|
+
if (syncEnabledVal != nil && syncEnabledVal != [NSNull null]) {
|
|
213
|
+
config.syncEnabled = [NSNumber numberWithBool:[rs intForColumnIndex:22] == 1 ? YES : NO];
|
|
214
|
+
}
|
|
215
|
+
if ([self isNonNull:rs columnIndex:23]) {
|
|
216
|
+
NSString *httpHeadersString = [rs stringForColumnIndex:23];
|
|
217
|
+
if (httpHeadersString != nil) {
|
|
218
|
+
NSData *jsonHttpHeaders = [httpHeadersString dataUsingEncoding:NSUTF8StringEncoding];
|
|
219
|
+
config.httpHeaders = [NSJSONSerialization JSONObjectWithData:jsonHttpHeaders options:0 error:nil];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if ([self isNonNull:rs columnIndex:24]) {
|
|
223
|
+
config._saveBatteryOnBackground = [NSNumber numberWithBool:[rs intForColumnIndex:24] == 1 ? YES : NO];
|
|
224
|
+
}
|
|
225
|
+
if ([self isNonNull:rs columnIndex:25]) {
|
|
226
|
+
config.maxLocations = [NSNumber numberWithInt:[rs intForColumnIndex:25]];
|
|
227
|
+
}
|
|
228
|
+
if ([self isNonNull:rs columnIndex:26]) {
|
|
229
|
+
config._pauseLocationUpdates = [NSNumber numberWithBool:[rs intForColumnIndex:26] == 1 ? YES : NO];
|
|
230
|
+
}
|
|
231
|
+
if ([self isNonNull:rs columnIndex:27]) {
|
|
232
|
+
NSString *templateAsString = [rs stringForColumnIndex:27];
|
|
233
|
+
if (templateAsString != nil) {
|
|
234
|
+
NSData *jsonTemplate = [templateAsString dataUsingEncoding:NSUTF8StringEncoding];
|
|
235
|
+
config._template = [NSJSONSerialization JSONObjectWithData:jsonTemplate options:0 error:nil];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// v4.5: rehydrate post-3.2 keys from config_json blob (paridad Android).
|
|
239
|
+
// Index 28 is the new column. Strict NULL check (no NULLHACK sentinel for JSON column).
|
|
240
|
+
if (![rs columnIndexIsNull:28]) {
|
|
241
|
+
NSString *jsonString = [rs stringForColumnIndex:28];
|
|
242
|
+
if (jsonString != nil && jsonString.length > 0) {
|
|
243
|
+
[self applyConfigJson:jsonString to:config];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
[rs close];
|
|
249
|
+
}];
|
|
250
|
+
|
|
251
|
+
return config;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// v4.5: serialize all post-3.2 keys to JSON for storage. Mirrors Android ConfigJsonMapper.
|
|
255
|
+
- (NSString*) serializeConfigToJson:(MAURConfig*)config
|
|
256
|
+
{
|
|
257
|
+
NSMutableDictionary *j = [NSMutableDictionary dictionary];
|
|
258
|
+
if (config.httpMethod != nil) j[@"httpMethod"] = config.httpMethod;
|
|
259
|
+
if (config.syncHttpMethod != nil) j[@"syncHttpMethod"] = config.syncHttpMethod;
|
|
260
|
+
if (config.httpMode != nil) j[@"httpMode"] = config.httpMode;
|
|
261
|
+
if (config.syncMode != nil) j[@"syncMode"] = config.syncMode;
|
|
262
|
+
if (config.queryParams != nil) j[@"queryParams"] = config.queryParams;
|
|
263
|
+
if (config.heartbeatInterval != nil) j[@"heartbeatInterval"] = config.heartbeatInterval;
|
|
264
|
+
if (config.mockLocationPolicy != nil) j[@"mockLocationPolicy"] = config.mockLocationPolicy;
|
|
265
|
+
if (config.drivingEvents != nil) j[@"drivingEvents"] = config.drivingEvents;
|
|
266
|
+
if (config.includeBattery != nil) j[@"includeBattery"] = config.includeBattery;
|
|
267
|
+
if (config._showsBackgroundLocationIndicator != nil) j[@"showsBackgroundLocationIndicator"] = config._showsBackgroundLocationIndicator;
|
|
268
|
+
NSError *err = nil;
|
|
269
|
+
NSData *data = [NSJSONSerialization dataWithJSONObject:j options:0 error:&err];
|
|
270
|
+
if (err != nil || data == nil) return @"";
|
|
271
|
+
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
- (void) applyConfigJson:(NSString*)jsonString to:(MAURConfig*)config
|
|
275
|
+
{
|
|
276
|
+
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
|
|
277
|
+
NSError *err = nil;
|
|
278
|
+
NSDictionary *j = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err];
|
|
279
|
+
if (err != nil || ![j isKindOfClass:[NSDictionary class]]) return;
|
|
280
|
+
if (j[@"httpMethod"]) config.httpMethod = j[@"httpMethod"];
|
|
281
|
+
if (j[@"syncHttpMethod"]) config.syncHttpMethod = j[@"syncHttpMethod"];
|
|
282
|
+
if (j[@"httpMode"]) config.httpMode = j[@"httpMode"];
|
|
283
|
+
if (j[@"syncMode"]) config.syncMode = j[@"syncMode"];
|
|
284
|
+
if ([j[@"queryParams"] isKindOfClass:[NSDictionary class]]) config.queryParams = [j[@"queryParams"] mutableCopy];
|
|
285
|
+
if (j[@"heartbeatInterval"]) config.heartbeatInterval = j[@"heartbeatInterval"];
|
|
286
|
+
if (j[@"mockLocationPolicy"]) config.mockLocationPolicy = j[@"mockLocationPolicy"];
|
|
287
|
+
if ([j[@"drivingEvents"] isKindOfClass:[NSDictionary class]]) config.drivingEvents = j[@"drivingEvents"];
|
|
288
|
+
if (j[@"includeBattery"] != nil) config.includeBattery = j[@"includeBattery"];
|
|
289
|
+
if (j[@"showsBackgroundLocationIndicator"] != nil) config._showsBackgroundLocationIndicator = j[@"showsBackgroundLocationIndicator"];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
- (BOOL) clearDatabase
|
|
293
|
+
{
|
|
294
|
+
__block BOOL success;
|
|
295
|
+
|
|
296
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
297
|
+
NSString *sql = [NSString stringWithFormat: @"DELETE FROM %@", @CC_TABLE_NAME];
|
|
298
|
+
if (![database executeStatements:sql]) {
|
|
299
|
+
NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
|
|
300
|
+
success = NO;
|
|
301
|
+
} else {
|
|
302
|
+
success = YES;
|
|
303
|
+
}
|
|
304
|
+
}];
|
|
305
|
+
|
|
306
|
+
return success;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
- (NSString*) getDatabaseName
|
|
310
|
+
{
|
|
311
|
+
return [helper getDatabaseName];
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
- (NSString*) getDatabasePath
|
|
315
|
+
{
|
|
316
|
+
return [helper getDatabasePath];
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
- (BOOL) isNonNull:(FMResultSet*)resultSet columnIndex:(int)index
|
|
320
|
+
{
|
|
321
|
+
if (![[resultSet stringForColumnIndex:index] isEqualToString:@CC_COLUMN_NAME_NULLABLE]) {
|
|
322
|
+
return YES;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return NO;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
- (void) dealloc {
|
|
329
|
+
[helper close];
|
|
330
|
+
[queue close];
|
|
331
|
+
helper = nil;
|
|
332
|
+
queue = nil;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
@end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURSQLiteHelper.h
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 23/06/16.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#ifndef MAURSQLiteHelper_h
|
|
10
|
+
#define MAURSQLiteHelper_h
|
|
11
|
+
|
|
12
|
+
#import <Foundation/Foundation.h>
|
|
13
|
+
|
|
14
|
+
#define COMMA_SEP ","
|
|
15
|
+
#define SPACE_SEP " "
|
|
16
|
+
#define EQ_BIND "= ?"
|
|
17
|
+
|
|
18
|
+
static NSString * const Domain = @"SQLiteHelper";
|
|
19
|
+
|
|
20
|
+
typedef NS_ENUM(NSInteger, SQLType) {
|
|
21
|
+
kReal = 0, kInteger = 1, kText = 2, kDateTime = 3
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@interface SQLColumnType : NSObject
|
|
26
|
+
{
|
|
27
|
+
@protected enum SQLType type;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@property enum SQLType type;
|
|
32
|
+
+ (SQLColumnType*) sqlColumnWithType:(SQLType)type;
|
|
33
|
+
- (NSString*) asString;
|
|
34
|
+
@end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@interface SQLPrimaryKeyColumnType : SQLColumnType
|
|
38
|
+
+ (SQLColumnType*) sqlColumnWithType:(SQLType)type;
|
|
39
|
+
- (NSString*) asString;
|
|
40
|
+
@end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@interface SQLPrimaryKeyAutoIncColumnType : SQLColumnType
|
|
44
|
+
+ (SQLColumnType*) sqlColumnWithType:(SQLType)type;
|
|
45
|
+
- (NSString*) asString;
|
|
46
|
+
@end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
typedef NSArray<NSDictionary<NSString*, SQLColumnType*>*> SQLColumns;
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@interface MAURSQLiteHelper : NSObject
|
|
53
|
+
+ (NSString*) createTableSqlStatement:(NSString*)tableName columns:(SQLColumns*)columns;
|
|
54
|
+
@end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
#endif /* MAURSQLiteHelper_h */
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURSQLiteHelper.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 23/06/16.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
#import "MAURSQLiteHelper.h"
|
|
11
|
+
|
|
12
|
+
@implementation SQLColumnType
|
|
13
|
+
|
|
14
|
+
@synthesize type;
|
|
15
|
+
|
|
16
|
+
+ (SQLColumnType*) sqlColumnWithType:(SQLType)type
|
|
17
|
+
{
|
|
18
|
+
SQLColumnType *instance = [[SQLColumnType alloc] init];
|
|
19
|
+
instance.type = type;
|
|
20
|
+
return instance;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
- (NSString*) asString
|
|
24
|
+
{
|
|
25
|
+
switch (type) {
|
|
26
|
+
case kReal:
|
|
27
|
+
return @"REAL";
|
|
28
|
+
case kText:
|
|
29
|
+
return @"TEXT";
|
|
30
|
+
case kInteger:
|
|
31
|
+
return @"INTEGER";
|
|
32
|
+
case kDateTime:
|
|
33
|
+
return @"DATETIME";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
@end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@implementation SQLPrimaryKeyColumnType : SQLColumnType
|
|
40
|
+
+ (SQLColumnType*) sqlColumnWithType:(SQLType)type
|
|
41
|
+
{
|
|
42
|
+
SQLPrimaryKeyAutoIncColumnType *instance = [[SQLPrimaryKeyAutoIncColumnType alloc] init];
|
|
43
|
+
instance.type = type;
|
|
44
|
+
return instance;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
- (NSString*) asString
|
|
48
|
+
{
|
|
49
|
+
return [NSString stringWithFormat:@"%@ PRIMARY KEY", [super asString]];
|
|
50
|
+
}
|
|
51
|
+
@end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@implementation SQLPrimaryKeyAutoIncColumnType : SQLColumnType
|
|
55
|
+
+ (SQLColumnType*) sqlColumnWithType:(SQLType)type
|
|
56
|
+
{
|
|
57
|
+
SQLPrimaryKeyAutoIncColumnType *instance = [[SQLPrimaryKeyAutoIncColumnType alloc] init];
|
|
58
|
+
instance.type = type;
|
|
59
|
+
return instance;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
- (NSString*) asString
|
|
63
|
+
{
|
|
64
|
+
return [NSString stringWithFormat:@"%@ PRIMARY KEY AUTOINCREMENT", [super asString]];
|
|
65
|
+
}
|
|
66
|
+
@end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@implementation MAURSQLiteHelper
|
|
70
|
+
|
|
71
|
+
+ (NSString*) createTableSqlStatement:(NSString*)tableName columns:(SQLColumns*)columns
|
|
72
|
+
{
|
|
73
|
+
NSMutableArray *sql = [NSMutableArray arrayWithObject: @"CREATE TABLE IF NOT EXISTS"];
|
|
74
|
+
[sql addObjectsFromArray: @[tableName, @"("]];
|
|
75
|
+
NSEnumerator *enumerator = [columns objectEnumerator];
|
|
76
|
+
id column = [enumerator nextObject];
|
|
77
|
+
while (nil != column) {
|
|
78
|
+
NSString *columnName = [column objectForKey: @"name"];
|
|
79
|
+
SQLColumnType *columnType = [column objectForKey: @"type"];
|
|
80
|
+
id nextColumn = [enumerator nextObject];
|
|
81
|
+
if (nil != nextColumn) {
|
|
82
|
+
[sql addObjectsFromArray: @[columnName, [columnType asString], @COMMA_SEP]];
|
|
83
|
+
} else {
|
|
84
|
+
[sql addObjectsFromArray: @[columnName, [columnType asString]]];
|
|
85
|
+
}
|
|
86
|
+
column = nextColumn;
|
|
87
|
+
}
|
|
88
|
+
[sql addObject: @");"];
|
|
89
|
+
|
|
90
|
+
return [sql componentsJoinedByString: @SPACE_SEP];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURSQLiteLocationDAO.h
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 10/06/16.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#ifndef MAURSQLiteLocationDAO_h
|
|
9
|
+
#define MAURSQLiteLocationDAO_h
|
|
10
|
+
|
|
11
|
+
#import <Foundation/Foundation.h>
|
|
12
|
+
#import "FMDB.h"
|
|
13
|
+
#import "MAURLocation.h"
|
|
14
|
+
|
|
15
|
+
@class Location;
|
|
16
|
+
|
|
17
|
+
@interface MAURSQLiteLocationDAO : NSObject
|
|
18
|
+
|
|
19
|
+
+ (instancetype) sharedInstance;
|
|
20
|
+
- (id) init NS_UNAVAILABLE;
|
|
21
|
+
- (NSArray<MAURLocation*>*) getAllLocations;
|
|
22
|
+
- (NSArray<MAURLocation*>*) getLocationsForSync;
|
|
23
|
+
- (NSArray<MAURLocation*>*) getValidLocations;
|
|
24
|
+
- (NSNumber*) getLocationsForSyncCount;
|
|
25
|
+
- (NSNumber*) persistLocation:(MAURLocation*)location;
|
|
26
|
+
- (NSNumber*) persistLocation:(MAURLocation*)location limitRows:(NSInteger)maxRows;
|
|
27
|
+
- (BOOL) deleteLocation:(NSNumber*)locationId error:(NSError * __autoreleasing *)outError;
|
|
28
|
+
- (BOOL) deleteAllLocations:(NSError * __autoreleasing *)outError;
|
|
29
|
+
/** Mark all locations pending sync (PostPending) as deleted. Clears the sync queue without sending. */
|
|
30
|
+
- (BOOL) deletePendingSyncLocations:(NSError * __autoreleasing *)outError;
|
|
31
|
+
/** v4.5.1 — soft-delete only sync-pending rows whose `recorded_at` is <= cutoff (UNIX seconds).
|
|
32
|
+
* Used after a successful background-sync POST so locations persisted DURING the upload (race
|
|
33
|
+
* window) are NOT incorrectly marked deleted. */
|
|
34
|
+
- (BOOL) deleteSyncedLocationsBefore:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError;
|
|
35
|
+
/** v4.5.1 — undo the in-flight SyncPending state when the upload failed. SyncPending → PostPending
|
|
36
|
+
* so the next sync window re-tries them. Without this, a network failure during background-sync
|
|
37
|
+
* would silently drop every pending location. */
|
|
38
|
+
- (BOOL) restoreFailedSyncLocations:(NSError * __autoreleasing *)outError;
|
|
39
|
+
/** v4.5.1 — recover SyncPending rows that got stuck (app/process killed between getLocationsForSync
|
|
40
|
+
* and the upload's success/failure callback). Rows whose `recorded_at` is older than `cutoff`
|
|
41
|
+
* (UNIX seconds) are restored to PostPending so they get retried. Call before each sync window. */
|
|
42
|
+
- (BOOL) restoreStaleSyncLocationsOlderThan:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError;
|
|
43
|
+
- (BOOL) clearDatabase;
|
|
44
|
+
- (NSString*) getDatabaseName;
|
|
45
|
+
- (NSString*) getDatabasePath;
|
|
46
|
+
// private
|
|
47
|
+
- (NSString*) getLocationSelectString;
|
|
48
|
+
- (MAURLocation*) convertToLocation:(FMResultSet*)rs;
|
|
49
|
+
|
|
50
|
+
@end
|
|
51
|
+
|
|
52
|
+
#endif /* MAURSQLiteLocationDAO_h */
|