This is MiniSQLAdaptor.m in view mode; [Download] [Up]
#import "MiniSQLAdaptor.h"
#import "MiniSQLAdaptorContext.h"
#import "MiniSQLAdaptorChannel.h"
#import "MiniSQLExpression.h"
#import <foundation/NSArray.h>
#import <foundation/NSString.h>
#import <foundation/NSBundle.h>
#import <foundation/NSDictionary.h>
#import <foundation/NSUtilities.h>
#import <foundation/NSString.h>
#import <foundation/NSValue.h>
#import <eoaccess/eoaccess.h>
#import <objc/objc-runtime.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
@implementation MiniSQLAdaptor
- (Class)expressionClass
// Returns the subclass of EOSQLExpression used by this adaptor for query
// language expressions. You directly invoke this method, but an
// adaptor subclass must properly implement this method.
{
return [MiniSQLExpression class];
}
- (EOAdaptorContext *)createAdaptorContext
// Returns a new EOAdaptorContext, or nil if a new context cannot be
// created. EOAdaptors by default have no contexts at all. The newly
// created context retains its adaptor.
{
return [[[MiniSQLAdaptorContext alloc] initWithAdaptor:self] autorelease];
}
- (BOOL) hasOpenChannels
// Returns YES if the adaptor has any open channels, NO otherwise. See
// -openChannel in EOAdaptorChannel.h.
{
return (openChannels > 0) ? YES : NO;
}
- (void) miniSQLChannelDidConnect
{
openChannels += 1;
}
- (void)miniSQLChannelDidDisconnect
{
if (openChannels > 0) {
openChannels -= 1;
}
}
- (BOOL)hasValidConnectionDictionary
// Returns YES if the adaptor can connect with the current connection
// dictionary, NO otherwise. An actual connection is made when the first
// adaptor channel is sent an -openChannel message.
{
if ([self hasOpenChannels]) {
return YES;
} else {
MiniSQLAdaptorChannel *aChannel = [[[MiniSQLAdaptorChannel alloc]
initWithAdaptor:self
andContext:nil]
autorelease];
return [aChannel connectWithConnectionDictionary:[self connectionDictionary]];
}
}
- formatAttribute:(EOAttribute *)attribute
{
return attribute;
}
- formatValue:value forAttribute:(EOAttribute *) attribute
{
if ((value == nil) || (value == [EONull null])) {
return @"NULL";
} else {
if ([value respondsToSelector:@selector(stringForType:)]) {
NSString *type = [attribute valueType];
return[[[EOQuotedExpression alloc]
initWithExpression:[value stringForType:type]
quote:@"'"
escape:@"'"]
autorelease];
} else {
NSString *type = [attribute externalType];
// MiniSQL now seems to deal with REAL values sans decimal in
// a reasonable way, hence code written to force a decimal point
// inside REAL numbers has disappeared...
if ([type isEqualToString:@"INT"] ||
[type isEqualToString:@"REAL"]) {
return [(NSNumber *)value stringValue];
} else {
return[[[EOQuotedExpression alloc]
initWithExpression:value
quote:@"'"
escape:@"'"]
autorelease];
}
}
}
}
- valueForCString:(const char *)expression
attribute:(EOAttribute *) attribute
zone:(NSZone *) zone
{
id ret = nil;
const char *className;
NSString *valueType;
NSString *externalType;
Class valueClass = (Class) 0;
// get the type of the column
className = [attribute valueClassName];
valueType = [attribute valueType];
externalType = [attribute externalType];
if (className != NULL) {
valueClass = objc_lookUpClass(className);
} else {
if ([externalType isEqualToString:@"INT"] ||
[externalType isEqualToString:@"REAL"]) {
valueClass = [NSNumber class];
} else {
valueClass = [NSString class];
}
}
if (valueClass != NULL) {
if ([valueClass instancesRespondToSelector:
@selector(initWithString:type:)]) {
NSString *string;
string = [[[NSString allocWithZone:zone]
initWithCString:expression]
autorelease];
ret = [[[valueClass allocWithZone:zone]
initWithString:string
type:valueType]
autorelease];
} else if (valueClass == [NSString class]) {
ret = [[[valueClass allocWithZone:zone]
initWithCString:expression]
autorelease];
} else {
if ([externalType isEqualToString:@"INT"]) {
ret = [[[valueClass allocWithZone:zone]
initWithInt:atoi(expression)]
autorelease];
} else {
ret = [[[valueClass allocWithZone:zone]
initWithDouble:atof(expression)]
autorelease];
}
}
} else {
[self reportError:
[NSString stringWithFormat:
@"Adaptor could not create object for attribute %@.",
[attribute name]]];
ret = [[[NSString allocWithZone:zone]
initWithCString:expression]
autorelease];
}
return ret;
}
- (BOOL) isValidQualifierType:(NSString *)typeName
{
// everything is permitted...
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.