Skip to content

Commit

Permalink
It is connecting OK, now to get results coming back
Browse files Browse the repository at this point in the history
  • Loading branch information
dparnell committed Oct 22, 2011
1 parent 3e8e106 commit 4227429
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 7 deletions.
4 changes: 4 additions & 0 deletions FreeTDS.xcodeproj/project.pbxproj
Expand Up @@ -95,6 +95,7 @@
6587B6081450B5C40081A62B /* FreeTDS.h in Headers */ = {isa = PBXBuildFile; fileRef = 6521F18F144E6B1500CBCC36 /* FreeTDS.h */; settings = {ATTRIBUTES = (Public, ); }; };
6587B60B1451727A0081A62B /* FreeTDSResultSetMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 6587B609145172790081A62B /* FreeTDSResultSetMetadata.h */; };
6587B60C1451727A0081A62B /* FreeTDSResultSetMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 6587B60A145172790081A62B /* FreeTDSResultSetMetadata.m */; };
6587B60F14521A300081A62B /* freetds.conf in Resources */ = {isa = PBXBuildFile; fileRef = 6587B60E14521A300081A62B /* freetds.conf */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand Down Expand Up @@ -189,6 +190,7 @@
6587B6031450B4C40081A62B /* FreeTDSResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FreeTDSResultSet.m; sourceTree = "<group>"; };
6587B609145172790081A62B /* FreeTDSResultSetMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FreeTDSResultSetMetadata.h; sourceTree = "<group>"; };
6587B60A145172790081A62B /* FreeTDSResultSetMetadata.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FreeTDSResultSetMetadata.m; sourceTree = "<group>"; };
6587B60E14521A300081A62B /* freetds.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = freetds.conf; path = src/freetds/freetds.conf; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -256,6 +258,7 @@
6521F189144E6B1500CBCC36 /* Supporting Files */ = {
isa = PBXGroup;
children = (
6587B60E14521A300081A62B /* freetds.conf */,
6521F18A144E6B1500CBCC36 /* FreeTDS-Info.plist */,
6521F18B144E6B1500CBCC36 /* InfoPlist.strings */,
6521F18E144E6B1500CBCC36 /* FreeTDS-Prefix.pch */,
Expand Down Expand Up @@ -495,6 +498,7 @@
files = (
6521F18D144E6B1500CBCC36 /* InfoPlist.strings in Resources */,
6521F24E144E6D8D00CBCC36 /* tdsver.h.in in Resources */,
6587B60F14521A300081A62B /* freetds.conf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
3 changes: 3 additions & 0 deletions FreeTDS/FreeTDS.h
Expand Up @@ -12,10 +12,13 @@
#import <FreeTDS/FreeTDSResultSet.h>

const extern NSString* FREETDS_SERVER;
const extern NSString* FREETDS_HOST;
const extern NSString* FREETDS_PORT;
const extern NSString* FREETDS_USER;
const extern NSString* FREETDS_PASS;
const extern NSString* FREETDS_DATABASE;
const extern NSString* FREETDS_APPLICATION;
const extern NSString* FREETDS_PROTOCOL_VERSION;

const extern NSString* FREETDS_OS_ERROR;
const extern NSString* FREETDS_OS_CODE;
Expand Down
48 changes: 41 additions & 7 deletions FreeTDS/FreeTDS.m
Expand Up @@ -8,11 +8,16 @@

#import "FreeTDS.h"

#define DEFAULT_PROTOCOL_VERSION 5

const NSString* FREETDS_SERVER = @"Server";
const NSString* FREETDS_USER = @"User";
const NSString* FREETDS_PASS = @"Password";
const NSString* FREETDS_DATABASE = @"Database";
const NSString* FREETDS_APPLICATION = @"Application";
const NSString* FREETDS_HOST = @"Host";
const NSString* FREETDS_PORT = @"Port";
const NSString* FREETDS_PROTOCOL_VERSION = @"Protocol Version";

const NSString* FREETDS_OS_ERROR = @"OS Error Description";
const NSString* FREETDS_OS_CODE = @"OS Error Code";
Expand Down Expand Up @@ -44,9 +49,19 @@ @implementation FreeTDS

static NSException* login_exception = nil;

static id string_or_null(const char* s) {
if(s) {
return [NSString stringWithCString: s encoding: NSUTF8StringEncoding];
}

return [NSNull null];
}

static int err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr) {
FreeTDS* free_tds = (FreeTDS*)dbgetuserdata(dbproc);

NSLog(@"err_handler: %p %d %d %d %s %s", dbproc, severity, dberr, oserr, dberrstr, oserrstr);

int return_value = INT_CONTINUE;
int cancel = 0;
switch(dberr) {
Expand All @@ -59,7 +74,7 @@ static int err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, ch
case SYBEFCON:
case SYBESOCK:
case SYBECONN:
return_value = INT_EXIT;
return_value = INT_CANCEL;
break;
case SYBESEOF: {
if (free_tds && free_tds->timing_out)
Expand Down Expand Up @@ -92,9 +107,9 @@ static int err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, ch
NSException* ex = [NSException exceptionWithName: @"FreeTDS"
reason: [NSString stringWithFormat: @"%d - %s", dberr, dberrstr]
userInfo: [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithCString: oserrstr encoding: NSUTF8StringEncoding], FREETDS_OS_ERROR,
string_or_null(oserrstr), FREETDS_OS_ERROR,
[NSNumber numberWithInt: oserr], FREETDS_OS_CODE,
[NSString stringWithCString: dberrstr encoding: NSUTF8StringEncoding], FREETDS_DB_ERROR,
string_or_null(dberrstr), FREETDS_DB_ERROR,
[NSNumber numberWithInt: dberr], FREETDS_DB_CODE,
[NSNumber numberWithInt: severity], FREETDS_SEVERITY,
nil]];
Expand All @@ -105,21 +120,22 @@ static int err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, ch
login_exception = ex;
}

return INT_CONTINUE;
return return_value;
}

static int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, int severity, char *msgtext, char *srvname, char *procname, int line) {
FreeTDS* free_tds = (FreeTDS*)dbgetuserdata(dbproc);

NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithCString: msgtext encoding: NSUTF8StringEncoding], FREETDS_MESSAGE,
string_or_null(msgtext), FREETDS_MESSAGE,
[NSNumber numberWithInt: msgno], FREETDS_MESSAGE_NUMBER,
[NSNumber numberWithInt: msgstate], FREETDS_MESSAGE_STATE,
[NSString stringWithCString: srvname encoding: NSUTF8StringEncoding], FREETDS_SERVER,
[NSString stringWithCString: procname encoding: NSUTF8StringEncoding], FREETDS_PROC_NAME,
string_or_null(srvname), FREETDS_SERVER,
string_or_null(procname), FREETDS_PROC_NAME,
[NSNumber numberWithInt: line], FREETDS_LINE,
[NSNumber numberWithInt: severity], FREETDS_SEVERITY,
nil];
NSLog(@"info = %@", info);

if(severity>10) {
NSException* ex = [NSException exceptionWithName: @"FreeTDS"
Expand Down Expand Up @@ -170,10 +186,12 @@ - (void) loginWithDictionary:(NSDictionary*)dictionary {
NSString* server = [dictionary objectForKey: FREETDS_SERVER];
NSString* database = [dictionary objectForKey: FREETDS_DATABASE];
NSString* application = [dictionary objectForKey: FREETDS_APPLICATION];
NSNumber* protocol = [dictionary objectForKey: FREETDS_PROTOCOL_VERSION];

if(dbinit() == FAIL) {
@throw [NSException exceptionWithName: @"FreeTDS" reason: NSLocalizedString(@"Could not initialize FreeTDS", @"dbinit failed") userInfo: nil];
}
dbsetifile((char *)[[[NSBundle bundleForClass: [FreeTDS class]] pathForResource: @"freetds" ofType: @"conf"] UTF8String]);

dberrhandle(err_handler);
dbmsghandle(msg_handler);
Expand All @@ -188,6 +206,22 @@ - (void) loginWithDictionary:(NSDictionary*)dictionary {
if(application) {
dbsetlapp(login, [application UTF8String]);
}
if(protocol) {
dbsetlversion(login, [protocol intValue]);
} else {
dbsetlversion(login, DEFAULT_PROTOCOL_VERSION);
}

if(server == nil) {
NSString* host = [dictionary objectForKey: FREETDS_HOST];
NSNumber* port = [dictionary objectForKey: FREETDS_PORT];

if(port == nil) {
server = [host stringByAppendingString: @":1433"];
} else {
server = [host stringByAppendingFormat: @":%d", [port intValue]];
}
}

[login_lock lock];
@try {
Expand Down

0 comments on commit 4227429

Please sign in to comment.