This is MiniSQLAdaptorContext.m in view mode; [Download] [Up]
#import "MiniSQLAdaptorContext.h"
#import "MiniSQLAdaptorChannel.h"
#import "MiniSQLAdaptor.h"
#import <eoaccess/eoaccess.h>
@implementation MiniSQLAdaptorContext
- initWithAdaptor:(MiniSQLAdaptor *)anAdaptor
{
[super init];
adaptor = [anAdaptor retain];
return self;
}
- (void) dealloc
{
[adaptor release];
[super dealloc];
}
- (EOAdaptor *)adaptor;
// Returns the EOAdaptor that handles the connection within which the
// adaptor context works.
{
return adaptor;
}
- (EOAdaptorChannel *) createAdaptorChannel
// Returns a new EOAdaptorChannel. Returns nil if a new channel cannot
// be created. EOAdaptorContexts by default have no channels at all. The
// newly created channel retains its context.
{
// only return one...
if (channel) {
return nil;
} else {
channel = [[[MiniSQLAdaptorChannel allocWithZone:[self zone]]
initWithAdaptor:adaptor
andContext:self]
autorelease];
return channel;
}
}
- (BOOL)beginTransaction
// Attempts to begin a new transaction, nested within the current one if
// nested transaction are supported, returning YES if successful and NO
// if not.
{
#ifdef REAL_TP_SUPPORT
NSString *string;
#endif
// notify the delegate if possible...
if (_delegateRespondsTo.willBegin) {
EODelegateResponse response;
response = [_delegate adaptorContextWillBegin:self];
if (response == EODelegateOverrides) {
return YES;
}
if (response != EODelegateApproves) {
return NO;
}
}
// perform a sanity check...
if ([channel isFetchInProgress]) {
[adaptor reportError:@"Illegal attempt to begin a transaction while a fetch is in progress."];
return NO;
}
transaction += 1;
#ifdef REAL_TP_SUPPORT
// process transactions...
if (transaction == 1) {
string = @"BEGIN TRANSACTION";
} else {
string = [NSString stringWithFormat:@"SAVE TRANSACTION T_%d", transaction];
}
if (![channel evaluateExpression:string]) {
transaction -= 1;
return NO;
}
#endif
if (_delegateRespondsTo.didBegin)
[_delegate adaptorContextDidBegin:self];
return YES;
}
- (BOOL)commitTransaction
// Attempts to commit the last transaction begun, returning YES if
// successful and NO if not.
{
BOOL result;
if (_delegateRespondsTo.willCommit) {
EODelegateResponse response;
response = [_delegate adaptorContextWillCommit:self];
if (response == EODelegateOverrides) {
return YES;
}
if (response != EODelegateApproves) {
return NO;
}
}
if ([channel isFetchInProgress]) {
[adaptor reportError:@"Illegal attempt to commit a transaction while a fetch is in progress."];
return NO;
}
if (![self transactionNestingLevel]) {
[adaptor reportError:@"Illegal attempt to commit a transaction when there are none in progress."];
return NO;
}
if (transaction > 0) {
result = YES;
#ifdef REAL_TP_SUPPORT
// process transactions...
if (transaction == 1)
result = [channel evaluateExpression:@"COMMIT TRANSACTION"];
if (result == YES) {
#endif
transaction -= 1;
if (_delegateRespondsTo.didCommit)
[_delegate adaptorContextDidCommit:self];
return YES;
#ifdef REAL_TP_SUPPORT
}
#endif
}
return NO;
}
- (BOOL)rollbackTransaction
// Attempts to roll back the last transaction begun, returning YES if
// successful and NO if not.
{
if (_delegateRespondsTo.willRollback) {
EODelegateResponse response;
response = [_delegate adaptorContextWillRollback:self];
if (response == EODelegateOverrides) {
return YES;
}
if (response != EODelegateApproves) {
return NO;
}
}
if (![self transactionNestingLevel]) {
[adaptor reportError:@"Illegal attempt to rollback a transaction when there are none in progress."];
return NO;
}
if (transaction > 0) {
#ifdef REAL_TP_SUPPORT
if (transaction == 1) {
string = @"ROLLBACK TRANSACTION";
} else {
string = [NSString stringWithFormat:
@"ROLLBACK TRANSACTION T_%d", transaction];
}
if ([channel evaluateExpression:string]) {
#endif
transaction -= 1;
if (_delegateRespondsTo.didRollback) {
[_delegate adaptorContextDidRollback:self];
}
return YES;
#ifdef REAL_TP_SUPPORT
}
#endif
}
return NO;
}
- (BOOL)canNestTransactions
// Returns YES if the database server can nest transactions, NO
// otherwise.
{
return YES;
}
- (unsigned)nestedTransactions
// Returns the number of transactions in progress. If transactions
// can nest, this number may be greater than one.
{
return transaction;
}
- (unsigned int)transactionNestingLevel
// A cover for -nestedTransactions.
{
return [self nestedTransactions];
}
- (void)transactionDidBegin
{
transaction += 1;
}
- (void)transactionDidCommit
{
if (transaction != 0) {
transaction -= 1;
}
}
- (void)transactionDidRollback
{
if (transaction != 0) {
transaction -= 1;
}
}
- (BOOL)hasBusyChannels
// Returns YES if the receiver has channels that have outstanding
// operations (that is, have a fetch in progress), NO otherwise.
{
return [channel isFetchInProgress] ? YES : NO;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.