diff --git a/.gitignore b/.gitignore index aaa5f07..60092ae 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ DerivedData *.hmap *.ipa *.xcworkspace +Example/Index #AppCode .idea diff --git a/GoldDigger.podspec b/GoldDigger.podspec index 342ff71..fa7ebdb 100644 --- a/GoldDigger.podspec +++ b/GoldDigger.podspec @@ -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" diff --git a/Pod/SQL/GDGEntity+SQL.m b/Pod/SQL/GDGEntity+SQL.m index 806c285..b4beda3 100644 --- a/Pod/SQL/GDGEntity+SQL.m +++ b/Pod/SQL/GDGEntity+SQL.m @@ -282,7 +282,7 @@ - (BOOL)save:(NSError **)error values[columnName] = value ?: [NSNull null]; } - if (exists) + if (exists && self.id) { for (NSString *key in primaryKeys) { @@ -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]; diff --git a/Pod/SQL/SQLTableSource.h b/Pod/SQL/SQLTableSource.h index abb3579..3d5508a 100644 --- a/Pod/SQL/SQLTableSource.h +++ b/Pod/SQL/SQLTableSource.h @@ -33,7 +33,7 @@ - (CIRStatement *)deleteStatement; -- (BOOL)insert:(NSDictionary *)values error:(NSError **)error; +- (NSString *)insert:(NSDictionary *)values; - (BOOL)update:(NSDictionary *)values error:(NSError **)error; diff --git a/Pod/SQL/SQLTableSource.m b/Pod/SQL/SQLTableSource.m index afb4fba..b086b85 100644 --- a/Pod/SQL/SQLTableSource.m +++ b/Pod/SQL/SQLTableSource.m @@ -6,6 +6,10 @@ // #import +#import + +#import + #import #import "SQLTableSource.h" @@ -19,7 +23,7 @@ @implementation SQLTableSource - (instancetype)initWithTableName:(NSString *)tableName - databaseProvider:(id )databaseProvider; + databaseProvider:(id )databaseProvider; { if (self = [super init]) { @@ -180,7 +184,7 @@ - (NSString *)updateStringForColumns:(NSArray *)columns condition:( }] join:@" AND "]; NSString *conditions = condition.length == 0 ? primaryKeysCondition : - [NSString stringWithFormat:@"(%@) AND (%@)", primaryKeysCondition, condition]; + [NSString stringWithFormat:@"(%@) AND (%@)", primaryKeysCondition, condition]; [mutableString appendString:conditions]; @@ -195,17 +199,17 @@ - (NSString *)updateStringForColumns:(NSArray *)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; } @@ -234,15 +238,46 @@ - (CIRStatement *)deleteStatement #pragma mark Execute -- (BOOL)insert:(NSDictionary *)values error:(NSError **)error +- (NSString *)insert:(NSDictionary *)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 *)values error:(NSError **)error @@ -251,7 +286,7 @@ - (BOOL)update:(NSDictionary *)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; } @@ -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; }