Annotation of embedaddon/php/ext/odbc/birdstep.c, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1997-2013 The PHP Group |
1.1 misho 6: +----------------------------------------------------------------------+
7: | This source file is subject to version 3.01 of the PHP license, |
8: | that is bundled with this package in the file LICENSE, and is |
9: | available through the world-wide-web at the following url: |
10: | http://www.php.net/license/3_01.txt |
11: | If you did not receive a copy of the PHP license and are unable to |
12: | obtain it through the world-wide-web, please send a note to |
13: | license@php.net so we can mail you a copy immediately. |
14: +----------------------------------------------------------------------+
15: | Authors: Nikolay P. Romanyuk <mag@redcom.ru> |
16: +----------------------------------------------------------------------+
17: */
18:
1.1.1.2 misho 19: /* $Id$ */
1.1 misho 20:
21: /*
22: * TODO:
23: * birdstep_fetch_into(),
24: * Check all on real life apps.
25: */
26:
27: #ifdef HAVE_CONFIG_H
28: #include "config.h"
29: #endif
30:
31: #include "php.h"
32:
33: #if WIN32
34: # include "config.w32.h"
35: # include "win95nt.h"
36: # ifdef PHP_EXPORTS
37: # define PHPAPI __declspec(dllexport)
38: # else
39: # define PHPAPI __declspec(dllimport)
40: # endif
41: #else
42: # include <php_config.h>
43: # define PHPAPI
44: # define THREAD_LS
45: #endif
46:
47: #ifdef HAVE_BIRDSTEP
48: #include "php_birdstep.h"
49: #include "ext/standard/info.h"
50: #include "php_ini.h"
51:
52: /* {{{ arginfo */
53: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_connect, 0, 0, 3)
54: ZEND_ARG_INFO(0, server)
55: ZEND_ARG_INFO(0, user)
56: ZEND_ARG_INFO(0, pass)
57: ZEND_END_ARG_INFO()
58:
59: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_close, 0, 0, 1)
60: ZEND_ARG_INFO(0, id)
61: ZEND_END_ARG_INFO()
62:
63: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_exec, 0, 0, 2)
64: ZEND_ARG_INFO(0, index)
65: ZEND_ARG_INFO(0, exec_str)
66: ZEND_END_ARG_INFO()
67:
68: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_fetch, 0, 0, 1)
69: ZEND_ARG_INFO(0, index)
70: ZEND_END_ARG_INFO()
71:
72: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_result, 0, 0, 2)
73: ZEND_ARG_INFO(0, index)
74: ZEND_ARG_INFO(0, col)
75: ZEND_END_ARG_INFO()
76:
77: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_freeresult, 0, 0, 1)
78: ZEND_ARG_INFO(0, index)
79: ZEND_END_ARG_INFO()
80:
81: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_autocommit, 0, 0, 1)
82: ZEND_ARG_INFO(0, index)
83: ZEND_END_ARG_INFO()
84:
85: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_off_autocommit, 0, 0, 1)
86: ZEND_ARG_INFO(0, index)
87: ZEND_END_ARG_INFO()
88:
89: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_commit, 0, 0, 1)
90: ZEND_ARG_INFO(0, index)
91: ZEND_END_ARG_INFO()
92:
93: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_rollback, 0, 0, 1)
94: ZEND_ARG_INFO(0, index)
95: ZEND_END_ARG_INFO()
96:
97: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_fieldname, 0, 0, 2)
98: ZEND_ARG_INFO(0, index)
99: ZEND_ARG_INFO(0, col)
100: ZEND_END_ARG_INFO()
101:
102: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_fieldnum, 0, 0, 1)
103: ZEND_ARG_INFO(0, index)
104: ZEND_END_ARG_INFO()
105: /* }}} */
106:
107: const zend_function_entry birdstep_functions[] = {
108: PHP_FE(birdstep_connect, arginfo_birdstep_connect)
109: PHP_FE(birdstep_close, arginfo_birdstep_close)
110: PHP_FE(birdstep_exec, arginfo_birdstep_exec)
111: PHP_FE(birdstep_fetch, arginfo_birdstep_fetch)
112: PHP_FE(birdstep_result, arginfo_birdstep_result)
113: PHP_FE(birdstep_freeresult, arginfo_birdstep_freeresult)
114: PHP_FE(birdstep_autocommit, arginfo_birdstep_autocommit)
115: PHP_FE(birdstep_off_autocommit, arginfo_birdstep_off_autocommit)
116: PHP_FE(birdstep_commit, arginfo_birdstep_commit)
117: PHP_FE(birdstep_rollback, arginfo_birdstep_rollback)
118: PHP_FE(birdstep_fieldnum, arginfo_birdstep_fieldnum)
119: PHP_FE(birdstep_fieldname, arginfo_birdstep_fieldname)
120: /*
121: * Temporary Function aliases until the next major upgrade to PHP.
122: * These should allow users to continue to use their current scripts,
123: * but should in reality warn the user that this functionality is
124: * deprecated.
125: */
126: PHP_FALIAS(velocis_connect, birdstep_connect, arginfo_birdstep_connect)
127: PHP_FALIAS(velocis_close, birdstep_close, arginfo_birdstep_close)
128: PHP_FALIAS(velocis_exec, birdstep_exec, arginfo_birdstep_exec)
129: PHP_FALIAS(velocis_fetch, birdstep_fetch, arginfo_birdstep_fetch)
130: PHP_FALIAS(velocis_result, birdstep_result, arginfo_birdstep_result)
131: PHP_FALIAS(velocis_freeresult, birdstep_freeresult, arginfo_birdstep_freeresult)
132: PHP_FALIAS(velocis_autocommit, birdstep_autocommit, arginfo_birdstep_autocommit)
133: PHP_FALIAS(velocis_off_autocommit, birdstep_off_autocommit, arginfo_birdstep_off_autocommit)
134: PHP_FALIAS(velocis_commit, birdstep_commit, arginfo_birdstep_commit)
135: PHP_FALIAS(velocis_rollback, birdstep_rollback, arginfo_birdstep_rollback)
136: PHP_FALIAS(velocis_fieldnum, birdstep_fieldnum, arginfo_birdstep_fieldnum)
137: PHP_FALIAS(velocis_fieldname, birdstep_fieldname, arginfo_birdstep_fieldname)
138: /* End temporary aliases */
139: {NULL, NULL, NULL}
140: };
141:
142: zend_module_entry birdstep_module_entry = {
143: STANDARD_MODULE_HEADER,
144: "birdstep",
145: birdstep_functions,
146: PHP_MINIT(birdstep),
147: PHP_MSHUTDOWN(birdstep),
148: PHP_RINIT(birdstep),
149: NULL,
150: PHP_MINFO(birdstep),
151: NO_VERSION_YET,
152: STANDARD_MODULE_PROPERTIES
153: };
154:
155: #ifdef COMPILE_DL_ODBC
156: ZEND_GET_MODULE(birdstep)
157: #endif
158:
159: THREAD_LS birdstep_module php_birdstep_module;
160: THREAD_LS static HENV henv;
161:
162: #define PHP_GET_BIRDSTEP_RES_IDX(id) if (!(res = birdstep_find_result(list, id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not result index (%ld)", id); RETURN_FALSE; }
163: #define PHP_BIRDSTEP_CHK_LNK(id) if (!(conn = birdstep_find_conn(list, id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not connection index (%ld)", id); RETURN_FALSE; }
164:
165:
166: static void _close_birdstep_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
167: {
168: VConn *conn = (VConn *)rsrc->ptr;
169:
170: if ( conn ) {
171: efree(conn);
172: }
173: }
174:
175: static void _free_birdstep_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
176: {
177: Vresult *res = (Vresult *)rsrc->ptr;
178:
179: if ( res && res->values ) {
180: register int i;
181: for ( i=0; i < res->numcols; i++ ) {
182: if ( res->values[i].value )
183: efree(res->values[i].value);
184: }
185: efree(res->values);
186: }
187: if ( res ) {
188: efree(res);
189: }
190: }
191:
192: PHP_MINIT_FUNCTION(birdstep)
193: {
194: SQLAllocEnv(&henv);
195:
196: if ( cfg_get_long("birdstep.max_links",&php_birdstep_module.max_links) == FAILURE ) {
197: php_birdstep_module.max_links = -1;
198: }
199: php_birdstep_module.num_links = 0;
200: php_birdstep_module.le_link = zend_register_list_destructors_ex(_close_birdstep_link, NULL, "birdstep link", module_number);
201: php_birdstep_module.le_result = zend_register_list_destructors_ex(_free_birdstep_result, NULL, "birdstep result", module_number);
202:
203: return SUCCESS;
204: }
205:
206: PHP_RINIT_FUNCTION(birdstep)
207: {
208: return SUCCESS;
209: }
210:
211:
212: PHP_MINFO_FUNCTION(birdstep)
213: {
214: php_info_print_table_start();
215: php_info_print_table_row(2, "RAIMA Birdstep Support", "enabled" );
216: php_info_print_table_end();
217: }
218:
219: PHP_MSHUTDOWN_FUNCTION(birdstep)
220: {
221: SQLFreeEnv(henv);
222: return SUCCESS;
223: }
224:
225: /* Some internal functions. Connections and result manupulate */
226:
1.1.1.2 misho 227: static int birdstep_add_conn(HashTable *list,VConn *conn,HDBC hdbc TSRMLS_DC)
1.1 misho 228: {
229: int ind;
230:
1.1.1.2 misho 231: ind = zend_list_insert(conn,php_birdstep_module.le_link TSRMLS_CC);
1.1 misho 232: conn->hdbc = hdbc;
233: conn->index = ind;
234:
235: return(ind);
236: }
237:
238: static VConn * birdstep_find_conn(HashTable *list,int ind)
239: {
240: VConn *conn;
241: int type;
242:
243: conn = zend_list_find(ind,&type);
244: if ( !conn || type != php_birdstep_module.le_link ) {
245: return(NULL);
246: }
247: return(conn);
248: }
249:
250: static void birdstep_del_conn(HashTable *list,int ind)
251: {
252: zend_list_delete(ind);
253: }
254:
255: static int birdstep_add_result(HashTable *list,Vresult *res,VConn *conn)
256: {
257: int ind;
258:
259: ind = zend_list_insert(res,php_birdstep_module.le_result);
260: res->conn = conn;
261: res->index = ind;
262:
263: return(ind);
264: }
265:
266: static Vresult * birdstep_find_result(HashTable *list,int ind)
267: {
268: Vresult *res;
269: int type;
270:
271: res = zend_list_find(ind,&type);
272: if ( !res || type != php_birdstep_module.le_result ) {
273: return(NULL);
274: }
275: return(res);
276: }
277:
278: static void birdstep_del_result(HashTable *list,int ind)
279: {
280: zend_list_delete(ind);
281: }
282:
283: /* Users functions */
284:
285: /* {{{ proto int birdstep_connect(string server, string user, string pass)
286: */
287: PHP_FUNCTION(birdstep_connect)
288: {
289: char *serv, *user, *pass;
290: int serv_len, user_len, pass_len;
291: RETCODE stat;
292: HDBC hdbc;
293: VConn *new;
294: long ind;
295:
296: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &serv, &serv_len, &user, &user_len, &pass, &pass_len) == FAILURE) {
297: return;
298: }
299:
300: if ( php_birdstep_module.max_links != -1 && php_birdstep_module.num_links == php_birdstep_module.max_links ) {
301: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Too many open connections (%d)",php_birdstep_module.num_links);
302: RETURN_FALSE;
303: }
304:
305: stat = SQLAllocConnect(henv,&hdbc);
306: if ( stat != SQL_SUCCESS ) {
307: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Could not allocate connection handle");
308: RETURN_FALSE;
309: }
310: stat = SQLConnect(hdbc, serv, SQL_NTS, user, SQL_NTS, pass, SQL_NTS);
311: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
312: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Could not connect to server \"%s\" for %s", serv, user);
313: SQLFreeConnect(hdbc);
314: RETURN_FALSE;
315: }
316: new = (VConn *)emalloc(sizeof(VConn));
1.1.1.2 misho 317: ind = birdstep_add_conn(list,new,hdbc TSRMLS_CC);
1.1 misho 318: php_birdstep_module.num_links++;
319: RETURN_LONG(ind);
320: }
321: /* }}} */
322:
323: /* {{{ proto bool birdstep_close(int id)
324: */
325: PHP_FUNCTION(birdstep_close)
326: {
327: long id;
328: VConn *conn;
329:
330: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
331: return;
332: }
333:
334: PHP_BIRDSTEP_CHK_LNK(id);
335:
336: SQLDisconnect(conn->hdbc);
337: SQLFreeConnect(conn->hdbc);
338: birdstep_del_conn(list, id);
339: php_birdstep_module.num_links--;
340: RETURN_TRUE;
341: }
342: /* }}} */
343:
344: /* {{{ proto int birdstep_exec(int index, string exec_str)
345: */
346: PHP_FUNCTION(birdstep_exec)
347: {
348: char *query;
349: long ind;
350: int query_len, indx;
351: VConn *conn;
352: Vresult *res;
353: RETCODE stat;
354: SWORD cols,i,colnamelen;
355: SDWORD rows,coldesc;
356:
357: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &ind, &query, &query_len) == FAILURE) {
358: return;
359: }
360:
361: PHP_BIRDSTEP_CHK_LNK(ind);
362:
363: res = (Vresult *)emalloc(sizeof(Vresult));
364: stat = SQLAllocStmt(conn->hdbc,&res->hstmt);
365: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
366: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLAllocStmt return %d",stat);
367: efree(res);
368: RETURN_FALSE;
369: }
370: stat = SQLExecDirect(res->hstmt,query,SQL_NTS);
371: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
372: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Cannot execute \"%s\" query",query);
373: SQLFreeStmt(res->hstmt,SQL_DROP);
374: efree(res);
375: RETURN_FALSE;
376: }
377: /* Success query */
378: stat = SQLNumResultCols(res->hstmt,&cols);
379: if ( stat != SQL_SUCCESS ) {
380: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLNumResultCols return %d",stat);
381: SQLFreeStmt(res->hstmt,SQL_DROP);
382: efree(res);
383: RETURN_FALSE;
384: }
385: if ( !cols ) { /* Was INSERT, UPDATE, DELETE, etc. query */
386: stat = SQLRowCount(res->hstmt,&rows);
387: if ( stat != SQL_SUCCESS ) {
388: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLNumResultCols return %d",stat);
389: SQLFreeStmt(res->hstmt,SQL_DROP);
390: efree(res);
391: RETURN_FALSE;
392: }
393: SQLFreeStmt(res->hstmt,SQL_DROP);
394: efree(res);
395: RETURN_LONG(rows);
396: } else { /* Was SELECT query */
397: res->values = (VResVal *)safe_emalloc(sizeof(VResVal), cols, 0);
398: res->numcols = cols;
399: for ( i = 0; i < cols; i++ ) {
400: SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_NAME,
401: res->values[i].name,sizeof(res->values[i].name),
402: &colnamelen,NULL);
403: SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_TYPE,
404: NULL,0,NULL,&res->values[i].valtype);
405: switch ( res->values[i].valtype ) {
406: case SQL_LONGVARBINARY:
407: case SQL_LONGVARCHAR:
408: res->values[i].value = NULL;
409: continue;
410: default:
411: break;
412: }
413: SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_DISPLAY_SIZE,
414: NULL,0,NULL,&coldesc);
415: res->values[i].value = (char *)emalloc(coldesc+1);
416: SQLBindCol(res->hstmt,i+1,SQL_C_CHAR, res->values[i].value,coldesc+1, &res->values[i].vallen);
417: }
418: }
419: res->fetched = 0;
420: indx = birdstep_add_result(list,res,conn);
421: RETURN_LONG(indx);
422: }
423: /* }}} */
424:
425: /* {{{ proto bool birdstep_fetch(int index)
426: */
427: PHP_FUNCTION(birdstep_fetch)
428: {
429: long ind;
430: Vresult *res;
431: RETCODE stat;
432: UDWORD row;
433: UWORD RowStat[1];
434:
435: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ind) == FAILURE) {
436: return;
437: }
438:
439: PHP_GET_BIRDSTEP_RES_IDX(ind);
440:
441: stat = SQLExtendedFetch(res->hstmt,SQL_FETCH_NEXT,1,&row,RowStat);
442: if ( stat == SQL_NO_DATA_FOUND ) {
443: SQLFreeStmt(res->hstmt,SQL_DROP);
444: birdstep_del_result(list,Z_LVAL_PP(ind));
445: RETURN_FALSE;
446: }
447: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
448: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLFetch return error");
449: SQLFreeStmt(res->hstmt,SQL_DROP);
450: birdstep_del_result(list,Z_LVAL_PP(ind));
451: RETURN_FALSE;
452: }
453: res->fetched = 1;
454: RETURN_TRUE;
455: }
456: /* }}} */
457:
458: /* {{{ proto mixed birdstep_result(int index, mixed col)
459: */
460: PHP_FUNCTION(birdstep_result)
461: {
462: zval **col;
463: long ind;
464: Vresult *res;
465: RETCODE stat;
466: int i,sql_c_type;
467: UDWORD row;
468: UWORD RowStat[1];
469: SWORD indx = -1;
470: char *field = NULL;
471:
472: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lZ", &ind, &col) == FAILURE) {
473: return;
474: }
475:
476: PHP_GET_BIRDSTEP_RES_IDX(ind);
477:
478: if ( Z_TYPE_PP(col) == IS_STRING ) {
479: field = Z_STRVAL_PP(col);
480: } else {
481: convert_to_long_ex(col);
482: indx = Z_LVAL_PP(col);
483: }
484: if ( field ) {
485: for ( i = 0; i < res->numcols; i++ ) {
486: if ( !strcasecmp(res->values[i].name,field)) {
487: indx = i;
488: break;
489: }
490: }
491: if ( indx < 0 ) {
492: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %s not found",field);
493: RETURN_FALSE;
494: }
495: } else {
496: if ( indx < 0 || indx >= res->numcols ) {
497: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Field index not in range");
498: RETURN_FALSE;
499: }
500: }
501: if ( !res->fetched ) {
502: stat = SQLExtendedFetch(res->hstmt,SQL_FETCH_NEXT,1,&row,RowStat);
503: if ( stat == SQL_NO_DATA_FOUND ) {
504: SQLFreeStmt(res->hstmt,SQL_DROP);
505: birdstep_del_result(list,Z_LVAL_PP(ind));
506: RETURN_FALSE;
507: }
508: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
509: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLFetch return error");
510: SQLFreeStmt(res->hstmt,SQL_DROP);
511: birdstep_del_result(list,Z_LVAL_PP(ind));
512: RETURN_FALSE;
513: }
514: res->fetched = 1;
515: }
516: switch ( res->values[indx].valtype ) {
517: case SQL_LONGVARBINARY:
518: sql_c_type = SQL_C_BINARY;
519: goto l1;
520: case SQL_LONGVARCHAR:
521: sql_c_type = SQL_C_CHAR;
522: l1:
523: if ( !res->values[indx].value ) {
524: res->values[indx].value = emalloc(4096);
525: }
526: stat = SQLGetData(res->hstmt,indx+1,sql_c_type,
527: res->values[indx].value,4095,&res->values[indx].vallen);
528: if ( stat == SQL_NO_DATA_FOUND ) {
529: SQLFreeStmt(res->hstmt,SQL_DROP);
530: birdstep_del_result(list,Z_LVAL_PP(ind));
531: RETURN_FALSE;
532: }
533: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
534: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLGetData return error");
535: SQLFreeStmt(res->hstmt,SQL_DROP);
536: birdstep_del_result(list,Z_LVAL_PP(ind));
537: RETURN_FALSE;
538: }
539: if ( res->values[indx].valtype == SQL_LONGVARCHAR ) {
540: RETURN_STRING(res->values[indx].value,TRUE);
541: } else {
542: RETURN_LONG((long)res->values[indx].value);
543: }
544: default:
545: if ( res->values[indx].value != NULL ) {
546: RETURN_STRING(res->values[indx].value,TRUE);
547: }
548: }
549: }
550: /* }}} */
551:
552: /* {{{ proto bool birdstep_freeresult(int index)
553: */
554: PHP_FUNCTION(birdstep_freeresult)
555: {
556: long ind;
557: Vresult *res;
558:
559: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ind) == FAILURE) {
560: return;
561: }
562:
563: PHP_GET_BIRDSTEP_RES_IDX(ind);
564:
565: SQLFreeStmt(res->hstmt,SQL_DROP);
566: birdstep_del_result(list, ind);
567: RETURN_TRUE;
568: }
569: /* }}} */
570:
571: /* {{{ proto bool birdstep_autocommit(int index)
572: */
573: PHP_FUNCTION(birdstep_autocommit)
574: {
575: long id;
576: RETCODE stat;
577: VConn *conn;
578:
579: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
580: return;
581: }
582:
583: PHP_BIRDSTEP_CHK_LNK(id);
584:
585: stat = SQLSetConnectOption(conn->hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_ON);
586: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
587: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Set autocommit_on option failure");
588: RETURN_FALSE;
589: }
590: RETURN_TRUE;
591: }
592: /* }}} */
593:
594: /* {{{ proto bool birdstep_off_autocommit(int index)
595: */
596: PHP_FUNCTION(birdstep_off_autocommit)
597: {
598: long id;
599: RETCODE stat;
600: VConn *conn;
601:
602: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
603: return;
604: }
605:
606: PHP_BIRDSTEP_CHK_LNK(id);
607:
608: stat = SQLSetConnectOption(conn->hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF);
609: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
610: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Set autocommit_off option failure");
611: RETURN_FALSE;
612: }
613: RETURN_TRUE;
614: }
615: /* }}} */
616:
617: /* {{{ proto bool birdstep_commit(int index)
618: */
619: PHP_FUNCTION(birdstep_commit)
620: {
621: long id;
622: RETCODE stat;
623: VConn *conn;
624:
625: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
626: return;
627: }
628:
629: PHP_BIRDSTEP_CHK_LNK(id)
630:
631: stat = SQLTransact(NULL,conn->hdbc,SQL_COMMIT);
632: if ( stat != SQL_SUCCESS ) {
633: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Commit failure");
634: RETURN_FALSE;
635: }
636: RETURN_TRUE;
637: }
638: /* }}} */
639:
640: /* {{{ proto bool birdstep_rollback(int index)
641: */
642: PHP_FUNCTION(birdstep_rollback)
643: {
644: long id;
645: RETCODE stat;
646: VConn *conn;
647:
648: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
649: return;
650: }
651:
652: PHP_BIRDSTEP_CHK_LNK(id);
653:
654: stat = SQLTransact(NULL,conn->hdbc,SQL_ROLLBACK);
655: if ( stat != SQL_SUCCESS ) {
656: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Rollback failure");
657: RETURN_FALSE;
658: }
659: RETURN_TRUE;
660: }
661: /* }}} */
662:
663: /* {{{ proto string birdstep_fieldname(int index, int col)
664: */
665: PHP_FUNCTION(birdstep_fieldname)
666: {
667: long ind, col;
668: Vresult *res;
669: SWORD indx;
670:
671: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &ind, &col) == FAILURE) {
672: return;
673: }
674:
675: PHP_GET_BIRDSTEP_RES_IDX(ind);
676:
677: indx = col;
678: if ( indx < 0 || indx >= res->numcols ) {
679: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Field index not in range");
680: RETURN_FALSE;
681: }
682: RETURN_STRING(res->values[indx].name,TRUE);
683: }
684: /* }}} */
685:
686: /* {{{ proto int birdstep_fieldnum(int index)
687: */
688: PHP_FUNCTION(birdstep_fieldnum)
689: {
690: long ind;
691: Vresult *res;
692:
693: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ind) == FAILURE) {
694: return;
695: }
696:
697: PHP_GET_BIRDSTEP_RES_IDX(ind);
698:
699: RETURN_LONG(res->numcols);
700: }
701: /* }}} */
702:
703: #endif /* HAVE_BIRDSTEP */
704:
705: /*
706: * Local variables:
707: * tab-width: 4
708: * c-basic-offset: 4
709: * End:
710: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>