Annotation of embedaddon/php/ext/interbase/ibase_blobs.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 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: Ard Biesheuvel <a.k.biesheuvel@its.tudelft.nl> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: ibase_blobs.c 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: #ifdef HAVE_CONFIG_H
! 22: #include "config.h"
! 23: #endif
! 24:
! 25: #include "php.h"
! 26:
! 27: #if HAVE_IBASE
! 28:
! 29: #include "php_interbase.h"
! 30: #include "php_ibase_includes.h"
! 31:
! 32: #define BLOB_CLOSE 1
! 33: #define BLOB_CANCEL 2
! 34:
! 35: static int le_blob;
! 36:
! 37: static void _php_ibase_free_blob(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
! 38: {
! 39: ibase_blob *ib_blob = (ibase_blob *)rsrc->ptr;
! 40:
! 41: if (ib_blob->bl_handle != NULL) { /* blob open*/
! 42: if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
! 43: _php_ibase_module_error("You can lose data. Close any blob after reading from or "
! 44: "writing to it. Use ibase_blob_close() before calling ibase_close()" TSRMLS_CC);
! 45: }
! 46: }
! 47: efree(ib_blob);
! 48: }
! 49: /* }}} */
! 50:
! 51: void php_ibase_blobs_minit(INIT_FUNC_ARGS) /* {{{ */
! 52: {
! 53: le_blob = zend_register_list_destructors_ex(_php_ibase_free_blob, NULL,
! 54: "interbase blob", module_number);
! 55: }
! 56: /* }}} */
! 57:
! 58: int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd) /* {{{ */
! 59: {
! 60: /* shortcut for most common case */
! 61: if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
! 62: return sscanf(id, BLOB_ID_MASK, (ISC_UINT64 *) qd);
! 63: } else {
! 64: ISC_UINT64 res;
! 65: if (sscanf(id, BLOB_ID_MASK, &res)) {
! 66: qd->gds_quad_high = (ISC_LONG) (res >> 0x20);
! 67: qd->gds_quad_low = (ISC_LONG) (res & 0xFFFFFFFF);
! 68: return 1;
! 69: }
! 70: return 0;
! 71: }
! 72: }
! 73: /* }}} */
! 74:
! 75: char *_php_ibase_quad_to_string(ISC_QUAD const qd) /* {{{ */
! 76: {
! 77: char *result;
! 78:
! 79: /* shortcut for most common case */
! 80: if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
! 81: spprintf(&result, BLOB_ID_LEN+1, "0x%0*" LL_MASK "x", 16, *(ISC_UINT64*)(void *) &qd);
! 82: } else {
! 83: ISC_UINT64 res = ((ISC_UINT64) qd.gds_quad_high << 0x20) | qd.gds_quad_low;
! 84: spprintf(&result, BLOB_ID_LEN+1, "0x%0*" LL_MASK "x", 16, res);
! 85: }
! 86: return result;
! 87: }
! 88: /* }}} */
! 89:
! 90: typedef struct { /* {{{ */
! 91: ISC_LONG max_segment; /* Length of longest segment */
! 92: ISC_LONG num_segments; /* Total number of segments */
! 93: ISC_LONG total_length; /* Total length of blob */
! 94: int bl_stream; /* blob is stream ? */
! 95: /* }}} */
! 96: } IBASE_BLOBINFO;
! 97:
! 98: int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long max_len TSRMLS_DC) /* {{{ */
! 99: {
! 100: if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null ?*/
! 101:
! 102: ISC_STATUS stat;
! 103: char *bl_data;
! 104: unsigned long cur_len;
! 105: unsigned short seg_len;
! 106:
! 107: bl_data = safe_emalloc(1, max_len, 1);
! 108:
! 109: for (cur_len = stat = 0; (stat == 0 || stat == isc_segment) && cur_len < max_len; cur_len += seg_len) {
! 110:
! 111: unsigned short chunk_size = (max_len-cur_len) > USHRT_MAX ? USHRT_MAX
! 112: : (unsigned short)(max_len-cur_len);
! 113:
! 114: stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, &seg_len, chunk_size, &bl_data[cur_len]);
! 115: }
! 116:
! 117: bl_data[cur_len] = '\0';
! 118: if (IB_STATUS[0] == 1 && (stat != 0 && stat != isc_segstr_eof && stat != isc_segment)) {
! 119: efree(bl_data);
! 120: _php_ibase_error(TSRMLS_C);
! 121: return FAILURE;
! 122: }
! 123: RETVAL_STRINGL(bl_data, cur_len, 0);
! 124: } else { /* null blob */
! 125: RETVAL_STRING("", 1); /* empty string */
! 126: }
! 127: return SUCCESS;
! 128: }
! 129: /* }}} */
! 130:
! 131: int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC) /* {{{ */
! 132: {
! 133: unsigned long put_cnt = 0, rem_cnt;
! 134: unsigned short chunk_size;
! 135:
! 136: convert_to_string_ex(string_arg);
! 137:
! 138: for (rem_cnt = Z_STRLEN_PP(string_arg); rem_cnt > 0; rem_cnt -= chunk_size) {
! 139:
! 140: chunk_size = rem_cnt > USHRT_MAX ? USHRT_MAX : (unsigned short)rem_cnt;
! 141:
! 142: if (isc_put_segment(IB_STATUS, &ib_blob->bl_handle, chunk_size, &Z_STRVAL_PP(string_arg)[put_cnt] )) {
! 143: _php_ibase_error(TSRMLS_C);
! 144: return FAILURE;
! 145: }
! 146: put_cnt += chunk_size;
! 147: }
! 148: return SUCCESS;
! 149: }
! 150: /* }}} */
! 151:
! 152: static int _php_ibase_blob_info(isc_blob_handle bl_handle, IBASE_BLOBINFO *bl_info TSRMLS_DC) /* {{{ */
! 153: {
! 154: static char bl_items[] = {
! 155: isc_info_blob_num_segments,
! 156: isc_info_blob_max_segment,
! 157: isc_info_blob_total_length,
! 158: isc_info_blob_type
! 159: };
! 160:
! 161: char bl_inf[sizeof(long)*8], *p;
! 162:
! 163: bl_info->max_segment = 0;
! 164: bl_info->num_segments = 0;
! 165: bl_info->total_length = 0;
! 166: bl_info->bl_stream = 0;
! 167:
! 168: if (isc_blob_info(IB_STATUS, &bl_handle, sizeof(bl_items), bl_items, sizeof(bl_inf), bl_inf)) {
! 169: _php_ibase_error(TSRMLS_C);
! 170: return FAILURE;
! 171: }
! 172:
! 173: for (p = bl_inf; *p != isc_info_end && p < bl_inf + sizeof(bl_inf);) {
! 174: unsigned short item_len;
! 175: int item = *p++;
! 176:
! 177: item_len = (short) isc_vax_integer(p, 2);
! 178: p += 2;
! 179: switch (item) {
! 180: case isc_info_blob_num_segments:
! 181: bl_info->num_segments = isc_vax_integer(p, item_len);
! 182: break;
! 183: case isc_info_blob_max_segment:
! 184: bl_info->max_segment = isc_vax_integer(p, item_len);
! 185: break;
! 186: case isc_info_blob_total_length:
! 187: bl_info->total_length = isc_vax_integer(p, item_len);
! 188: break;
! 189: case isc_info_blob_type:
! 190: bl_info->bl_stream = isc_vax_integer(p, item_len);
! 191: break;
! 192: case isc_info_end:
! 193: break;
! 194: case isc_info_truncated:
! 195: case isc_info_error: /* hmm. don't think so...*/
! 196: _php_ibase_module_error("PHP module internal error" TSRMLS_CC);
! 197: return FAILURE;
! 198: } /* switch */
! 199: p += item_len;
! 200: } /* for */
! 201: return SUCCESS;
! 202: }
! 203: /* }}} */
! 204:
! 205: /* {{{ proto resource ibase_blob_create([resource link_identifier])
! 206: Create blob for adding data */
! 207: PHP_FUNCTION(ibase_blob_create)
! 208: {
! 209: zval *link = NULL;
! 210: ibase_db_link *ib_link;
! 211: ibase_trans *trans = NULL;
! 212: ibase_blob *ib_blob;
! 213:
! 214: RESET_ERRMSG;
! 215:
! 216: if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &link)) {
! 217: RETURN_FALSE;
! 218: }
! 219:
! 220: PHP_IBASE_LINK_TRANS(link, ib_link, trans);
! 221:
! 222: ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
! 223: ib_blob->bl_handle = NULL;
! 224: ib_blob->type = BLOB_INPUT;
! 225:
! 226: if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle, &ib_blob->bl_qd)) {
! 227: _php_ibase_error(TSRMLS_C);
! 228: efree(ib_blob);
! 229: RETURN_FALSE;
! 230: }
! 231:
! 232: ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
! 233: }
! 234: /* }}} */
! 235:
! 236: /* {{{ proto resource ibase_blob_open([ resource link_identifier, ] string blob_id)
! 237: Open blob for retrieving data parts */
! 238: PHP_FUNCTION(ibase_blob_open)
! 239: {
! 240: char *blob_id;
! 241: int blob_id_len;
! 242: zval *link = NULL;
! 243: ibase_db_link *ib_link;
! 244: ibase_trans *trans = NULL;
! 245: ibase_blob *ib_blob;
! 246:
! 247: RESET_ERRMSG;
! 248:
! 249: switch (ZEND_NUM_ARGS()) {
! 250: default:
! 251: WRONG_PARAM_COUNT;
! 252: case 1:
! 253: if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
! 254: RETURN_FALSE;
! 255: }
! 256: break;
! 257: case 2:
! 258: if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "rs", &link, &blob_id, &blob_id_len)) {
! 259: RETURN_FALSE;
! 260: }
! 261: break;
! 262: }
! 263:
! 264: PHP_IBASE_LINK_TRANS(link, ib_link, trans);
! 265:
! 266: ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
! 267: ib_blob->bl_handle = NULL;
! 268: ib_blob->type = BLOB_OUTPUT;
! 269:
! 270: do {
! 271: if (! _php_ibase_string_to_quad(blob_id, &ib_blob->bl_qd)) {
! 272: _php_ibase_module_error("String is not a BLOB ID" TSRMLS_CC);
! 273: break;
! 274: }
! 275:
! 276: if (isc_open_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle,
! 277: &ib_blob->bl_qd)) {
! 278: _php_ibase_error(TSRMLS_C);
! 279: break;
! 280: }
! 281:
! 282: ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
! 283: return;
! 284:
! 285: } while (0);
! 286:
! 287: efree(ib_blob);
! 288: RETURN_FALSE;
! 289: }
! 290: /* }}} */
! 291:
! 292: /* {{{ proto bool ibase_blob_add(resource blob_handle, string data)
! 293: Add data into created blob */
! 294: PHP_FUNCTION(ibase_blob_add)
! 295: {
! 296: zval **blob_arg, **string_arg;
! 297: ibase_blob *ib_blob;
! 298:
! 299: RESET_ERRMSG;
! 300:
! 301: if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &blob_arg, &string_arg) == FAILURE) {
! 302: WRONG_PARAM_COUNT;
! 303: }
! 304:
! 305: ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
! 306:
! 307: if (ib_blob->type != BLOB_INPUT) {
! 308: _php_ibase_module_error("BLOB is not open for input" TSRMLS_CC);
! 309: RETURN_FALSE;
! 310: }
! 311:
! 312: if (_php_ibase_blob_add(string_arg, ib_blob TSRMLS_CC) != SUCCESS) {
! 313: RETURN_FALSE;
! 314: }
! 315: }
! 316: /* }}} */
! 317:
! 318: /* {{{ proto string ibase_blob_get(resource blob_handle, int len)
! 319: Get len bytes data from open blob */
! 320: PHP_FUNCTION(ibase_blob_get)
! 321: {
! 322: zval **blob_arg, **len_arg;
! 323: ibase_blob *ib_blob;
! 324:
! 325: RESET_ERRMSG;
! 326:
! 327: if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &blob_arg, &len_arg) == FAILURE) {
! 328: WRONG_PARAM_COUNT;
! 329: }
! 330:
! 331: ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
! 332:
! 333: if (ib_blob->type != BLOB_OUTPUT) {
! 334: _php_ibase_module_error("BLOB is not open for output" TSRMLS_CC);
! 335: RETURN_FALSE;
! 336: }
! 337:
! 338: convert_to_long_ex(len_arg);
! 339:
! 340: if (_php_ibase_blob_get(return_value, ib_blob, Z_LVAL_PP(len_arg) TSRMLS_CC) != SUCCESS) {
! 341: RETURN_FALSE;
! 342: }
! 343: }
! 344: /* }}} */
! 345:
! 346: static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{ */
! 347: {
! 348: zval **blob_arg;
! 349: ibase_blob *ib_blob;
! 350:
! 351: RESET_ERRMSG;
! 352:
! 353: if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &blob_arg) == FAILURE) {
! 354: WRONG_PARAM_COUNT;
! 355: }
! 356:
! 357: ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
! 358:
! 359: if (bl_end == BLOB_CLOSE) { /* return id here */
! 360:
! 361: if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null ?*/
! 362: if (isc_close_blob(IB_STATUS, &ib_blob->bl_handle)) {
! 363: _php_ibase_error(TSRMLS_C);
! 364: RETURN_FALSE;
! 365: }
! 366: }
! 367: ib_blob->bl_handle = NULL;
! 368:
! 369: RETVAL_STRINGL(_php_ibase_quad_to_string(ib_blob->bl_qd), BLOB_ID_LEN, 0);
! 370: } else { /* discard created blob */
! 371: if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
! 372: _php_ibase_error(TSRMLS_C);
! 373: RETURN_FALSE;
! 374: }
! 375: ib_blob->bl_handle = NULL;
! 376: RETVAL_TRUE;
! 377: }
! 378: zend_list_delete(Z_LVAL_PP(blob_arg));
! 379: }
! 380: /* }}} */
! 381:
! 382: /* {{{ proto string ibase_blob_close(resource blob_handle)
! 383: Close blob */
! 384: PHP_FUNCTION(ibase_blob_close)
! 385: {
! 386: _php_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, BLOB_CLOSE);
! 387: }
! 388: /* }}} */
! 389:
! 390: /* {{{ proto bool ibase_blob_cancel(resource blob_handle)
! 391: Cancel creating blob */
! 392: PHP_FUNCTION(ibase_blob_cancel)
! 393: {
! 394: _php_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, BLOB_CANCEL);
! 395: }
! 396: /* }}} */
! 397:
! 398: /* {{{ proto array ibase_blob_info([ resource link_identifier, ] string blob_id)
! 399: Return blob length and other useful info */
! 400: PHP_FUNCTION(ibase_blob_info)
! 401: {
! 402: char *blob_id;
! 403: int blob_id_len;
! 404: zval *link = NULL;
! 405: ibase_db_link *ib_link;
! 406: ibase_trans *trans = NULL;
! 407: ibase_blob ib_blob = { NULL, BLOB_INPUT };
! 408: IBASE_BLOBINFO bl_info;
! 409:
! 410: RESET_ERRMSG;
! 411:
! 412: switch (ZEND_NUM_ARGS()) {
! 413: default:
! 414: WRONG_PARAM_COUNT;
! 415: case 1:
! 416: if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
! 417: RETURN_FALSE;
! 418: }
! 419: break;
! 420: case 2:
! 421: if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "rs", &link, &blob_id, &blob_id_len)) {
! 422: RETURN_FALSE;
! 423: }
! 424: break;
! 425: }
! 426:
! 427: PHP_IBASE_LINK_TRANS(link, ib_link, trans);
! 428:
! 429: if (! _php_ibase_string_to_quad(blob_id, &ib_blob.bl_qd)) {
! 430: _php_ibase_module_error("Unrecognized BLOB ID" TSRMLS_CC);
! 431: RETURN_FALSE;
! 432: }
! 433:
! 434: if (ib_blob.bl_qd.gds_quad_high || ib_blob.bl_qd.gds_quad_low) { /* not null ? */
! 435: if (isc_open_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob.bl_handle,
! 436: &ib_blob.bl_qd)) {
! 437: _php_ibase_error(TSRMLS_C);
! 438: RETURN_FALSE;
! 439: }
! 440:
! 441: if (_php_ibase_blob_info(ib_blob.bl_handle, &bl_info TSRMLS_CC)) {
! 442: RETURN_FALSE;
! 443: }
! 444: if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) {
! 445: _php_ibase_error(TSRMLS_C);
! 446: RETURN_FALSE;
! 447: }
! 448: } else { /* null blob, all values to zero */
! 449: bl_info.max_segment = 0;
! 450: bl_info.num_segments = 0;
! 451: bl_info.total_length = 0;
! 452: bl_info.bl_stream = 0;
! 453: }
! 454:
! 455: array_init(return_value);
! 456:
! 457: add_index_long(return_value, 0, bl_info.total_length);
! 458: add_assoc_long(return_value, "length", bl_info.total_length);
! 459:
! 460: add_index_long(return_value, 1, bl_info.num_segments);
! 461: add_assoc_long(return_value, "numseg", bl_info.num_segments);
! 462:
! 463: add_index_long(return_value, 2, bl_info.max_segment);
! 464: add_assoc_long(return_value, "maxseg", bl_info.max_segment);
! 465:
! 466: add_index_bool(return_value, 3, bl_info.bl_stream);
! 467: add_assoc_bool(return_value, "stream", bl_info.bl_stream);
! 468:
! 469: add_index_bool(return_value, 4, (!ib_blob.bl_qd.gds_quad_high && !ib_blob.bl_qd.gds_quad_low));
! 470: add_assoc_bool(return_value, "isnull", (!ib_blob.bl_qd.gds_quad_high && !ib_blob.bl_qd.gds_quad_low));
! 471: }
! 472: /* }}} */
! 473:
! 474: /* {{{ proto bool ibase_blob_echo([ resource link_identifier, ] string blob_id)
! 475: Output blob contents to browser */
! 476: PHP_FUNCTION(ibase_blob_echo)
! 477: {
! 478: char *blob_id;
! 479: int blob_id_len;
! 480: zval *link = NULL;
! 481: ibase_db_link *ib_link;
! 482: ibase_trans *trans = NULL;
! 483: ibase_blob ib_blob_id = { NULL, BLOB_OUTPUT };
! 484: char bl_data[IBASE_BLOB_SEG];
! 485: unsigned short seg_len;
! 486:
! 487: RESET_ERRMSG;
! 488:
! 489: switch (ZEND_NUM_ARGS()) {
! 490: default:
! 491: WRONG_PARAM_COUNT;
! 492: case 1:
! 493: if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
! 494: RETURN_FALSE;
! 495: }
! 496: break;
! 497: case 2:
! 498: if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "rs", &link, &blob_id, &blob_id_len)) {
! 499: RETURN_FALSE;
! 500: }
! 501: break;
! 502: }
! 503:
! 504: PHP_IBASE_LINK_TRANS(link, ib_link, trans);
! 505:
! 506: if (! _php_ibase_string_to_quad(blob_id, &ib_blob_id.bl_qd)) {
! 507: _php_ibase_module_error("Unrecognized BLOB ID" TSRMLS_CC);
! 508: RETURN_FALSE;
! 509: }
! 510:
! 511: do {
! 512: if (isc_open_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob_id.bl_handle,
! 513: &ib_blob_id.bl_qd)) {
! 514: break;
! 515: }
! 516:
! 517: while (!isc_get_segment(IB_STATUS, &ib_blob_id.bl_handle, &seg_len, sizeof(bl_data), bl_data)
! 518: || IB_STATUS[1] == isc_segment) {
! 519: PHPWRITE(bl_data, seg_len);
! 520: }
! 521:
! 522: if (IB_STATUS[0] && (IB_STATUS[1] != isc_segstr_eof)) {
! 523: break;
! 524: }
! 525:
! 526: if (isc_close_blob(IB_STATUS, &ib_blob_id.bl_handle)) {
! 527: break;
! 528: }
! 529: RETURN_TRUE;
! 530: } while (0);
! 531:
! 532: _php_ibase_error(TSRMLS_C);
! 533: RETURN_FALSE;
! 534: }
! 535: /* }}} */
! 536:
! 537: /* {{{ proto string ibase_blob_import([ resource link_identifier, ] resource file)
! 538: Create blob, copy file in it, and close it */
! 539: PHP_FUNCTION(ibase_blob_import)
! 540: {
! 541: zval *link = NULL, *file;
! 542: int size;
! 543: unsigned short b;
! 544: ibase_blob ib_blob = { NULL, 0 };
! 545: ibase_db_link *ib_link;
! 546: ibase_trans *trans = NULL;
! 547: char bl_data[IBASE_BLOB_SEG];
! 548: php_stream *stream;
! 549:
! 550: RESET_ERRMSG;
! 551:
! 552: if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|r",
! 553: (ZEND_NUM_ARGS()-1) ? &link : &file, &file)) {
! 554: RETURN_FALSE;
! 555: }
! 556:
! 557: PHP_IBASE_LINK_TRANS(link, ib_link, trans);
! 558:
! 559: php_stream_from_zval(stream, &file);
! 560:
! 561: do {
! 562: if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob.bl_handle,
! 563: &ib_blob.bl_qd)) {
! 564: break;
! 565: }
! 566:
! 567: for (size = 0; (b = php_stream_read(stream, bl_data, sizeof(bl_data))); size += b) {
! 568: if (isc_put_segment(IB_STATUS, &ib_blob.bl_handle, b, bl_data)) {
! 569: break;
! 570: }
! 571: }
! 572:
! 573: if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) {
! 574: break;
! 575: }
! 576: RETURN_STRINGL( _php_ibase_quad_to_string(ib_blob.bl_qd), BLOB_ID_LEN, 0);
! 577: } while (0);
! 578:
! 579: _php_ibase_error(TSRMLS_C);
! 580: RETURN_FALSE;
! 581: }
! 582: /* }}} */
! 583:
! 584: #endif /* HAVE_IBASE */
! 585:
! 586: /*
! 587: * Local variables:
! 588: * tab-width: 4
! 589: * c-basic-offset: 4
! 590: * End:
! 591: * vim600: sw=4 ts=4 fdm=marker
! 592: * vim<600: sw=4 ts=4
! 593: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>