@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,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011-2015 Ziminji
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import "NSString+ZIMString.h"
|
|
18
|
+
|
|
19
|
+
@implementation NSString (ZIMString)
|
|
20
|
+
|
|
21
|
+
#pragma mark -
|
|
22
|
+
#pragma mark Public Methods
|
|
23
|
+
|
|
24
|
+
- (BOOL) matchesRegex: (NSString *)pattern options: (NSRegularExpressionOptions)options {
|
|
25
|
+
NSError *error = nil;
|
|
26
|
+
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: pattern options: options error: &error];
|
|
27
|
+
if (regex == nil) {
|
|
28
|
+
return NO;
|
|
29
|
+
}
|
|
30
|
+
NSUInteger n = [regex numberOfMatchesInString: self options: 0 range: NSMakeRange(0, [self length])];
|
|
31
|
+
return (n == 1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
+ (NSString *) capitalizeFirstCharacterInString: (NSString *)string {
|
|
35
|
+
return [string stringByReplacingCharactersInRange: NSMakeRange(0, 1) withString: [[string substringToIndex: 1] uppercaseString]];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
+ (NSString *) firstTokenInString: (NSString *)string scanUpToCharactersFromSet: (NSCharacterSet *)stopSet {
|
|
39
|
+
NSScanner *scanner = [NSScanner scannerWithString: string];
|
|
40
|
+
NSString *buffer;
|
|
41
|
+
if (![scanner scanUpToCharactersFromSet: stopSet intoString: &buffer]) {
|
|
42
|
+
return @"";
|
|
43
|
+
}
|
|
44
|
+
return buffer;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011-2015 Ziminji
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <Foundation/Foundation.h>
|
|
18
|
+
|
|
19
|
+
/*!
|
|
20
|
+
@class ZIMSqlDataManipulationCommand
|
|
21
|
+
@discussion This protocol specifies the contract for a Data Manipulation Language (DML) command.
|
|
22
|
+
@updated 2011-07-15
|
|
23
|
+
@see http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands
|
|
24
|
+
*/
|
|
25
|
+
@protocol ZIMSqlDataManipulationCommand <NSObject>
|
|
26
|
+
|
|
27
|
+
@end
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011-2015 Ziminji
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <Foundation/Foundation.h>
|
|
18
|
+
|
|
19
|
+
// Block Statement Tokens
|
|
20
|
+
#define ZIMSqlEnclosureOpeningBrace @"("
|
|
21
|
+
#define ZIMSqlEnclosureClosingBrace @")"
|
|
22
|
+
|
|
23
|
+
// Connectors
|
|
24
|
+
#define ZIMSqlConnectorAnd @"AND"
|
|
25
|
+
#define ZIMSqlConnectorOr @"OR"
|
|
26
|
+
|
|
27
|
+
// Join Types -- http://sqlite.org/syntaxdiagrams.html#join-op
|
|
28
|
+
#define ZIMSqlJoinTypeCross @"CROSS"
|
|
29
|
+
#define ZIMSqlJoinTypeInner @"INNER"
|
|
30
|
+
#define ZIMSqlJoinTypeLeft @"LEFT"
|
|
31
|
+
#define ZIMSqlJoinTypeLeftOuter @"LEFT OUTER"
|
|
32
|
+
#define ZIMSqlJoinTypeNatural @"NATURAL"
|
|
33
|
+
#define ZIMSqlJoinTypeNaturalCross @"NATURAL CROSS"
|
|
34
|
+
#define ZIMSqlJoinTypeNaturalInner @"NATURAL INNER"
|
|
35
|
+
#define ZIMSqlJoinTypeNaturalLeft @"NATURAL LEFT"
|
|
36
|
+
#define ZIMSqlJoinTypeNaturalLeftOuter @"NATURAL LEFT OUTER"
|
|
37
|
+
#define ZIMSqlJoinTypeNone @""
|
|
38
|
+
|
|
39
|
+
// Expressions -- http://zetcode.com/databases/sqlitetutorial/expressions/
|
|
40
|
+
// Arithmetic Operators
|
|
41
|
+
#define ZIMSqlOperatorAdd @"+"
|
|
42
|
+
#define ZIMSqlOperatorSubtract @"-"
|
|
43
|
+
#define ZIMSqlOperatorMultiply @"*"
|
|
44
|
+
#define ZIMSqlOperatorDivide @"/"
|
|
45
|
+
#define ZIMSqlOperatorMod @"%"
|
|
46
|
+
|
|
47
|
+
// Boolean Operators
|
|
48
|
+
#define ZIMSqlOperatorAnd @"AND"
|
|
49
|
+
#define ZIMSqlOperatorOr @"OR"
|
|
50
|
+
#define ZIMSqlOperatorNot @"NOT"
|
|
51
|
+
|
|
52
|
+
// Relational Operators
|
|
53
|
+
#define ZIMSqlOperatorLessThan @"<"
|
|
54
|
+
#define ZIMSqlOperatorLessThanOrEqualTo @"<="
|
|
55
|
+
#define ZIMSqlOperatorGreaterThan @">"
|
|
56
|
+
#define ZIMSqlOperatorGreaterThanOrEqualTo @">="
|
|
57
|
+
#define ZIMSqlOperatorEqualTo @"="
|
|
58
|
+
#define ZIMSqlOperatorNotEqualTo @"<>"
|
|
59
|
+
|
|
60
|
+
// Bitwise Operators
|
|
61
|
+
#define ZIMSqlOperatorBitwiseAnd @"&"
|
|
62
|
+
#define ZIMSqlOperatorBitwiseOr @"|"
|
|
63
|
+
#define ZIMSqlOperatorBitwiseShiftLeft @"<<"
|
|
64
|
+
#define ZIMSqlOperatorBitwiseShiftRight @">>"
|
|
65
|
+
#define ZIMSqlOperatorBitwiseNegation @"~"
|
|
66
|
+
|
|
67
|
+
// Additional Operators
|
|
68
|
+
#define ZIMSqlOperatorConcatenate @"||"
|
|
69
|
+
#define ZIMSqlOperatorIn @"IN"
|
|
70
|
+
#define ZIMSqlOperatorNotIn @"NOT IN"
|
|
71
|
+
#define ZIMSqlOperatorIs @"IS"
|
|
72
|
+
#define ZIMSqlOperatorIsNot @"IS NOT"
|
|
73
|
+
#define ZIMSqlOperatorLike @"LIKE"
|
|
74
|
+
#define ZIMSqlOperatorNotLike @"NOT LIKE"
|
|
75
|
+
#define ZIMSqlOperatorGlob @"GLOB"
|
|
76
|
+
#define ZIMSqlOperatorNotGlob @"NOT GLOB"
|
|
77
|
+
#define ZIMSqlOperatorBetween @"BETWEEN"
|
|
78
|
+
#define ZIMSqlOperatorNotBetween @"NOT BETWEEN"
|
|
79
|
+
|
|
80
|
+
// Set Operators
|
|
81
|
+
#define ZIMSqlOperatorExcept @"EXCEPT"
|
|
82
|
+
#define ZIMSqlOperatorIntersect @"INTERSECT"
|
|
83
|
+
#define ZIMSqlOperatorUnion @"UNION"
|
|
84
|
+
#define ZIMSqlOperatorUnionAll @"UNION ALL"
|
|
85
|
+
|
|
86
|
+
// Show Types
|
|
87
|
+
#define ZIMSqlShowTypeAll @"ALL"
|
|
88
|
+
#define ZIMSqlShowTypePermanent @"PERMANENT"
|
|
89
|
+
#define ZIMSqlShowTypeTemporary @"TEMPORARY"
|
|
90
|
+
|
|
91
|
+
// Order Operators (for Nulls)
|
|
92
|
+
#define ZIMSqlNullsFirst @"FIRST"
|
|
93
|
+
#define ZIMSqlNullsLast @"LAST"
|
|
94
|
+
|
|
95
|
+
// Default Values -- http://forums.realsoftware.com/viewtopic.php?f=3&t=35179
|
|
96
|
+
#define ZIMSqlDefaultValueIsAutoIncremented @"PRIMARY KEY AUTOINCREMENT NOT NULL"
|
|
97
|
+
#define ZIMSqlDefaultValueIsNull @"DEFAULT NULL"
|
|
98
|
+
#define ZIMSqlDefaultValueIsNotNull @"NOT NULL"
|
|
99
|
+
#define ZIMSqlDefaultValueIsCurrentDate @"DEFAULT CURRENT_DATE"
|
|
100
|
+
#define ZIMSqlDefaultValueIsCurrentDateTime @"DEFAULT (datetime('now','localtime'))"
|
|
101
|
+
#define ZIMSqlDefaultValueIsCurrentTime @"DEFAULT CURRENT_TIME"
|
|
102
|
+
#define ZIMSqlDefaultValueIsCurrentTimestamp @"DEFAULT CURRENT_TIMESTAMP"
|
|
103
|
+
NSString *ZIMSqlDefaultValue(id value);
|
|
104
|
+
|
|
105
|
+
// Declared Datetype -- http://www.sqlite.org/datatype3.html
|
|
106
|
+
#define ZIMSqlDataTypeBigInt @"BIGINT"
|
|
107
|
+
#define ZIMSqlDataTypeBlob @"BLOB"
|
|
108
|
+
#define ZIMSqlDataTypeBoolean @"BOOLEAN"
|
|
109
|
+
#define ZIMSqlDataTypeClob @"CLOB"
|
|
110
|
+
#define ZIMSqlDataTypeDate @"DATE"
|
|
111
|
+
#define ZIMSqlDataTypeDateTime @"DATETIME"
|
|
112
|
+
#define ZIMSqlDataTypeDouble @"DOUBLE"
|
|
113
|
+
#define ZIMSqlDataTypeDoublePrecision @"DOUBLE PRECISION"
|
|
114
|
+
#define ZIMSqlDataTypeFloat @"FLOAT"
|
|
115
|
+
#define ZIMSqlDataTypeInt @"INT"
|
|
116
|
+
#define ZIMSqlDataTypeInt2 @"INT2"
|
|
117
|
+
#define ZIMSqlDataTypeInt8 @"INT8"
|
|
118
|
+
#define ZIMSqlDataTypeInteger @"INTEGER"
|
|
119
|
+
#define ZIMSqlDataTypeMediumInt @"MEDIUMINT"
|
|
120
|
+
#define ZIMSqlDataTypeNumeric @"NUMERIC"
|
|
121
|
+
#define ZIMSqlDataTypeReal @"REAL"
|
|
122
|
+
#define ZIMSqlDataTypeSmallInt @"SMALLINT"
|
|
123
|
+
#define ZIMSqlDataTypeText @"TEXT"
|
|
124
|
+
#define ZIMSqlDataTypeTimestamp @"TIMESTAMP"
|
|
125
|
+
#define ZIMSqlDataTypeTinyInt @"TINYINT"
|
|
126
|
+
#define ZIMSqlDataTypeUnsignedBigInt @"UNSIGNED BIG INT"
|
|
127
|
+
#define ZIMSqlDataTypeVariant @"VARIANT"
|
|
128
|
+
NSString *ZIMSqlDataTypeChar(NSUInteger x);
|
|
129
|
+
NSString *ZIMSqlDataTypeCharacter(NSUInteger x);
|
|
130
|
+
NSString *ZIMSqlDataTypeDecimal(NSUInteger x, NSUInteger y);
|
|
131
|
+
NSString *ZIMSqlDataTypeNativeCharacter(NSUInteger x);
|
|
132
|
+
NSString *ZIMSqlDataTypeNChar(NSUInteger x);
|
|
133
|
+
NSString *ZIMSqlDataTypeNVarChar(NSUInteger x);
|
|
134
|
+
NSString *ZIMSqlDataTypeVarChar(NSUInteger x);
|
|
135
|
+
NSString *ZIMSqlDataTypeVaryingCharacter(NSUInteger x);
|
|
136
|
+
|
|
137
|
+
/*!
|
|
138
|
+
@class ZIMSqlExpression
|
|
139
|
+
@discussion This class handles the formatting of an SQL expression.
|
|
140
|
+
@updated 2012-04-04
|
|
141
|
+
*/
|
|
142
|
+
@interface ZIMSqlExpression : NSObject {
|
|
143
|
+
|
|
144
|
+
@protected
|
|
145
|
+
NSString *_expression;
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/*!
|
|
150
|
+
@method initWithSqlExpression:
|
|
151
|
+
@discussion This method initialize the class with the specified SQL expression.
|
|
152
|
+
@param sql The SQL expression to be wrapped.
|
|
153
|
+
@return An instance of this class.
|
|
154
|
+
@updated 2012-03-14
|
|
155
|
+
*/
|
|
156
|
+
- (instancetype) initWithSqlExpression: (NSString *)sql;
|
|
157
|
+
/*!
|
|
158
|
+
@method expression
|
|
159
|
+
@discussion This method returns the wrapped SQL expression.
|
|
160
|
+
@return The wrapped SQL expression.
|
|
161
|
+
@updated 2012-03-14
|
|
162
|
+
*/
|
|
163
|
+
- (NSString *) expression;
|
|
164
|
+
/*!
|
|
165
|
+
@method sql:
|
|
166
|
+
@discussion This method will wrap the SQL expression.
|
|
167
|
+
@param sql The SQL expression to be wrapped
|
|
168
|
+
@return The wrapped SQL expression.
|
|
169
|
+
@updated 2012-03-17
|
|
170
|
+
*/
|
|
171
|
+
+ (ZIMSqlExpression *) sql: (NSString *)sql;
|
|
172
|
+
/*!
|
|
173
|
+
@method prepareConnector:
|
|
174
|
+
@discussion This method will prepare an alias for an SQL statement.
|
|
175
|
+
@param token The token to be prepared.
|
|
176
|
+
@return The prepared token.
|
|
177
|
+
@updated 2012-03-24
|
|
178
|
+
*/
|
|
179
|
+
+ (NSString *) prepareAlias: (NSString *)token;
|
|
180
|
+
/*!
|
|
181
|
+
@method prepareConnector:
|
|
182
|
+
@discussion This method will prepare a connector for an SQL statement.
|
|
183
|
+
@param token The token to be prepared.
|
|
184
|
+
@return The prepared token.
|
|
185
|
+
@updated 2012-03-18
|
|
186
|
+
*/
|
|
187
|
+
+ (NSString *) prepareConnector: (NSString *)token;
|
|
188
|
+
/*!
|
|
189
|
+
@method prepareEnclosure:
|
|
190
|
+
@discussion This method will prepare an enclosure character for an SQL statement.
|
|
191
|
+
@param token The token to be prepared.
|
|
192
|
+
@return The prepared token.
|
|
193
|
+
@updated 2011-06-25
|
|
194
|
+
*/
|
|
195
|
+
+ (NSString *) prepareEnclosure: (NSString *)token;
|
|
196
|
+
/*!
|
|
197
|
+
@method prepareIdentifier:
|
|
198
|
+
@discussion This method will prepare an identifier for an SQL statement.
|
|
199
|
+
@param identifier The identifier to be prepared.
|
|
200
|
+
@return The prepared identifier.
|
|
201
|
+
@updated 2012-03-19
|
|
202
|
+
*/
|
|
203
|
+
+ (NSString *) prepareIdentifier: (id)identifier;
|
|
204
|
+
/*!
|
|
205
|
+
@method prepareJoinType:
|
|
206
|
+
@discussion This method will prepare a join type token for an SQL statement.
|
|
207
|
+
@param token The token to be prepared.
|
|
208
|
+
@return The prepared token.
|
|
209
|
+
@updated 2012-03-18
|
|
210
|
+
*/
|
|
211
|
+
+ (NSString *) prepareJoinType: (NSString *)token;
|
|
212
|
+
/*!
|
|
213
|
+
@method prepareOperator:type
|
|
214
|
+
@discussion This method will prepare an operator for an SQL statement.
|
|
215
|
+
@param operator The operator to be prepared.
|
|
216
|
+
@param type The type of operator.
|
|
217
|
+
@return The prepared operator.
|
|
218
|
+
@updated 2012-03-18
|
|
219
|
+
*/
|
|
220
|
+
+ (NSString *) prepareOperator: (NSString *)operator ofType: (NSString *)type;
|
|
221
|
+
/*!
|
|
222
|
+
@method prepareSortOrder:
|
|
223
|
+
@discussion This method will prepare a sort order token for an SQL statement.
|
|
224
|
+
@param descending This will determine whether the token represents a descending tkoen
|
|
225
|
+
or an ascending token.
|
|
226
|
+
@return The prepared sort order token.
|
|
227
|
+
@updated 2011-07-02
|
|
228
|
+
*/
|
|
229
|
+
+ (NSString *) prepareSortOrder: (BOOL)descending;
|
|
230
|
+
/*!
|
|
231
|
+
@method prepareSortWeight:
|
|
232
|
+
@discussion This method will prepare the sort weight for an SQL statement.
|
|
233
|
+
@param weight This indicates how nulls are to be weighed when comparing with non-nulls.
|
|
234
|
+
@return The prepared sort weight.
|
|
235
|
+
@updated 2011-11-06
|
|
236
|
+
*/
|
|
237
|
+
+ (NSString *) prepareSortWeight: (NSString *)weight;
|
|
238
|
+
/*!
|
|
239
|
+
@method prepareValue:
|
|
240
|
+
@discussion This method will prepare a value for an SQL statement.
|
|
241
|
+
@param value The value to be prepared.
|
|
242
|
+
@return The prepared value.
|
|
243
|
+
@updated 2012-03-08
|
|
244
|
+
@see http://www.sqlite.org/c3ref/mprintf.html
|
|
245
|
+
@see http://codingrecipes.com/objective-c-a-function-for-escaping-values-before-inserting-into-sqlite
|
|
246
|
+
@see http://wiki.sa-mp.com/wiki/Escaping_Strings_SQLite
|
|
247
|
+
*/
|
|
248
|
+
+ (NSString *) prepareValue: (id)value;
|
|
249
|
+
|
|
250
|
+
@end
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011-2015 Ziminji
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at:
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <sqlite3.h> // Requires libsqlite3.dylib
|
|
18
|
+
#import "NSString+ZIMString.h"
|
|
19
|
+
#import "ZIMSqlExpression.h"
|
|
20
|
+
#import "ZIMSqlSelectStatement.h"
|
|
21
|
+
|
|
22
|
+
NSString *ZIMSqlDefaultValue(id value) {
|
|
23
|
+
if ((value == nil) || [value isKindOfClass: [NSNull class]]) {
|
|
24
|
+
return @"DEFAULT NULL";
|
|
25
|
+
}
|
|
26
|
+
else if ([value isKindOfClass: [NSNumber class]]) {
|
|
27
|
+
return [NSString stringWithFormat: @"DEFAULT %@", value];
|
|
28
|
+
}
|
|
29
|
+
else if ([value isKindOfClass: [NSString class]]) {
|
|
30
|
+
char *escapedValue = sqlite3_mprintf("DEFAULT '%q'", [(NSString *)value UTF8String]);
|
|
31
|
+
NSString *string = [NSString stringWithUTF8String: (const char *)escapedValue];
|
|
32
|
+
sqlite3_free(escapedValue);
|
|
33
|
+
return string;
|
|
34
|
+
}
|
|
35
|
+
else if ([value isKindOfClass: [NSData class]]) {
|
|
36
|
+
NSData *data = (NSData *)value;
|
|
37
|
+
NSInteger length = [data length];
|
|
38
|
+
NSMutableString *buffer = [[NSMutableString alloc] init];
|
|
39
|
+
[buffer appendString: @"DEFAULT x'"];
|
|
40
|
+
const unsigned char *dataBuffer = [data bytes];
|
|
41
|
+
for (NSInteger i = 0; i < length; i++) {
|
|
42
|
+
[buffer appendFormat: @"%02lx", (unsigned long)dataBuffer[i]];
|
|
43
|
+
}
|
|
44
|
+
[buffer appendString: @"'"];
|
|
45
|
+
return buffer;
|
|
46
|
+
}
|
|
47
|
+
else if ([value isKindOfClass: [NSDate class]]) {
|
|
48
|
+
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
|
49
|
+
[formatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
|
|
50
|
+
NSString *date = [NSString stringWithFormat: @"DEFAULT '%@'", [formatter stringFromDate: (NSDate *)value]];
|
|
51
|
+
return date;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: [NSString stringWithFormat: @"Unable to set default value. '%@'", value] userInfo: nil];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
NSString *ZIMSqlDataTypeChar(NSUInteger x) {
|
|
59
|
+
return [NSString stringWithFormat: @"CHAR(%lu)", (unsigned long)x];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
NSString *ZIMSqlDataTypeCharacter(NSUInteger x) {
|
|
63
|
+
return [NSString stringWithFormat: @"CHARACTER(%lu)", (unsigned long)x];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
NSString *ZIMSqlDataTypeDecimal(NSUInteger x, NSUInteger y) {
|
|
67
|
+
return [NSString stringWithFormat: @"DECIMAL(%lu, %lu)", (unsigned long)x, (unsigned long)y];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
NSString *ZIMSqlDataTypeNativeCharacter(NSUInteger x) {
|
|
71
|
+
return [NSString stringWithFormat: @"NATIVE CHARACTER(%lu)", (unsigned long)x];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
NSString *ZIMSqlDataTypeNChar(NSUInteger x) {
|
|
75
|
+
return [NSString stringWithFormat: @"NCHAR(%lu)", (unsigned long)x];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
NSString *ZIMSqlDataTypeNVarChar(NSUInteger x) {
|
|
79
|
+
return [NSString stringWithFormat: @"NVARCHAR(%lu)", (unsigned long)x];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
NSString *ZIMSqlDataTypeVarChar(NSUInteger x) {
|
|
83
|
+
return [NSString stringWithFormat: @"VARCHAR(%lu)", (unsigned long)x];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
NSString *ZIMSqlDataTypeVaryingCharacter(NSUInteger x) {
|
|
87
|
+
return [NSString stringWithFormat: @"VARYING CHARACTER(%lu)", (unsigned long)x];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@implementation ZIMSqlExpression
|
|
91
|
+
|
|
92
|
+
#pragma mark -
|
|
93
|
+
#pragma mark Public Methods
|
|
94
|
+
|
|
95
|
+
- (instancetype) initWithSqlExpression: (NSString *)sql {
|
|
96
|
+
if ((self = [super init])) {
|
|
97
|
+
_expression = sql;
|
|
98
|
+
}
|
|
99
|
+
return self;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
- (NSString *) expression {
|
|
103
|
+
return _expression;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
+ (ZIMSqlExpression *) sql: (NSString *)sql {
|
|
107
|
+
return [[ZIMSqlExpression alloc] initWithSqlExpression: sql];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
+ (NSString *) prepareAlias: (NSString *)token {
|
|
111
|
+
NSError *error = nil;
|
|
112
|
+
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: @"[^a-z0-9_ ]" options: NSRegularExpressionCaseInsensitive error: &error];
|
|
113
|
+
token = [regex stringByReplacingMatchesInString: token options: 0 range: NSMakeRange(0, [token length]) withTemplate: @""];
|
|
114
|
+
token = [token stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
115
|
+
token = [NSString stringWithFormat: @"[%@]", token];
|
|
116
|
+
return token;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
+ (NSString *) prepareConnector: (NSString *)token {
|
|
120
|
+
if (![token matchesRegex: @"^(and|or)$" options: NSRegularExpressionCaseInsensitive]) {
|
|
121
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: @"Invalid connector token provided." userInfo: nil];
|
|
122
|
+
}
|
|
123
|
+
return [token uppercaseString];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
+ (NSString *) prepareEnclosure: (NSString *)token {
|
|
127
|
+
if (!([token isEqualToString: ZIMSqlEnclosureOpeningBrace] || [token isEqualToString: ZIMSqlEnclosureClosingBrace])) {
|
|
128
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: @"Invalid enclosure token provided." userInfo: nil];
|
|
129
|
+
}
|
|
130
|
+
return token;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
+ (NSString *) prepareIdentifier: (id)identifier {
|
|
134
|
+
if ([identifier isKindOfClass: [NSString class]]) {
|
|
135
|
+
NSMutableString *buffer = [[NSMutableString alloc] init];
|
|
136
|
+
NSArray *tokens = [(NSString *)identifier componentsSeparatedByString: @"."];
|
|
137
|
+
NSInteger length = [tokens count];
|
|
138
|
+
NSError *error = nil;
|
|
139
|
+
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: @"[^a-z0-9_ ]" options: NSRegularExpressionCaseInsensitive error: &error];
|
|
140
|
+
for (NSInteger index = 0; index < length; index++) {
|
|
141
|
+
if (index > 0) {
|
|
142
|
+
[buffer appendString: @"."];
|
|
143
|
+
}
|
|
144
|
+
NSString *token = (NSString *)[tokens objectAtIndex: index];
|
|
145
|
+
if ([token matchesRegex: @"^\\s*\\*\\s*$" options: NSRegularExpressionCaseInsensitive]) {
|
|
146
|
+
[buffer appendString: @"*"];
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
token = [regex stringByReplacingMatchesInString: token options: 0 range: NSMakeRange(0, [token length]) withTemplate: @""];
|
|
150
|
+
token = [token stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
151
|
+
[buffer appendFormat: @"[%@]", token];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return buffer;
|
|
155
|
+
}
|
|
156
|
+
else if ([identifier isKindOfClass: [ZIMSqlExpression class]]) {
|
|
157
|
+
return [(ZIMSqlExpression *)identifier expression];
|
|
158
|
+
}
|
|
159
|
+
else if ([identifier isKindOfClass: [ZIMSqlSelectStatement class]]) {
|
|
160
|
+
NSString *statement = [(ZIMSqlSelectStatement *)identifier statement];
|
|
161
|
+
statement = [statement substringWithRange: NSMakeRange(0, [statement length] - 1)];
|
|
162
|
+
statement = [NSString stringWithFormat: @"(%@)", statement];
|
|
163
|
+
return statement;
|
|
164
|
+
}
|
|
165
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: [NSString stringWithFormat: @"Unable to prepare identifier. '%@'", identifier] userInfo: nil];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
+ (NSString *) prepareJoinType: (NSString *)token {
|
|
169
|
+
if ((token == nil) || [token isEqualToString: ZIMSqlJoinTypeNone]) {
|
|
170
|
+
token = ZIMSqlJoinTypeInner;
|
|
171
|
+
}
|
|
172
|
+
else if ([token isEqualToString: @","]) {
|
|
173
|
+
token = ZIMSqlJoinTypeCross;
|
|
174
|
+
}
|
|
175
|
+
if (![token matchesRegex: @"^((natural )?(cross|inner|(left( outer)?)))|(natural)$" options: NSRegularExpressionCaseInsensitive]) {
|
|
176
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: @"Invalid join type token provided." userInfo: nil];
|
|
177
|
+
}
|
|
178
|
+
return [token uppercaseString];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
+ (NSString *) prepareOperator: (NSString *)operator ofType: (NSString *)type {
|
|
182
|
+
if ([[type uppercaseString] isEqualToString: @"SET"] && ![operator matchesRegex: @"^(except|intersect|(union( all)?))$" options: NSRegularExpressionCaseInsensitive]) {
|
|
183
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: @"Invalid set operator token provided." userInfo: nil];
|
|
184
|
+
}
|
|
185
|
+
return [operator uppercaseString];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
+ (NSString *) prepareSortOrder: (BOOL)descending {
|
|
189
|
+
return (descending) ? @"DESC" : @"ASC";
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
+ (NSString *) prepareSortWeight: (NSString *)weight {
|
|
193
|
+
if (weight != nil) {
|
|
194
|
+
if (![weight matchesRegex: @"^(first|last)$" options: NSRegularExpressionCaseInsensitive]) {
|
|
195
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: @"Invalid weight token provided." userInfo: nil];
|
|
196
|
+
}
|
|
197
|
+
return [weight uppercaseString];
|
|
198
|
+
}
|
|
199
|
+
return @"DEFAULT";
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
+ (NSString *) prepareValue: (id)value {
|
|
203
|
+
if ((value == nil) || [value isKindOfClass: [NSNull class]]) {
|
|
204
|
+
return @"NULL";
|
|
205
|
+
}
|
|
206
|
+
else if ([value isKindOfClass: [NSArray class]]) {
|
|
207
|
+
NSMutableString *buffer = [[NSMutableString alloc] init];
|
|
208
|
+
[buffer appendString: @"("];
|
|
209
|
+
for (NSInteger i = 0; i < [value count]; i++) {
|
|
210
|
+
if (i > 0) {
|
|
211
|
+
[buffer appendString: @", "];
|
|
212
|
+
}
|
|
213
|
+
[buffer appendString: [self prepareValue: [value objectAtIndex: i]]];
|
|
214
|
+
}
|
|
215
|
+
[buffer appendString: @")"];
|
|
216
|
+
return buffer;
|
|
217
|
+
}
|
|
218
|
+
else if ([value isKindOfClass: [NSNumber class]]) {
|
|
219
|
+
return [NSString stringWithFormat: @"%@", value];
|
|
220
|
+
}
|
|
221
|
+
else if ([value isKindOfClass: [NSString class]]) {
|
|
222
|
+
char *escapedValue = sqlite3_mprintf("'%q'", [(NSString *)value UTF8String]);
|
|
223
|
+
NSString *string = [NSString stringWithUTF8String: (const char *)escapedValue];
|
|
224
|
+
sqlite3_free(escapedValue);
|
|
225
|
+
return string;
|
|
226
|
+
}
|
|
227
|
+
else if ([value isKindOfClass: [NSData class]]) {
|
|
228
|
+
NSData *data = (NSData *)value;
|
|
229
|
+
NSInteger length = [data length];
|
|
230
|
+
NSMutableString *buffer = [[NSMutableString alloc] init];
|
|
231
|
+
[buffer appendString: @"x'"];
|
|
232
|
+
const unsigned char *dataBuffer = [data bytes];
|
|
233
|
+
for (NSInteger i = 0; i < length; i++) {
|
|
234
|
+
[buffer appendFormat: @"%02lx", (unsigned long)dataBuffer[i]];
|
|
235
|
+
}
|
|
236
|
+
[buffer appendString: @"'"];
|
|
237
|
+
return buffer;
|
|
238
|
+
}
|
|
239
|
+
else if ([value isKindOfClass: [NSDate class]]) {
|
|
240
|
+
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
|
241
|
+
[formatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
|
|
242
|
+
NSString *date = [NSString stringWithFormat: @"'%@'", [formatter stringFromDate: (NSDate *)value]];
|
|
243
|
+
return date;
|
|
244
|
+
}
|
|
245
|
+
else if ([value isKindOfClass: [ZIMSqlExpression class]]) {
|
|
246
|
+
return [(ZIMSqlExpression *)value expression];
|
|
247
|
+
}
|
|
248
|
+
else if ([value isKindOfClass: [ZIMSqlSelectStatement class]]) {
|
|
249
|
+
NSString *statement = [(ZIMSqlSelectStatement *)value statement];
|
|
250
|
+
statement = [statement substringWithRange: NSMakeRange(0, [statement length] - 1)];
|
|
251
|
+
statement = [NSString stringWithFormat: @"(%@)", statement];
|
|
252
|
+
return statement;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
@throw [NSException exceptionWithName: @"ZIMSqlException" reason: [NSString stringWithFormat: @"Unable to prepare value. '%@'", value] userInfo: nil];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@end
|