From: [EMAIL PROTECTED]
Operating system: All
PHP version: 4.0 Latest CVS (2001-06-13)
PHP Bug Type: Sybase-ct (ctlib) related
Bug description: stored procedure processing
We have some Sybase stored procedures that don't work with php - they return 1 instead
of a result set. Stepping through the code, I found that the proc was returning an
empty status result before the real results, which confuses the php code that loops
through the Sybase results, as it expects to see a result set first.
I've made the following change to that code (diff -u format)that processes all of the
results, and doesn't treat a status result in the same way as a real result.
--- php_sybase_ct.c.orig Mon Jun 11 17:17:22 2001
+++ php_sybase_ct.c Mon Jun 11 17:17:31 2001
@@ -1079,36 +1079,32 @@
* properly read or cancel them or the connection will become
* unusable.
*/
- if (ct_results(sybase_ptr->cmd, &restype)!=CS_SUCCEED) {
- ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
- sybase_ptr->dead = 1;
- RETURN_FALSE;
- }
+ while ((retcode = ct_results(sybase_ptr->cmd, &restype))==CS_SUCCEED) {
- switch ((int) restype) {
+ switch ((int) restype) {
case CS_CMD_FAIL:
default:
status = Q_FAILURE;
break;
case CS_CMD_SUCCEED:
case CS_CMD_DONE: {
- CS_INT row_count;
- if (ct_res_info(sybase_ptr->cmd, CS_ROW_COUNT,
&row_count, CS_UNUSED, NULL)==CS_SUCCEED) {
- sybase_ptr->affected_rows =
(long)row_count;
- }
+ CS_INT row_count;
+ if (ct_res_info(sybase_ptr->cmd, CS_ROW_COUNT,
+&row_count, CS_UNUSED, NULL)==CS_SUCCEED) {
+ sybase_ptr->affected_rows = (long)row_count;
}
+ }
/* Fall through */
case CS_COMPUTEFMT_RESULT:
case CS_ROWFMT_RESULT:
case CS_DESCRIBE_RESULT:
case CS_MSG_RESULT:
- status = Q_SUCCESS;
+ if (status != Q_RESULT) /* if we don't already have a
+result */
+ status = Q_SUCCESS;
break;
case CS_COMPUTE_RESULT:
case CS_CURSOR_RESULT:
case CS_PARAM_RESULT:
case CS_ROW_RESULT:
- case CS_STATUS_RESULT:
result = php_sybase_fetch_result_set(sybase_ptr);
if (result == NULL) {
ct_cancel(NULL, sybase_ptr->cmd,
CS_CANCEL_ALL);
@@ -1117,41 +1113,11 @@
}
status = Q_RESULT;
break;
- }
-
- /* The only restype we should get now is CS_CMD_DONE, possibly
- * followed by a CS_STATUS_RESULT/CS_CMD_SUCCEED/CS_CMD_DONE
- * sequence if the command was a stored procedure call. But we
- * still need to read and discard unexpected results. We might
- * want to return a failure in this case because the application
- * won't be getting all the results it asked for.
- */
- while ((retcode = ct_results(sybase_ptr->cmd, &restype))==CS_SUCCEED) {
- switch ((int) restype) {
- case CS_CMD_SUCCEED:
- case CS_CMD_DONE:
- break;
-
- case CS_CMD_FAIL:
- status = Q_FAILURE;
- break;
-
- case CS_COMPUTE_RESULT:
- case CS_CURSOR_RESULT:
- case CS_PARAM_RESULT:
- case CS_ROW_RESULT:
- /* Unexpected results, cancel them. */
- case CS_STATUS_RESULT:
- ct_cancel(NULL, sybase_ptr->cmd,
CS_CANCEL_CURRENT);
- break;
-
- default:
- status = Q_FAILURE;
- break;
- }
- if (status == Q_FAILURE) {
- ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
- }
+ /* nothing to read for STATUS_RESULT */
+ case CS_STATUS_RESULT:
+ ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_CURRENT);
+ break;
+ }
}
switch (retcode) {
--
Edit Bug report at: http://bugs.php.net/?id=11475&edit=1
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]