mirror of
https://github.com/gnustep/libs-sqlclient.git
synced 2025-02-21 19:01:03 +00:00
optimise string buffer size and merge deletes
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/sqlclient/trunk@38042 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
ff5a0b347f
commit
abd0e840eb
2 changed files with 21 additions and 15 deletions
11
SQLClient.h
11
SQLClient.h
|
@ -1658,10 +1658,10 @@ SQLCLIENT_PRIVATE
|
||||||
* merged into something of the form:
|
* merged into something of the form:
|
||||||
* INSERT INTO table (fieldnames) VALUES (values1),(values2),...;
|
* INSERT INTO table (fieldnames) VALUES (values1),(values2),...;
|
||||||
* </p>
|
* </p>
|
||||||
* <p>Or may use this with an update statement of the form:<br />
|
* <p>Or may use this with an update or delete statement of the form:<br />
|
||||||
* UPDATE table SET settings WHERE condition;<br />
|
* command table SET settings WHERE condition;<br />
|
||||||
* So that statements may be merged into:<br />
|
* So that statements may be merged into:<br />
|
||||||
* UPDATE table SET setting WHERE (condition1) OR (condition2) OR ...;
|
* command table SET settings WHERE (condition1) OR (condition2) OR ...;
|
||||||
* </p>
|
* </p>
|
||||||
* If no opportunity for merging is found, the new statement is simply
|
* If no opportunity for merging is found, the new statement is simply
|
||||||
* added to the transaction.<br />
|
* added to the transaction.<br />
|
||||||
|
@ -1671,7 +1671,10 @@ SQLCLIENT_PRIVATE
|
||||||
* for eligibility.<br />
|
* for eligibility.<br />
|
||||||
* 3. Merging is done only if the statement up to the string 'VALUES'
|
* 3. Merging is done only if the statement up to the string 'VALUES'
|
||||||
* (for insert) or 'WHERE' (for update) matches.<br />
|
* (for insert) or 'WHERE' (for update) matches.<br />
|
||||||
* 4. This is a simple text match rather than sql syntactic analysis,
|
* 4. Merging into any of the last 5 statements may of course change the
|
||||||
|
* order of statements in the transaction, so care must be taken not to
|
||||||
|
* use this feature where that migfht matter.<br />
|
||||||
|
* 5. This is a simple text match rather than sql syntactic analysis,
|
||||||
* so it's possible to confuse the process with complex statements.
|
* so it's possible to confuse the process with complex statements.
|
||||||
*/
|
*/
|
||||||
- (void) merge: (NSString*)stmt,...;
|
- (void) merge: (NSString*)stmt,...;
|
||||||
|
|
25
SQLClient.m
25
SQLClient.m
|
@ -3203,13 +3203,7 @@ static unsigned int maxConnections = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to merge the prepared statement p with an earlier statement in the
|
/* Try to merge the prepared statement p with an earlier statement in the
|
||||||
* transaction. We search up to 5 earlier statements and we merge if;
|
* transaction. We search up to 5 earlier statements and we merge if we can.
|
||||||
* a. We have something like 'INSERT INTO table (fields) VALUES (values)'
|
|
||||||
* where everything up to 'VALUES' is the same, so we can built a multiline
|
|
||||||
* insert like 'INSERT INTO table (fields) VALUES (values1),(values2),...'
|
|
||||||
* b. We have something like 'UPDATE table SET settings WHERE condition'
|
|
||||||
* where everything up to the condition is the same, so we can build
|
|
||||||
* 'UPDATE table SET settings WHERE condition1 OR (condition2) OR ...'
|
|
||||||
*/
|
*/
|
||||||
- (void) _merge: (NSMutableArray*)p
|
- (void) _merge: (NSMutableArray*)p
|
||||||
{
|
{
|
||||||
|
@ -3264,7 +3258,9 @@ static unsigned int maxConnections = 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m = [[os mutableCopy] autorelease];
|
m = [NSMutableString
|
||||||
|
stringWithCapacity: [os length] * 100];
|
||||||
|
[m appendString: os];
|
||||||
}
|
}
|
||||||
[m appendString: @","];
|
[m appendString: @","];
|
||||||
[m appendString: s];
|
[m appendString: s];
|
||||||
|
@ -3281,6 +3277,10 @@ static unsigned int maxConnections = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = [s rangeOfString: @"UPDATE" options: NSCaseInsensitiveSearch];
|
r = [s rangeOfString: @"UPDATE" options: NSCaseInsensitiveSearch];
|
||||||
|
if (0 == r.length)
|
||||||
|
{
|
||||||
|
r = [s rangeOfString: @"DELETE" options: NSCaseInsensitiveSearch];
|
||||||
|
}
|
||||||
if (r.length > 0 && 0 == r.location)
|
if (r.length > 0 && 0 == r.location)
|
||||||
{
|
{
|
||||||
r = [s rangeOfString: @"WHERE" options: NSCaseInsensitiveSearch];
|
r = [s rangeOfString: @"WHERE" options: NSCaseInsensitiveSearch];
|
||||||
|
@ -3329,7 +3329,9 @@ static unsigned int maxConnections = 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m = [[os mutableCopy] autorelease];
|
m = [NSMutableString
|
||||||
|
stringWithCapacity: l * 100];
|
||||||
|
[m appendString: os];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3339,8 +3341,9 @@ static unsigned int maxConnections = 8;
|
||||||
* new statement in which it is bracketed.
|
* new statement in which it is bracketed.
|
||||||
*/
|
*/
|
||||||
os = [os substringFromIndex: pos];
|
os = [os substringFromIndex: pos];
|
||||||
m = [NSMutableString stringWithFormat:
|
m = [NSMutableString
|
||||||
@"%@(%@)", t, os];
|
stringWithCapacity: l * 100];
|
||||||
|
[m appendFormat: @"%@(%@)", t, os];
|
||||||
}
|
}
|
||||||
[m appendString: @" OR "];
|
[m appendString: @" OR "];
|
||||||
[m appendString: s];
|
[m appendString: s];
|
||||||
|
|
Loading…
Reference in a new issue