sybase extension
| From: | Jan Fedak | Date: | Sun, 08 Aug 1999 20:09:43 +0000 |
| Subject: | sybase extension | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-9659@lists.php.net to get a copy of this message | ||
Hi!
I've created some new code for sybase support which should enable you to
obtain errors and messages from the database.
New functions added:
sybase_error(), sybase_errno(), sybase_messages()
I've been working with php for a year or so but I'm new to php
development, so I'm sending the patch here.
Supposed improvements: free the memory on sybase_close()
(but I hope efree should do its job later...)
Jan
--
Jan Fedak +420 603 304 648
mailto:J.Fedak@sh.cvut.cz
talk:jack@tornado.sh.cvut.cz
mailto:jack@mobil.cz
Linux - the ultimate NT Service Pack.
diff -u -r php-3.0.12/functions/php3_sybase.h php-standalone/php-3.0.12/functions/php3_sybase.h --- php-3.0.12/functions/php3_sybase.h Fri Jan 1 18:59:16 1999 +++ php-standalone/php-3.0.12/functions/php3_sybase.h Sun Aug 8 03:22:29 1999 @@ -77,7 +77,9 @@ extern void php3_sybase_field_len(INTERNAL_FUNCTION_PARAMETERS); extern void php3_sybase_field_type(INTERNAL_FUNCTION_PARAMETERS); extern void php3_sybase_field_flags(INTERNAL_FUNCTION_PARAMETERS); - +extern void php3_sybase_error(INTERNAL_FUNCTION_PARAMETERS); +extern void php3_sybase_messages(INTERNAL_FUNCTION_PARAMETERS); +extern void php3_sybase_errno(INTERNAL_FUNCTION_PARAMETERS); #include <sybfront.h> @@ -128,6 +130,12 @@ int cur_row,cur_field; int num_rows,num_fields; } sybase_result; + +typedef struct { + int errno; + char *error; + char *messages; +} sybase_error; extern sybase_module php3_sybase_module; diff -u -r php-3.0.12/functions/sybase.c php-standalone/php-3.0.12/functions/sybase.c --- php-3.0.12/functions/sybase.c Mon Jan 4 15:25:22 1999 +++ php-standalone/php-3.0.12/functions/sybase.c Sun Aug 8 03:22:56 1999 @@ -90,6 +90,10 @@ {"mssql_result", php3_sybase_result, NULL}, {"mssql_min_error_severity", php3_sybase_min_error_severity, NULL}, {"mssql_min_message_severity", php3_sybase_min_message_severity, NULL}, + // Jan Fedak's extensions + {"sybase_error", php3_sybase_error, NULL}, + {"sybase_messages", php3_sybase_messages, NULL}, + {"sybase_errno", php3_sybase_errno, NULL}, {NULL, NULL, NULL} }; @@ -114,9 +118,30 @@ static int php3_sybase_error_handler(DBPROCESS *dbproc,int severity,int dberr, int oserr,char *dberrstr,char *oserrstr) { + /* we save the error message */ + sybase_error *err; + if (severity >= php3_sybase_module.min_error_severity) { php3_error(E_WARNING,"Sybase error: %s (severity %d)",dberrstr,severity); } + /* we dump previous errors */ + err = (sybase_error *)dbgetuserdata(dbproc); + if (err) + { + if (err->error) + efree(err->error); + } + else + { + err = (sybase_error *)emalloc(sizeof(sybase_error)); + err->messages = NULL; + } + /* store data */ + err->errno = (dberr != -1 ? dberr : oserr); + err->error = (char *)emalloc(strlen(dberr != -1 ? dberrstr : oserrstr)+1); + strcpy(err->error, (dberr != -1 ? dberrstr : oserrstr)); + dbsetuserdata(dbproc, (BYTE *) err); + return INT_CANCEL; } @@ -125,11 +150,38 @@ int severity,char *msgtext,char *srvname, char *procname,DBUSMALLINT line) { + sybase_error *err; + if (severity >= php3_sybase_module.min_message_severity) { php3_error(E_WARNING,"Sybase message: %s (severity %d)",msgtext,severity); } STR_FREE(php3_sybase_module.server_message); php3_sybase_module.server_message = estrdup(msgtext); + + err = (sybase_error *)dbgetuserdata(dbproc); + if (!err) + { + err = (sybase_error *)emalloc(sizeof(sybase_error)); + err->errno = 0; + err->error = NULL; + err->messages = (char *)emalloc(strlen(msgtext)+1); + *(err->messages) = '\0'; + } + else if (err->messages) + { + char *olderrmessg = err->messages; + err->messages = (char *)emalloc(strlen(olderrmessg) + strlen(msgtext) + 1); + strcpy(err->messages, olderrmessg); + efree(olderrmessg); + } + else + { + err->messages = (char *)emalloc(strlen(msgtext)+1); + *(err->messages) = '\0'; + } + strcat (err->messages, msgtext); + dbsetuserdata(dbproc, (BYTE *) err); + return 0; } @@ -476,6 +528,7 @@ dbclose(sybase.link); RETURN_FALSE; } + dbsetuserdata(sybase.link, 0); /* add it to the list */ sybase_ptr = (sybase_link *) emalloc(sizeof(sybase_link)); @@ -1293,6 +1346,126 @@ } /* }}} */ +/* {{{ proto string sybase_error([int link_identifier]) + Returns the text of the error message from previous Sybase operation */ +void php3_sybase_error(INTERNAL_FUNCTION_PARAMETERS) +{ + pval *sybase_link_index; + int id,type; + sybase_link *sybase_ptr; + sybase_error *sybase_err; + + switch(ARG_COUNT(ht)) { + case 0: + id = php3_sybase_module.default_link; + break; + case 1: + if (getParameters(ht, 1, &sybase_link_index)==FAILURE) { + RETURN_FALSE; + } + convert_to_long(sybase_link_index); + id = sybase_link_index->value.lval; + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (id==-1) { + RETURN_FALSE; + } + sybase_ptr = (sybase_link *) php3_list_find(id,&type); + if (type!=php3_sybase_module.le_link && type!=php3_sybase_module.le_plink) { + php3_error(E_WARNING,"%d is not a Sybase link index",id); + RETURN_FALSE; + } + + sybase_err = (sybase_error *)dbgetuserdata(sybase_ptr->link); + + RETURN_STRING(sybase_err && sybase_err->error ? sybase_err->error : "", 1); +} +/* }}} */ + +/* {{{ proto string sybase_messages([int link_identifier]) + Returns the text of the various messages from previous Sybase operations */ +void php3_sybase_messages(INTERNAL_FUNCTION_PARAMETERS) +{ + pval *sybase_link_index; + int id,type; + sybase_link *sybase_ptr; + sybase_error *sybase_err; + + switch(ARG_COUNT(ht)) { + case 0: + id = php3_sybase_module.default_link; + break; + case 1: + if (getParameters(ht, 1, &sybase_link_index)==FAILURE) { + RETURN_FALSE; + } + convert_to_long(sybase_link_index); + id = sybase_link_index->value.lval; + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (id==-1) { + RETURN_FALSE; + } + sybase_ptr = (sybase_link *) php3_list_find(id,&type); + if (type!=php3_sybase_module.le_link && type!=php3_sybase_module.le_plink) { + php3_error(E_WARNING,"%d is not a Sybase link index",id); + RETURN_FALSE; + } + + sybase_err = (sybase_error *)dbgetuserdata(sybase_ptr->link); + + RETURN_STRING(sybase_err && sybase_err->messages ? sybase_err->messages : "", 1); +} +/* }}} */ + +/* {{{ proto int sybase_errno([int link_identifier]) + Returns the number of the error message from previous Sybase operation */ +void php3_sybase_errno(INTERNAL_FUNCTION_PARAMETERS) +{ + pval *sybase_link_index; + int id,type; + sybase_link *sybase_ptr; + sybase_error *sybase_err; + + + switch(ARG_COUNT(ht)) { + case 0: + id = php3_sybase_module.default_link; + break; + case 1: + if (getParameters(ht, 1, &sybase_link_index)==FAILURE) { + RETURN_FALSE; + } + convert_to_long(sybase_link_index); + id = sybase_link_index->value.lval; + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (id==-1) { + RETURN_FALSE; + } + sybase_ptr = (sybase_link *) php3_list_find(id,&type); + if (type!=php3_sybase_module.le_link && type!=php3_sybase_module.le_plink) { + php3_error(E_WARNING,"%d is not a Sybase link index",id); + RETURN_FALSE; + } + + sybase_err = (sybase_error *)dbgetuserdata(sybase_ptr->link); + + RETURN_LONG(sybase_err ? sybase_err->errno : 0); +} +/* }}} */ #endif /*
diff -u -r php-3.0.12/functions/php3_sybase.h php-standalone/php-3.0.12/functions/php3_sybase.h --- php-3.0.12/functions/php3_sybase.h Fri Jan 1 18:59:16 1999 +++ php-standalone/php-3.0.12/functions/php3_sybase.h Sun Aug 8 03:22:29 1999 @@ -77,7 +77,9 @@ extern void php3_sybase_field_len(INTERNAL_FUNCTION_PARAMETERS); extern void php3_sybase_field_type(INTERNAL_FUNCTION_PARAMETERS); extern void php3_sybase_field_flags(INTERNAL_FUNCTION_PARAMETERS); - +extern void php3_sybase_error(INTERNAL_FUNCTION_PARAMETERS); +extern void php3_sybase_messages(INTERNAL_FUNCTION_PARAMETERS); +extern void php3_sybase_errno(INTERNAL_FUNCTION_PARAMETERS); #include <sybfront.h> @@ -128,6 +130,12 @@ int cur_row,cur_field; int num_rows,num_fields; } sybase_result; + +typedef struct { + int errno; + char *error; + char *messages; +} sybase_error; extern sybase_module php3_sybase_module; diff -u -r php-3.0.12/functions/sybase.c php-standalone/php-3.0.12/functions/sybase.c --- php-3.0.12/functions/sybase.c Mon Jan 4 15:25:22 1999 +++ php-standalone/php-3.0.12/functions/sybase.c Sun Aug 8 03:22:56 1999 @@ -90,6 +90,10 @@ {"mssql_result", php3_sybase_result, NULL}, {"mssql_min_error_severity", php3_sybase_min_error_severity, NULL}, {"mssql_min_message_severity", php3_sybase_min_message_severity, NULL}, + // Jan Fedak's extensions + {"sybase_error", php3_sybase_error, NULL}, + {"sybase_messages", php3_sybase_messages, NULL}, + {"sybase_errno", php3_sybase_errno, NULL}, {NULL, NULL, NULL} }; @@ -114,9 +118,30 @@ static int php3_sybase_error_handler(DBPROCESS *dbproc,int severity,int dberr, int oserr,char *dberrstr,char *oserrstr) { + /* we save the error message */ + sybase_error *err; + if (severity >= php3_sybase_module.min_error_severity) { php3_error(E_WARNING,"Sybase error: %s (severity %d)",dberrstr,severity); } + /* we dump previous errors */ + err = (sybase_error *)dbgetuserdata(dbproc); + if (err) + { + if (err->error) + efree(err->error); + } + else + { + err = (sybase_error *)emalloc(sizeof(sybase_error)); + err->messages = NULL; + } + /* store data */ + err->errno = (dberr != -1 ? dberr : oserr); + err->error = (char *)emalloc(strlen(dberr != -1 ? dberrstr : oserrstr)+1); + strcpy(err->error, (dberr != -1 ? dberrstr : oserrstr)); + dbsetuserdata(dbproc, (BYTE *) err); + return INT_CANCEL; } @@ -125,11 +150,38 @@ int severity,char *msgtext,char *srvname, char *procname,DBUSMALLINT line) { + sybase_error *err; + if (severity >= php3_sybase_module.min_message_severity) { php3_error(E_WARNING,"Sybase message: %s (severity %d)",msgtext,severity); } STR_FREE(php3_sybase_module.server_message); php3_sybase_module.server_message = estrdup(msgtext); + + err = (sybase_error *)dbgetuserdata(dbproc); + if (!err) + { + err = (sybase_error *)emalloc(sizeof(sybase_error)); + err->errno = 0; + err->error = NULL; + err->messages = (char *)emalloc(strlen(msgtext)+1); + *(err->messages) = '\0'; + } + else if (err->messages) + { + char *olderrmessg = err->messages; + err->messages = (char *)emalloc(strlen(olderrmessg) + strlen(msgtext) + 1); + strcpy(err->messages, olderrmessg); + efree(olderrmessg); + } + else + { + err->messages = (char *)emalloc(strlen(msgtext)+1); + *(err->messages) = '\0'; + } + strcat (err->messages, msgtext); + dbsetuserdata(dbproc, (BYTE *) err); + return 0; } @@ -476,6 +528,7 @@ dbclose(sybase.link); RETURN_FALSE; } + dbsetuserdata(sybase.link, 0); /* add it to the list */ sybase_ptr = (sybase_link *) emalloc(sizeof(sybase_link)); @@ -1293,6 +1346,126 @@ } /* }}} */ +/* {{{ proto string sybase_error([int link_identifier]) + Returns the text of the error message from previous Sybase operation */ +void php3_sybase_error(INTERNAL_FUNCTION_PARAMETERS) +{ + pval *sybase_link_index; + int id,type; + sybase_link *sybase_ptr; + sybase_error *sybase_err; + + switch(ARG_COUNT(ht)) { + case 0: + id = php3_sybase_module.default_link; + break; + case 1: + if (getParameters(ht, 1, &sybase_link_index)==FAILURE) { + RETURN_FALSE; + } + convert_to_long(sybase_link_index); + id = sybase_link_index->value.lval; + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (id==-1) { + RETURN_FALSE; + } + sybase_ptr = (sybase_link *) php3_list_find(id,&type); + if (type!=php3_sybase_module.le_link && type!=php3_sybase_module.le_plink) { + php3_error(E_WARNING,"%d is not a Sybase link index",id); + RETURN_FALSE; + } + + sybase_err = (sybase_error *)dbgetuserdata(sybase_ptr->link); + + RETURN_STRING(sybase_err && sybase_err->error ? sybase_err->error : "", 1); +} +/* }}} */ + +/* {{{ proto string sybase_messages([int link_identifier]) + Returns the text of the various messages from previous Sybase operations */ +void php3_sybase_messages(INTERNAL_FUNCTION_PARAMETERS) +{ + pval *sybase_link_index; + int id,type; + sybase_link *sybase_ptr; + sybase_error *sybase_err; + + switch(ARG_COUNT(ht)) { + case 0: + id = php3_sybase_module.default_link; + break; + case 1: + if (getParameters(ht, 1, &sybase_link_index)==FAILURE) { + RETURN_FALSE; + } + convert_to_long(sybase_link_index); + id = sybase_link_index->value.lval; + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (id==-1) { + RETURN_FALSE; + } + sybase_ptr = (sybase_link *) php3_list_find(id,&type); + if (type!=php3_sybase_module.le_link && type!=php3_sybase_module.le_plink) { + php3_error(E_WARNING,"%d is not a Sybase link index",id); + RETURN_FALSE; + } + + sybase_err = (sybase_error *)dbgetuserdata(sybase_ptr->link); + + RETURN_STRING(sybase_err && sybase_err->messages ? sybase_err->messages : "", 1); +} +/* }}} */ + +/* {{{ proto int sybase_errno([int link_identifier]) + Returns the number of the error message from previous Sybase operation */ +void php3_sybase_errno(INTERNAL_FUNCTION_PARAMETERS) +{ + pval *sybase_link_index; + int id,type; + sybase_link *sybase_ptr; + sybase_error *sybase_err; + + + switch(ARG_COUNT(ht)) { + case 0: + id = php3_sybase_module.default_link; + break; + case 1: + if (getParameters(ht, 1, &sybase_link_index)==FAILURE) { + RETURN_FALSE; + } + convert_to_long(sybase_link_index); + id = sybase_link_index->value.lval; + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (id==-1) { + RETURN_FALSE; + } + sybase_ptr = (sybase_link *) php3_list_find(id,&type); + if (type!=php3_sybase_module.le_link && type!=php3_sybase_module.le_plink) { + php3_error(E_WARNING,"%d is not a Sybase link index",id); + RETURN_FALSE; + } + + sybase_err = (sybase_error *)dbgetuserdata(sybase_ptr->link); + + RETURN_LONG(sybase_err ? sybase_err->errno : 0); +} +/* }}} */ #endif /*