Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ DerivedData
*.hmap
*.ipa
*.xcworkspace
Example/Index

#AppCode
.idea
Expand Down
2 changes: 1 addition & 1 deletion GoldDigger.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Pod::Spec.new do |s|
s.name = "GoldDigger"
s.version = "0.7.3"
s.version = "0.7.7"
s.summary = "Simple ORM"
s.description = "Simple ORM for Objective-C"
s.homepage = "https://github.com/CopyIsRight/GoldDigger.git"
Expand Down
14 changes: 10 additions & 4 deletions Pod/SQL/GDGEntity+SQL.m
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ - (BOOL)save:(NSError **)error
values[columnName] = value ?: [NSNull null];
}

if (exists)
if (exists && self.id)
{
for (NSString *key in primaryKeys)
{
Expand All @@ -297,10 +297,16 @@ - (BOOL)save:(NSError **)error
saved = [db.table update:values error:error];
}
else
saved = [db.table insert:values error:error];
{
NSString *insertId = [db.table insert:values];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *idNumber = [formatter numberFromString:insertId];

if (saved && !exists && self.id == nil)
self.id = [db.table lastInsertedId];
self.id = idNumber;
saved = self.id != nil ? true : false;
}

for (GDGRelation *relation in relations)
[relation save:self error:NULL];
Expand Down
2 changes: 1 addition & 1 deletion Pod/SQL/SQLTableSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

- (CIRStatement *)deleteStatement;

- (BOOL)insert:(NSDictionary <NSString *, id> *)values error:(NSError **)error;
- (NSString *)insert:(NSDictionary <NSString *, id> *)values;

- (BOOL)update:(NSDictionary <NSString *, id> *)values error:(NSError **)error;

Expand Down
63 changes: 49 additions & 14 deletions Pod/SQL/SQLTableSource.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
//

#import <SQLAid/CIRDatabase.h>
#import <SQLAid/CIRStatement.h>

#import <sqlite3/sqlite3.h>

#import <ObjectiveSugar/NSArray+ObjectiveSugar.h>
#import "SQLTableSource.h"

Expand All @@ -19,7 +23,7 @@
@implementation SQLTableSource

- (instancetype)initWithTableName:(NSString *)tableName
databaseProvider:(id <GDGDatabaseProvider>)databaseProvider;
databaseProvider:(id <GDGDatabaseProvider>)databaseProvider;
{
if (self = [super init])
{
Expand Down Expand Up @@ -180,7 +184,7 @@ - (NSString *)updateStringForColumns:(NSArray <NSString *> *)columns condition:(
}] join:@" AND "];

NSString *conditions = condition.length == 0 ? primaryKeysCondition :
[NSString stringWithFormat:@"(%@) AND (%@)", primaryKeysCondition, condition];
[NSString stringWithFormat:@"(%@) AND (%@)", primaryKeysCondition, condition];

[mutableString appendString:conditions];

Expand All @@ -195,17 +199,17 @@ - (NSString *)updateStringForColumns:(NSArray <NSString *> *)columns
- (NSString *)deleteString
{
NSMutableString *mutableString = [[NSMutableString alloc] initWithFormat:@"DELETE FROM %@ WHERE", self.identifier];

NSArray *primaryKeys = [[self.columns select:^BOOL(GDGColumn *column) {
return column.primaryKey > 0;
}] sortBy:@"primaryKey"];

for (GDGColumn *primaryKey in primaryKeys) {
[mutableString appendFormat:@" %@.%@ = ? AND", self.identifier, primaryKey.name];
}

[mutableString replaceCharactersInRange:NSMakeRange(mutableString.length - 4, 4) withString:@""];

return mutableString;
}

Expand Down Expand Up @@ -234,15 +238,46 @@ - (CIRStatement *)deleteStatement

#pragma mark Execute

- (BOOL)insert:(NSDictionary <NSString *, id> *)values error:(NSError **)error
- (NSString *)insert:(NSDictionary <NSString *, id> *)values
{
NSString *stringBuff = [NSString new];
sqlite3 *handler = _databaseProvider.database.handler;
int code = 0;
const char *errMessage;

code = sqlite3_exec(handler, [@"SAVEPOINT insertBegin" UTF8String], 0, 0, &errMessage);

code = sqlite3_exec(handler, [@"DROP TABLE IF EXISTS temp._temp" UTF8String], 0, 0, &errMessage);
code = sqlite3_exec(handler, [@"CREATE TEMP TABLE IF NOT EXISTS _temp (id INTEGER NOT NULL PRIMARY KEY)" UTF8String], 0, 0, &errMessage);
code = sqlite3_exec(handler, [[NSString stringWithFormat:@"CREATE TEMP TRIGGER _trigger AFTER INSERT ON main.%@ BEGIN INSERT INTO _temp SELECT NEW.id; END", _name, _name] UTF8String], 0, 0, &errMessage);

NSString *insertString = [self insertStringForColumns:[values allKeys]];
BOOL succeeded = [_databaseProvider.database executeUpdate:insertString withNamedParameters:values error:error];
if (!succeeded && error)
*error = [NSError errorWithDomain:@"com.CopyIsRight.GoldDigger" code:kDEFAULT_ERROR_CODE
userInfo:@{NSLocalizedDescriptionKey : _databaseProvider.database.lastErrorMessage}];
BOOL succeeded = [_databaseProvider.database executeUpdate:insertString withNamedParameters:values error:nil];
if (!succeeded)
return [NSString new];

return succeeded;
code = sqlite3_exec(handler, [@"DROP TRIGGER _trigger;" UTF8String], 0, 0, &errMessage);

sqlite3_stmt *stmt;
code = sqlite3_prepare_v2(handler, [@"SELECT id FROM temp._temp ORDER BY id DESC" UTF8String], -1, &stmt, NULL);

while ( (code = sqlite3_step(stmt)) == SQLITE_ROW) {
char *buff = sqlite3_column_text(stmt, 0);
stringBuff = [NSString stringWithUTF8String:buff];
}

sqlite3_reset(stmt);
sqlite3_finalize(stmt);

code = sqlite3_exec(handler, [@"DELETE FROM temp._temp" UTF8String], 0, 0, &errMessage);
code = sqlite3_exec(handler, [@"RELEASE insertBegin" UTF8String], 0, 0, &errMessage);

if (code != 0)
@throw [NSException exceptionWithName:@"Insert error"
reason:_databaseProvider.database.lastErrorMessage
userInfo:nil];

return stringBuff;
}

- (BOOL)update:(NSDictionary <NSString *, id> *)values error:(NSError **)error
Expand All @@ -251,7 +286,7 @@ - (BOOL)update:(NSDictionary <NSString *, id> *)values error:(NSError **)error
BOOL succeeded = [_databaseProvider.database executeUpdate:updateString withNamedParameters:values error:error];
if (!succeeded && error)
*error = [NSError errorWithDomain:@"com.CopyIsRight.GoldDigger" code:kDEFAULT_ERROR_CODE
userInfo:@{NSLocalizedDescriptionKey: _databaseProvider.database.lastErrorMessage}];
userInfo:@{NSLocalizedDescriptionKey: _databaseProvider.database.lastErrorMessage}];

return succeeded;
}
Expand All @@ -261,7 +296,7 @@ - (BOOL)delete:(id)primaryKey error:(NSError **)error
BOOL succeeded = [_databaseProvider.database executeUpdate:[self deleteString] withParameters:@[primaryKey] error:error];
if (!succeeded && error)
*error = [NSError errorWithDomain:@"com.CopyIsRight.GoldDigger" code:kDEFAULT_ERROR_CODE
userInfo:@{NSLocalizedDescriptionKey : _databaseProvider.database.lastErrorMessage}];
userInfo:@{NSLocalizedDescriptionKey : _databaseProvider.database.lastErrorMessage}];

return succeeded;
}
Expand Down