/*!
@header FTGenericDictionaryProviderImpl
@abstract Module of FT
@availability OS X, GNUstep
@copyright 2004, 2005, 2006 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-------------------------------------------------------------------------
Modification history
01.03.05 ola initial version
23.08.06 ola license changed
-------------------------------------------------------------------------
*/
#include
#include
#include
#include
@implementation FTGenericDictionaryProviderImpl
- initWithDatabase: (BDBDatabase *) aDatabase {
self = [super init];
self->database = [aDatabase retain];
self->lock = [[NSLock alloc] init];
return self;
}
- (void) dealloc {
[self->lock release];
[self->database release];
[super dealloc];
}
- (BDBDatabaseEntry *) lookupEntryForKey: (id ) aKey {
BDBDatabaseEntry *key, *entry;
BDBOperationStatus operationStatus = BDB_STATUS_UNKNOWN;
EC_AUTORELEASEPOOL_BEGIN
key = [[[BDBDatabaseEntry alloc] initWithObject: aKey] autorelease];
entry = [[BDBDatabaseEntry alloc] init];
operationStatus = [self->database getEntryWithTransaction: nil
key: key data: entry];
if( BDB_STATUS_NOTFOUND != operationStatus ) {
if( BDB_STATUS_SUCCESS != operationStatus ) {
/** an error occured */
EC_AUTORELEASEPOOL_RELEASE
[[[ FTInternalDatamanagementException alloc]
initWithOperationStatus: operationStatus] raise];
}
} else {
[entry release];
entry = nil;
}
EC_AUTORELEASEPOOL_END
return entry;
}
- objectForKey: (id ) aKey {
BDBDatabaseEntry *value;
id toReturn = nil;
if( [[FTLogging coreLog] isDebugEnabled] ) {
[[FTLogging coreLog]
debug: @"FTGenericDictionaryProviderImpl::objectForKey: key= %@", aKey ];
}
value = [self lookupEntryForKey: aKey];
if( nil != value ) {
toReturn = [[value object] retain];
[value release];
}
return toReturn;
}
- setObject: (id ) anObject forKey: (id ) aKey {
BDBDatabaseEntry *key, *value;
BDBOperationStatus operationStatus = BDB_STATUS_UNKNOWN;
EC_AUTORELEASEPOOL_BEGIN
[self->lock lock];
NS_DURING
/**
* Lookup the entry first. If there already exists an entry then remove it
* first.
*/
value = [self lookupEntryForKey: aKey];
if( nil != value ) {
key = [[[BDBDatabaseEntry alloc] initWithObject: aKey] autorelease];
/**
* delete this entry:
*/
operationStatus = [self->database deleteEntryWithTransaction: nil
key: key];
if( BDB_STATUS_SUCCESS != operationStatus ) {
[[[ECIllegalStateException alloc] initWithIllegalStateInfo:
@"FTGenericDictionaryProviderImpl::setObject: Unable to delete "\
"existing entry" ] raise];
}
}
key = [[[BDBDatabaseEntry alloc] initWithObject: aKey] autorelease];
value = [[[BDBDatabaseEntry alloc] initWithObject: anObject] autorelease];
operationStatus = [self->database putEntryWithTransaction: nil
key: key value: value];
if( BDB_STATUS_SUCCESS != operationStatus ) {
/** an error occured */
[[[FTInternalDatamanagementException alloc]
initWithOperationStatus: operationStatus] raise];
}
NS_HANDLER
[self->lock unlock];
EC_AUTORELEASEPOOL_RELEASE
[localException raise];
NS_ENDHANDLER
[self->lock unlock];
EC_AUTORELEASEPOOL_END
return self;
}
@end