mirror of
https://github.com/gnustep/libs-sqlclient.git
synced 2025-02-20 18:32:06 +00:00
client name settings
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/sqlclient/trunk@38694 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
1e129e7b8c
commit
be9d9def45
4 changed files with 163 additions and 30 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,7 +1,17 @@
|
|||
2015-06-26 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* SQLClient.h:
|
||||
* SQLClient.m:
|
||||
* SQLClientPool.m:
|
||||
Implement -transaction method for client pools so that we can build
|
||||
a transaction which, when executed, will use any available client
|
||||
from the pool.
|
||||
Support setting of the client name for clients in a pool.
|
||||
|
||||
2015-06-25 Niels Grewe <niels.grewe@halbordnung.de>
|
||||
|
||||
* SQLClient.[hm]: Add an accessor method to obtain the SQLClientPool
|
||||
object owning a specific SQLClient.
|
||||
object owning a specific SQLClient.
|
||||
|
||||
2015-06-25 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
|
|
37
SQLClient.h
37
SQLClient.h
|
@ -924,6 +924,14 @@ SQLCLIENT_PRIVATE
|
|||
*/
|
||||
- (void) rollback;
|
||||
|
||||
/**
|
||||
* Set the client name for this client.<br />
|
||||
* If this is not set (or is set to nul) a globally unique string is used.<br />
|
||||
* NB. Setting the name may not be reflected in the database server until
|
||||
* the client disconnects and reconnects.
|
||||
*/
|
||||
- (void) setClientName: (NSString*)s;
|
||||
|
||||
/**
|
||||
* Set the database host/name for this object.<br />
|
||||
* This is called automatically to configure the connection ...
|
||||
|
@ -1343,8 +1351,7 @@ SQLCLIENT_PRIVATE
|
|||
*/
|
||||
- (void) singletons: (NSMutableArray*)records;
|
||||
|
||||
/**
|
||||
* Creates and returns an autoreleased SQLTransaction instance which will
|
||||
/** Creates and returns an autoreleased SQLTransaction instance which will
|
||||
* use the receiver as the database connection to perform transactions.
|
||||
*/
|
||||
- (SQLTransaction*) transaction;
|
||||
|
@ -1637,11 +1644,20 @@ SQLCLIENT_PRIVATE
|
|||
*/
|
||||
- (void) setCache: (GSCache*)aCache;
|
||||
|
||||
/**
|
||||
* Sets the cache thread for all the clients in the pool.
|
||||
/** Sets the cache thread for all the clients in the pool.
|
||||
*/
|
||||
- (void) setCacheThread: (NSThread*)aThread;
|
||||
|
||||
/** Set the client name for all the client connections in the pool.<br />
|
||||
* If the argument is not nil, the name of each client in the pool
|
||||
* is set to the argument with a suffix of '(x)' where x is the number
|
||||
* of the client within the pool, otherwise (nil argument) each client
|
||||
* is allocated a globally unique string as its name.<br />
|
||||
* NB. This setting does not apply to new connections added when the pool
|
||||
* maximum size is increased.
|
||||
*/
|
||||
- (void) setClientName: (NSString*)s;
|
||||
|
||||
/** Set the debugging level for all clients in the pool.
|
||||
*/
|
||||
- (void) setDebugging: (unsigned int)level;
|
||||
|
@ -1686,6 +1702,11 @@ SQLCLIENT_PRIVATE
|
|||
*/
|
||||
- (BOOL) swallowClient: (SQLClient*)client;
|
||||
|
||||
/** Creates and returns an autoreleased SQLTransaction instance which will
|
||||
* use the receiver as the database connection to perform transactions.
|
||||
*/
|
||||
- (SQLTransaction*) transaction;
|
||||
|
||||
@end
|
||||
|
||||
/** This category lists the convenience methods provided by a pool instance
|
||||
|
@ -1750,7 +1771,7 @@ SQLCLIENT_PRIVATE
|
|||
@interface SQLTransaction : NSObject <NSCopying>
|
||||
{
|
||||
SQLCLIENT_PRIVATE
|
||||
SQLClient *_db;
|
||||
id _db;
|
||||
NSMutableArray *_info;
|
||||
unsigned _count;
|
||||
BOOL _batch;
|
||||
|
@ -1803,9 +1824,11 @@ SQLCLIENT_PRIVATE
|
|||
|
||||
/**
|
||||
* Returns the database client with which this instance operates.<br />
|
||||
* This client is retained by the transaction.
|
||||
* This client is retained by the transaction.<br />
|
||||
* If the transaction was created by/for an SQLClientPool, this method
|
||||
* returns that pool rather than an individual client.
|
||||
*/
|
||||
- (SQLClient*) db;
|
||||
- (id) db;
|
||||
|
||||
/**
|
||||
* <p>Performs any statements added to the transaction as a single operation.
|
||||
|
|
110
SQLClient.m
110
SQLClient.m
|
@ -88,6 +88,9 @@ static Class SQLClientClass = Nil;
|
|||
@interface SQLClientPool (Swallow)
|
||||
- (BOOL) _swallowClient: (SQLClient*)client withRetain: (BOOL)shouldRetain;
|
||||
@end
|
||||
@interface SQLTransaction (Creation)
|
||||
+ (SQLTransaction*) _transactionUsing: (id)clientOrPool;
|
||||
@end
|
||||
|
||||
@implementation SQLRecordKeys
|
||||
|
||||
|
@ -1088,7 +1091,16 @@ static int poolConnections = 0;
|
|||
|
||||
- (NSString*) clientName
|
||||
{
|
||||
return _client;
|
||||
NSString *s;
|
||||
|
||||
[lock lock];
|
||||
if (nil == _client)
|
||||
{
|
||||
_client = [[[NSProcessInfo processInfo] globallyUniqueString] retain];
|
||||
}
|
||||
s = [_client retain];
|
||||
[lock unlock];
|
||||
return [s autorelease];
|
||||
}
|
||||
|
||||
- (void) commit
|
||||
|
@ -1890,6 +1902,13 @@ static int poolConnections = 0;
|
|||
NS_ENDHANDLER
|
||||
}
|
||||
|
||||
- (void) setClientName: (NSString*)s
|
||||
{
|
||||
[lock lock];
|
||||
ASSIGNCOPY(_client, s);
|
||||
[lock unlock];
|
||||
}
|
||||
|
||||
- (void) setDatabase: (NSString*)s
|
||||
{
|
||||
[lock lock];
|
||||
|
@ -1949,8 +1968,11 @@ static int poolConnections = 0;
|
|||
s = [s copy];
|
||||
[_name release];
|
||||
_name = s;
|
||||
[_client release];
|
||||
_client = [[[NSProcessInfo processInfo] globallyUniqueString] retain];
|
||||
if (nil == _client)
|
||||
{
|
||||
_client
|
||||
= [[[NSProcessInfo processInfo] globallyUniqueString] retain];
|
||||
}
|
||||
if (nil == _pool && _name != nil)
|
||||
{
|
||||
NSMapInsert(clientsMap, (void*)_name, (void*)self);
|
||||
|
@ -2842,15 +2864,9 @@ static int poolConnections = 0;
|
|||
|
||||
- (SQLTransaction*) transaction
|
||||
{
|
||||
SQLTransaction *transaction;
|
||||
|
||||
transaction = (SQLTransaction*)NSAllocateObject([SQLTransaction class], 0,
|
||||
NSDefaultMallocZone());
|
||||
|
||||
transaction->_db = [self retain];
|
||||
transaction->_info = [NSMutableArray new];
|
||||
return [(SQLTransaction*)transaction autorelease];
|
||||
return [SQLTransaction _transactionUsing: self];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
@ -3108,6 +3124,18 @@ static int poolConnections = 0;
|
|||
|
||||
@implementation SQLTransaction
|
||||
|
||||
+ (SQLTransaction*) _transactionUsing: (id)clientOrPool
|
||||
{
|
||||
SQLTransaction *transaction;
|
||||
|
||||
transaction = (SQLTransaction*)NSAllocateObject(self, 0,
|
||||
NSDefaultMallocZone());
|
||||
|
||||
transaction->_db = [clientOrPool retain];
|
||||
transaction->_info = [NSMutableArray new];
|
||||
return [transaction autorelease];
|
||||
}
|
||||
|
||||
- (void) _addSQL: (NSMutableString*)sql andArgs: (NSMutableArray*)args
|
||||
{
|
||||
unsigned count = [_info count];
|
||||
|
@ -3399,7 +3427,7 @@ static int poolConnections = 0;
|
|||
return [_info count];
|
||||
}
|
||||
|
||||
- (SQLClient*) db
|
||||
- (id) db
|
||||
{
|
||||
return _db;
|
||||
}
|
||||
|
@ -3423,11 +3451,24 @@ static int poolConnections = 0;
|
|||
if (_count > 0)
|
||||
{
|
||||
NSMutableArray *info = nil;
|
||||
NSRecursiveLock *dbLock = [_db _lock];
|
||||
SQLClientPool *pool = nil;
|
||||
SQLClient *db;
|
||||
NSRecursiveLock *dbLock;
|
||||
BOOL wrap;
|
||||
|
||||
if ([_db isKindOfClass: [SQLClientPool class]])
|
||||
{
|
||||
pool = (SQLClientPool*)_db;
|
||||
db = [pool provideClient];
|
||||
}
|
||||
else
|
||||
{
|
||||
db = _db;
|
||||
}
|
||||
|
||||
dbLock = [db _lock];
|
||||
[dbLock lock];
|
||||
wrap = [_db isInTransaction] ? NO : YES;
|
||||
wrap = [db isInTransaction] ? NO : YES;
|
||||
NS_DURING
|
||||
{
|
||||
NSMutableString *sql;
|
||||
|
@ -3454,9 +3495,13 @@ static int poolConnections = 0;
|
|||
[sql appendString: @"commit;"];
|
||||
}
|
||||
|
||||
[_db simpleExecute: info];
|
||||
[db simpleExecute: info];
|
||||
[info release]; info = nil;
|
||||
[dbLock unlock];
|
||||
if (nil != pool)
|
||||
{
|
||||
[pool swallowClient: db];
|
||||
}
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
|
@ -3467,16 +3512,20 @@ static int poolConnections = 0;
|
|||
{
|
||||
NS_DURING
|
||||
{
|
||||
[_db simpleExecute: rollbackStatement];
|
||||
[db simpleExecute: rollbackStatement];
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
[_db disconnect];
|
||||
[db disconnect];
|
||||
NSLog(@"Disconnected due to failed rollback after %@", e);
|
||||
}
|
||||
NS_ENDHANDLER
|
||||
}
|
||||
[dbLock unlock];
|
||||
if (nil != pool)
|
||||
{
|
||||
[pool swallowClient: db];
|
||||
}
|
||||
[e raise];
|
||||
}
|
||||
NS_ENDHANDLER
|
||||
|
@ -3496,7 +3545,20 @@ static int poolConnections = 0;
|
|||
if (_count > 0)
|
||||
{
|
||||
NSRecursiveLock *dbLock = [_db _lock];
|
||||
SQLClientPool *pool = nil;
|
||||
SQLClient *db;
|
||||
|
||||
if ([_db isKindOfClass: [SQLClientPool class]])
|
||||
{
|
||||
pool = (SQLClientPool*)_db;
|
||||
db = [pool provideClient];
|
||||
}
|
||||
else
|
||||
{
|
||||
db = _db;
|
||||
}
|
||||
|
||||
dbLock = [db _lock];
|
||||
[dbLock lock];
|
||||
NS_DURING
|
||||
{
|
||||
|
@ -3505,9 +3567,9 @@ static int poolConnections = 0;
|
|||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
if (log == YES || [_db debugging] > 0)
|
||||
if (log == YES || [db debugging] > 0)
|
||||
{
|
||||
[_db debug: @"Initial failure executing batch %@: %@",
|
||||
[db debug: @"Initial failure executing batch %@: %@",
|
||||
self, localException];
|
||||
}
|
||||
if (_batch == YES)
|
||||
|
@ -3536,7 +3598,7 @@ static int poolConnections = 0;
|
|||
*/
|
||||
if (wrapper == nil)
|
||||
{
|
||||
wrapper = [_db transaction];
|
||||
wrapper = [db transaction];
|
||||
}
|
||||
[wrapper reset];
|
||||
[wrapper addPrepared: o];
|
||||
|
@ -3550,9 +3612,9 @@ static int poolConnections = 0;
|
|||
{
|
||||
[failures addPrepared: o];
|
||||
}
|
||||
if (log == YES || [_db debugging] > 0)
|
||||
if (log == YES || [db debugging] > 0)
|
||||
{
|
||||
[_db debug:
|
||||
[db debug:
|
||||
@"Failure of %d executing batch %@: %@",
|
||||
i, self, localException];
|
||||
}
|
||||
|
@ -3601,6 +3663,10 @@ static int poolConnections = 0;
|
|||
}
|
||||
NS_ENDHANDLER
|
||||
[dbLock unlock];
|
||||
if (nil != pool)
|
||||
{
|
||||
[pool swallowClient: db];
|
||||
}
|
||||
}
|
||||
return executed;
|
||||
}
|
||||
|
|
|
@ -61,6 +61,10 @@
|
|||
- (void) _unlock;
|
||||
@end
|
||||
|
||||
@interface SQLTransaction (Creation)
|
||||
+ (SQLTransaction*) _transactionUsing: (id)clientOrPool;
|
||||
@end
|
||||
|
||||
@implementation SQLClientPool
|
||||
|
||||
- (int) availableConnections
|
||||
|
@ -724,6 +728,36 @@
|
|||
{
|
||||
return [self _swallowClient: client withRetain: YES];
|
||||
}
|
||||
|
||||
- (void) setClientName: (NSString*)s
|
||||
{
|
||||
unsigned int index;
|
||||
|
||||
[lock lock];
|
||||
for (index = 0; index < max; index++)
|
||||
{
|
||||
SQLClient *client = c[index];
|
||||
|
||||
if (nil == s)
|
||||
{
|
||||
[client setClientName: s];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSString *n;
|
||||
|
||||
n = [s stringByAppendingFormat: @" (%u)", index];
|
||||
[client setClientName: n];
|
||||
}
|
||||
}
|
||||
[lock unlock];
|
||||
}
|
||||
|
||||
- (SQLTransaction*) transaction
|
||||
{
|
||||
return [SQLTransaction _transactionUsing: self];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation SQLClientPool (Private)
|
||||
|
|
Loading…
Reference in a new issue