diff options
Diffstat (limited to 'trunk/CMMCPConnection.m')
-rw-r--r-- | trunk/CMMCPConnection.m | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/trunk/CMMCPConnection.m b/trunk/CMMCPConnection.m new file mode 100644 index 00000000..8d4e2673 --- /dev/null +++ b/trunk/CMMCPConnection.m @@ -0,0 +1,207 @@ +// +// CMMCPConnection.m +// sequel-pro +// +// Created by lorenz textor (lorenz@textor.ch) on Wed Sept 21 2005. +// Copyright (c) 2002-2003 Lorenz Textor. All rights reserved. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at <http://code.google.com/p/sequel-pro/> +// Or mail to <lorenz@textor.ch> + +#import "CMMCPConnection.h" + + +@implementation CMMCPConnection + +/* +Gets a proper NSStringEncoding according to the given MySQL charset. + +MySQL 4.0 offers this charsets: +big5 cp1251 cp1257 croat czech danish dec8 dos estonia euc_kr gb2312 gbk german1 greek hebrew hp8 hungarian koi8_ru koi8_ukr latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis usa7 win1250 win1251ukr + +WARNING : incomplete implementation. Please, send your fixes. + ++ (NSStringEncoding) encodingForMySQLEncoding:(const char *) mysqlEncoding +{ + // unicode + if (!strncmp(mysqlEncoding, "utf8", 4)) { + return NSUTF8StringEncoding; + } + if (!strncmp(mysqlEncoding, "ucs2", 4)) { + return NSUnicodeStringEncoding; + } + // west european + if (!strncmp(mysqlEncoding, "ascii", 5)) { + return NSASCIIStringEncoding; + } + if (!strncmp(mysqlEncoding, "latin1", 6)) { + return NSISOLatin1StringEncoding; + } + if (!strncmp(mysqlEncoding, "macroman", 8)) { + return NSMacOSRomanStringEncoding; + } + // central european + if (!strncmp(mysqlEncoding, "cp1250", 6)) { + return NSWindowsCP1250StringEncoding; + } + if (!strncmp(mysqlEncoding, "latin2", 6)) { + return NSISOLatin2StringEncoding; + } + // south european and middle east + if (!strncmp(mysqlEncoding, "cp1256", 6)) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsArabic); + } + if (!strncmp(mysqlEncoding, "greek", 5)) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatinGreek); + } + if (!strncmp(mysqlEncoding, "hebrew", 6)) { + CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatinHebrew); + } + if (!strncmp(mysqlEncoding, "latin5", 6)) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin5); + } + // baltic + if (!strncmp(mysqlEncoding, "cp1257", 6)) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsBalticRim); + } + // cyrillic + if (!strncmp(mysqlEncoding, "cp1251", 6)) { + return NSWindowsCP1251StringEncoding; + } + // asian + if (!strncmp(mysqlEncoding, "big5", 4)) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5); + } + if (!strncmp(mysqlEncoding, "ujis", 4)) { + return NSJapaneseEUCStringEncoding; + } + if (!strncmp(mysqlEncoding, "sjis", 4)) { + return NSShiftJISStringEncoding; + } + + // default to iso latin 1, even if it is not exact (throw an exception?) + NSLog(@"warning: unknown encoding %s! falling back to latin1.", mysqlEncoding); + return NSISOLatin1StringEncoding; +} +*/ + + +/* + modified version of queryString to be used in sequel-pro + */ +- (CMMCPResult *)queryString:(NSString *) query +{ + CMMCPResult *theResult; + const char *theCQuery = [self cStringFromString:query]; + int theQueryCode; + + // check connection + if (![self checkConnection]) { + NSLog(@"Connection was gone, but should be reestablished now!"); + } + + // inform the delegate about the query + if (delegate && [delegate respondsToSelector:@selector(willQueryString:)]) { + [delegate willQueryString:query]; + } + + if (0 == (theQueryCode = mysql_query(mConnection, theCQuery))) { + if (mysql_field_count(mConnection) != 0) { + // use CMMCPResult instad of MCPResult + theResult = [[CMMCPResult alloc] initWithMySQLPtr:mConnection encoding:mEncoding timeZone:mTimeZone]; + } else { + return nil; + } + } else { +// NSLog (@"Problem in queryString error code is : %d, query is : %s -in ObjC : %@-\n", theQueryCode, theCQuery, query); +// NSLog(@"Error message is : %@\n", [self getLastErrorMessage]); +// theResult = [theResult init]; // Old version... +// theResult = nil; + + // inform the delegate about errors + if (delegate && [delegate respondsToSelector:@selector(queryGaveError:)]) { + [delegate queryGaveError:[self getLastErrorMessage]]; + } + + return nil; + } + return [theResult autorelease]; +} + +- (void)setDelegate:(id)object +{ + delegate = object; +} + +/* Getting the currently used time zone (in communication with the DB server). */ +/* fixes mysql 4.1.14 problem, can be deleted as soon as fixed in the framework */ +- (NSTimeZone *)timeZone +{ + if ([self checkConnection]) { + MCPResult *theSessionTZ = [self queryString:@"SHOW VARIABLES LIKE '%time_zone'"]; + NSArray *theRow; + id theTZName; + NSTimeZone *theTZ; + + [theSessionTZ dataSeek:1ULL]; + theRow = [theSessionTZ fetchRowAsArray]; + theTZName = [theRow objectAtIndex:1]; + + if ( [theTZName isKindOfClass:[NSData class]] ) { + // MySQL 4.1.14 returns the mysql variables as NSData + theTZName = [self stringWithText:theTZName]; + } + + if ([theTZName isEqualToString:@"SYSTEM"]) { + [theSessionTZ dataSeek:0ULL]; + theRow = [theSessionTZ fetchRowAsArray]; + theTZName = [theRow objectAtIndex:1]; + + if ( [theTZName isKindOfClass:[NSData class]] ) { + // MySQL 4.1.14 returns the mysql variables as NSData + theTZName = [self stringWithText:theTZName]; + } + } + + if (theTZName) { // Old versions of the server does not support there own time zone ? + theTZ = [NSTimeZone timeZoneWithName:theTZName]; + } else { + // By default set the time zone to the local one.. + // Try to get the name using the previously available variable: + theSessionTZ = [self queryString:@"SHOW VARIABLES LIKE 'timezone'"]; + [theSessionTZ dataSeek:0ULL]; + theRow = [theSessionTZ fetchRowAsArray]; + theTZName = [theRow objectAtIndex:1]; + if (theTZName) { + // Finally we found one ... + theTZ = [NSTimeZone timeZoneWithName:theTZName]; + } else { + theTZ = [NSTimeZone defaultTimeZone]; + //theTZ = [NSTimeZone systemTimeZone]; + NSLog(@"The time zone is not defined on the server, set it to the default one : %@", theTZ); + } + } + + if (theTZ != mTimeZone) { + [mTimeZone release]; + mTimeZone = [theTZ retain]; + } + } + return mTimeZone; +} + +@end |