6-pg85-fix-auto-prepare-multiconn-3.patch
application/octet-stream
Filename: 6-pg85-fix-auto-prepare-multiconn-3.patch
Type: application/octet-stream
Part: 0
Message:
Re: Fix auto-prepare #2
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
| File | + | − |
|---|---|---|
| src/interfaces/ecpg/ecpglib/execute.c | 3 | 0 |
| src/interfaces/ecpg/ecpglib/prepare.c | 24 | 6 |
diff -cprN head/src/interfaces/ecpg/ecpglib/execute.c work/src/interfaces/ecpg/ecpglib/execute.c
*** head/src/interfaces/ecpg/ecpglib/execute.c Wed Jan 6 09:46:25 2010
--- work/src/interfaces/ecpg/ecpglib/execute.c Tue Jan 19 13:39:40 2010
*************** ECPGdo(const int lineno, const int compa
*** 1753,1759 ****
--- 1753,1762 ----
stmt->command = ecpg_strdup(command, lineno);
}
else
+ {
ecpg_raise(lineno, ECPG_INVALID_STMT, ECPG_SQLSTATE_INVALID_SQL_STATEMENT_NAME, stmt->command);
+ return (false);
+ }
}
stmt->connection = con;
diff -cprN head/src/interfaces/ecpg/ecpglib/prepare.c work/src/interfaces/ecpg/ecpglib/prepare.c
*** head/src/interfaces/ecpg/ecpglib/prepare.c Mon Jan 18 09:26:23 2010
--- work/src/interfaces/ecpg/ecpglib/prepare.c Tue Jan 19 14:04:55 2010
*************** ecpg_freeStmtCacheEntry(int lineno, int
*** 406,412 ****
*/
static int
AddStmtToCache(int lineno, /* line # of statement */
! char *stmtID, /* statement ID */
const char *connection, /* connection */
int compat, /* compatibility level */
const char *ecpgQuery) /* query */
--- 406,412 ----
*/
static int
AddStmtToCache(int lineno, /* line # of statement */
! const char *stmtID, /* statement ID */
const char *connection, /* connection */
int compat, /* compatibility level */
const char *ecpgQuery) /* query */
*************** ecpg_auto_prepare(int lineno, const char
*** 465,485 ****
/* if not found - add the statement to the cache */
if (entNo)
{
ecpg_log("ecpg_auto_prepare on line %d: statement found in cache; entry %d\n", lineno, entNo);
! *name = ecpg_strdup(stmtCacheEntries[entNo].stmtID, lineno);
}
else
{
ecpg_log("ecpg_auto_prepare on line %d: statement not in cache; inserting\n", lineno);
/* generate a statement ID */
! *name = (char *) ecpg_alloc(STMTID_SIZE, lineno);
! sprintf(*name, "ecpg%d", nextStmtID++);
! if (!ECPGprepare(lineno, connection_name, 0, ecpg_strdup(*name, lineno), query))
return (false);
! if (AddStmtToCache(lineno, *name, connection_name, compat, query) < 0)
return (false);
}
/* increase usage counter */
--- 465,503 ----
/* if not found - add the statement to the cache */
if (entNo)
{
+ struct connection *con;
+
ecpg_log("ecpg_auto_prepare on line %d: statement found in cache; entry %d\n", lineno, entNo);
! *name = stmtCacheEntries[entNo].stmtID;
!
! if ((con = ecpg_get_connection(connection_name)) == NULL ||
! ecpg_find_prepared_statement(*name, con, NULL) == NULL)
! {
! /* The query is in cache, but not prepared on this connection. */
! if (!ECPGprepare(lineno, connection_name, 0, *name, query))
! return (false);
! }
!
! *name = ecpg_strdup(*name, lineno);
}
else
{
+ char stmtID[STMTID_SIZE];
+
ecpg_log("ecpg_auto_prepare on line %d: statement not in cache; inserting\n", lineno);
/* generate a statement ID */
! sprintf(stmtID, "ecpg%d", nextStmtID++);
! if (!ECPGprepare(lineno, connection_name, 0, stmtID, query))
return (false);
! if (AddStmtToCache(lineno, stmtID, connection_name, compat, query) < 0)
! {
! (void) ECPGdeallocate(lineno, compat, connection_name, stmtID);
return (false);
+ }
+
+ *name = ecpg_strdup(stmtID, lineno);
}
/* increase usage counter */