diff options
author | Mikkel Krautz <mikkel@krautz.dk> | 2010-06-29 05:03:20 +0400 |
---|---|---|
committer | Mikkel Krautz <mikkel@krautz.dk> | 2010-06-29 05:03:20 +0400 |
commit | 4429926b6e65fa0a0b3422c21151137c49560b46 (patch) | |
tree | 48aa72d5943763501c7b37f9b8b7cd208c0cffd2 | |
parent | 821bd94e38576a4ae845c8c6453d9e2c931a1a3e (diff) |
Persistent pkeys for Identity objects.
-rw-r--r-- | Source/Classes/Database.h | 8 | ||||
-rw-r--r-- | Source/Classes/Database.m | 62 | ||||
-rw-r--r-- | Source/Classes/Identity.h | 4 | ||||
-rw-r--r-- | Source/Classes/Identity.m | 9 | ||||
-rw-r--r-- | Source/Classes/IdentityCreationViewController.m | 4 | ||||
-rw-r--r-- | Source/Classes/IdentityViewController.m | 2 |
6 files changed, 71 insertions, 18 deletions
diff --git a/Source/Classes/Database.h b/Source/Classes/Database.h index 54a2894..d9df143 100644 --- a/Source/Classes/Database.h +++ b/Source/Classes/Database.h @@ -38,12 +38,16 @@ + (void) initializeDatabase; + (void) teardown; +// FavouriteServer + (void) storeFavourite:(FavouriteServer *)favServ; + (void) deleteFavourite:(FavouriteServer *)favServ; + (void) storeFavourites:(NSArray *)favourites; + (NSMutableArray *) fetchAllFavourites; -+ (void) saveIdentity:(Identity *)ident; -+ (NSArray *) identities; +// Identity ++ (void) storeIdentity:(Identity *)ident; ++ (void) deleteIdentity:(Identity *)ident; ++ (void) storeIdentities:(NSArray *)idents; ++ (NSArray *) fetchAllIdentities; @end diff --git a/Source/Classes/Database.m b/Source/Classes/Database.m index 1ee7c5a..a3e7bdb 100644 --- a/Source/Classes/Database.m +++ b/Source/Classes/Database.m @@ -67,11 +67,12 @@ static FMDatabase *db = nil; @" `username` TEXT)"]; [db executeUpdate:@"CREATE TABLE IF NOT EXISTS `identities` " - @"(`persistent` BLOB PRIMARY KEY," + @"(`id` INTEGER PRIMARY KEY AUTOINCREMENT," @" `username` TEXT," - @" `avatar` BLOB)"]; - [db executeUpdate:@"ALTER TABLE `identities` ADD COLUMN `fullname` TEXT"]; - [db executeUpdate:@"ALTER TABLE `identities` ADD COLUMN `email` TEXT"]; + @" `fullname` TEXT," + @" `email` TEXT," + @" `avatar` BLOB," + @" `persistent` BLOB)"]; [db executeUpdate:@"VACUUM"]; @@ -163,18 +164,50 @@ static FMDatabase *db = nil; // // Store identity // ++ (void) storeIdentity:(Identity *)ident { + NSLog(@"StoreIdentity.."); + // If the favourite already has a private key, update the currently stored entity + if ([ident hasPrimaryKey]) { + // If it isn't already stored, store it and update the object's pkey. + [db executeUpdate:@"UPDATE `identities` SET `username`=?, `fullname`=?, `email`=?, `avatar`=?, `persistent`=? WHERE `id`=?", + ident.userName, ident.fullName, ident.emailAddress, nil, ident.persistent, + [NSNumber numberWithInt:[ident primaryKey]]]; + } else { + // We're already inside a transaction if we were called from within + // storeIdentities. If that isn't the case, make sure we start a new + // transaction. + BOOL newTransaction = ![db inTransaction]; + if (newTransaction) + [db beginTransaction]; + [db executeUpdate:@"INSERT INTO `identities` (`username`, `fullname`, `email`, `avatar`, `persistent`) VALUES (?, ?, ?, ?, ?)", + ident.userName, ident.fullName, ident.emailAddress, nil, ident.persistent]; + FMResultSet *res = [db executeQuery:@"SELECT last_insert_rowid()"]; + [res next]; + NSLog(@"pkey = %i", [res intForColumn:0]); + [ident setPrimaryKey:[res intForColumnIndex:0]]; + if (newTransaction) + [db commit]; + } +} -+ (void) saveIdentity:(Identity *)ident { - [db executeUpdate:@"REPLACE INTO `identities` (`persistent`, `username`, `fullname`, `email`) VALUES (?, ?, ?, ?)", - ident.persistentId, ident.userName, nil, nil]; +// +// Delete identity +// ++ (void) deleteIdentity:(Identity *)ident { + NSAssert([ident hasPrimaryKey], @"Can only delete objects originated from database"); + [db executeUpdate:@"DELETE FROM `identities` WHERE `id`=?", + [NSNumber numberWithInt:[ident primaryKey]]]; } -+ (NSArray *) identities { +// +// Fetch all identities +// ++ (NSArray *) fetchAllIdentities { NSMutableArray *idents = [[NSMutableArray alloc] init]; FMResultSet *res = [db executeQuery:@"SELECT `persistent`, `username`, `fullname`, `email` FROM `identities`"]; while ([res next]) { Identity *ident = [[Identity alloc] init]; - ident.persistentId = [res dataForColumnIndex:0]; + ident.persistent = [res dataForColumnIndex:0]; ident.userName = [res stringForColumnIndex:1]; ident.fullName = [res stringForColumnIndex:2]; ident.emailAddress = [res stringForColumnIndex:3]; @@ -184,6 +217,17 @@ static FMDatabase *db = nil; return [idents autorelease]; } +// +// Save identities +// ++ (void) storeIdentities:(NSArray *)idents { + [db beginTransaction]; + for (Identity *ident in idents) { + [Database storeIdentity:ident]; + } + [db commit]; +} + + (void) showStoredIdentities { FMResultSet *res = [db executeQuery:@"SELECT `username`, `persistent` FROM `identities`"]; while ([res next]) { diff --git a/Source/Classes/Identity.h b/Source/Classes/Identity.h index d999c37..4234632 100644 --- a/Source/Classes/Identity.h +++ b/Source/Classes/Identity.h @@ -30,14 +30,14 @@ @interface Identity : NSObject { NSInteger _pkey; - NSData *_persistentId; + NSData *_persistent; NSString *_userName; NSString *_fullName; NSString *_emailAddress; } @property (assign) NSInteger primaryKey; -@property (copy) NSData *persistentId; +@property (copy) NSData *persistent; @property (copy) NSString *userName; @property (copy) NSString *fullName; @property (copy) NSString *emailAddress; diff --git a/Source/Classes/Identity.m b/Source/Classes/Identity.m index 2e684be..46af8fa 100644 --- a/Source/Classes/Identity.m +++ b/Source/Classes/Identity.m @@ -33,17 +33,22 @@ @implementation Identity @synthesize primaryKey = _pkey; -@synthesize persistentId = _persistentId; +@synthesize persistent = _persistent; @synthesize userName = _userName; @synthesize fullName = _fullName; @synthesize emailAddress = _emailAddress; - (id) init { self = [super init]; + if (self == nil) + return nil; + + _pkey = -1; + return self; } -- (void) hasPrimaryKey { +- (BOOL) hasPrimaryKey { return _pkey != -1; } diff --git a/Source/Classes/IdentityCreationViewController.m b/Source/Classes/IdentityCreationViewController.m index 77c0acb..44d7e73 100644 --- a/Source/Classes/IdentityCreationViewController.m +++ b/Source/Classes/IdentityCreationViewController.m @@ -193,9 +193,9 @@ if (err == noErr) { if (data != nil) { Identity *ident = [[Identity alloc] init]; - ident.persistentId = data; + ident.persistent = data; ident.userName = @"Tukoff"; - [Database saveIdentity:ident]; + [Database storeIdentity:ident]; [ident release]; NSLog(@"Stored identity..."); } diff --git a/Source/Classes/IdentityViewController.m b/Source/Classes/IdentityViewController.m index cd46dc6..fbfbc5e 100644 --- a/Source/Classes/IdentityViewController.m +++ b/Source/Classes/IdentityViewController.m @@ -113,7 +113,7 @@ static NSUInteger IdentityViewControllerCertificateView = 1; [self animateDeleteRowsCount:deleteCount withRowAnimation:UITableViewRowAnimationRight]; _currentView = currentView; - _identities = [[Database identities] retain]; + _identities = [[Database fetchAllIdentities] retain]; [self animateInsertRowsCount:[_identities count] withRowAnimation:UITableViewRowAnimationLeft]; // View changed to certificate view |