/****************************************************************************** @header BDBCursor @availability OS X, GNUstep @copyright (C) 2004, 2005, 2006 Oliver Langer Author: Oliver Langer 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

  28.12.2004 ola     initial version
  22.08.2006 ola     license changed
  -------------------------------------------------------------------------
  
******************************************************************************/ #include #include #include @implementation BDBCursor - initWithCursor: (DBC *) aCursor config: (BDBCursorConfig *) aConfig { self = [super init]; self->cursor = aCursor; self->config = [config retain]; return self; } - (void) dealloc { if( NULL != self->cursor ) { cursor->c_close( cursor ); cursor = NULL; if( nil != config ) { [ config release ]; config = nil; } } [super dealloc]; } - (BDBOperationStatus) entryWithKey: (BDBDatabaseEntryData *) aKey value: (BDBDatabaseEntryData *) aValue flags: (u_int32_t) flags { NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ]; NSData *valueData; DBT dbKey, dbValue; int dbResult = BDB_STATUS_UNKNOWN; if( nil == aKey || nil == aValue ) { [[[ECIllegalArgumentException alloc ] initWithArgumentInfo: @"key or data equals nil"] raise]; } memset( &dbKey, 0, sizeof( dbKey ) ); memset( &dbValue, 0, sizeof( dbValue ) ); dbKey.data = (void *) [ [ aKey data] bytes ]; dbKey.size = [ [ aKey data ] length ]; dbValue.flags = DB_DBT_MALLOC; dbResult = cursor->c_get(cursor, &dbKey, &dbValue, flags ); BDB_ERROR_CODE_EVAL_BEGIN(dbResult); BDB_ERROR_CODE_EVAL_ON_THROW_BEGIN [ pool release ]; if( NULL != dbValue.data ) { free( dbValue.data ); } BDB_ERROR_CODE_EVAL_ON_THROW_END BDB_ERROR_CODE_EVAL_END; if( BDB_STATUS_SUCCESS == dbResult ) { /* at present we do not support user buffers, so :*/ valueData = [ [ [ NSData alloc ] initWithBytes:dbValue.data length:dbValue.size ] autorelease ] ; [ aValue setData: valueData ]; } if( NULL != dbValue.data ) { free( dbValue.data ); } [ pool release ]; return dbResult; } - (BDBOperationStatus) firstWithKey: (BDBDatabaseEntryData *) aKey value: (BDBDatabaseEntryData *) aValue lockMode: (BDBLockMode *) aLockMode { return [self entryWithKey: aKey value:aValue flags:[aLockMode flags] | DB_FIRST ]; } - (BDBOperationStatus) lastWithKey: (BDBDatabaseEntryData *) aKey value: (BDBDatabaseEntryData *) aValue lockMode: (BDBLockMode *) aLockMode { return [self entryWithKey: aKey value:aValue flags:[aLockMode flags] | DB_LAST ]; } - (BDBOperationStatus) nextWithKey: (BDBDatabaseEntryData *) aKey value: (BDBDatabaseEntryData *) aValue lockMode: (BDBLockMode *) aLockMode { return [self entryWithKey: aKey value:aValue flags:[aLockMode flags] | DB_NEXT ]; } - (BDBOperationStatus) previousWithKey: (BDBDatabaseEntryData *) aKey value: (BDBDatabaseEntryData *) aValue lockMode: (BDBLockMode *) aLockMode { return [self entryWithKey: aKey value:aValue flags:[aLockMode flags] | DB_PREV ]; } @end