Annotation of embedaddon/php/ext/interbase/ibase_blobs.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: Ard Biesheuvel <a.k.biesheuvel@its.tudelft.nl>              |
                     16:    +----------------------------------------------------------------------+
                     17:  */
                     18: 
1.1.1.2   misho      19: /* $Id$ */
1.1       misho      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>