📄 php_yaz.c
字号:
RETURN_FALSE; } options_ht = Z_ARRVAL_PP(pval_options); val = array_lookup_long(options_ht, "timeout"); if (val) timeout = *val; }#ifdef ZTS tsrm_mutex_lock (yaz_mutex);#endif for (i = 0; i<YAZSG(max_links); i++) { Yaz_Association p = shared_associations[i]; if (p && p->order == YAZSG(assoc_seq)) { char str[20]; sprintf (str, "%d", timeout); ZOOM_connection_option_set (p->zoom_conn, "timeout", str); conn_ar[no++] = p->zoom_conn; } }#ifdef ZTS tsrm_mutex_unlock (yaz_mutex);#endif if (no) while (ZOOM_event (no, conn_ar)) ; RETURN_TRUE;}/* }}} *//* {{{ proto int yaz_errno(int id) Return last error number (>0 for bib-1 diagnostic, <0 for other error, 0 for no error */PHP_FUNCTION(yaz_errno){ pval **id; Yaz_Association p; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &id) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, id, &p); if (!p) { RETURN_LONG(0); } RETVAL_LONG(ZOOM_connection_errcode (p->zoom_conn)); release_assoc (p);}/* }}} *//* {{{ proto string yaz_error(int id) Return last error message */PHP_FUNCTION(yaz_error){ pval **id; Yaz_Association p; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &id) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, id, &p); if (p) { int code = ZOOM_connection_errcode (p->zoom_conn); const char *msg = ZOOM_connection_errmsg (p->zoom_conn); if (!code) msg = ""; return_value->value.str.len = strlen(msg); return_value->value.str.val = estrndup(msg, return_value->value.str.len); return_value->type = IS_STRING; } release_assoc (p);}/* }}} *//* {{{ proto string yaz_addinfo(int id) Return additional info for last error (empty string if none) */PHP_FUNCTION(yaz_addinfo){ pval **id; Yaz_Association p; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &id) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, id, &p); if (p) { const char *addinfo = ZOOM_connection_addinfo (p->zoom_conn); return_value->value.str.len = strlen(addinfo); return_value->value.str.val = estrndup(addinfo, return_value->value.str.len); return_value->type = IS_STRING; } release_assoc (p);}/* }}} *//* {{{ proto int yaz_hits(int id) Return number of hits (result count) for last search */PHP_FUNCTION(yaz_hits){ pval **id; Yaz_Association p; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &id) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, id, &p); if (p && p->zoom_set) { RETVAL_LONG(ZOOM_resultset_size (p->zoom_set)); } else { RETVAL_LONG(0); } release_assoc (p);}/* }}} */static Z_GenericRecord *marc_to_grs1(const char *buf, ODR o){ int entry_p; int record_length; int indicator_length; int identifier_length; int base_address; int length_data_entry; int length_starting; int length_implementation; int max_elements = 256; Z_GenericRecord *r = odr_malloc (o, sizeof(*r)); r->elements = odr_malloc (o, sizeof(*r->elements) * max_elements); r->num_elements = 0; record_length = atoi_n (buf, 5); if (record_length < 25) return 0; indicator_length = atoi_n (buf+10, 1); identifier_length = atoi_n (buf+11, 1); base_address = atoi_n (buf+12, 5); length_data_entry = atoi_n (buf+20, 1); length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) { entry_p += 3+length_data_entry+length_starting; if (entry_p >= record_length) return 0; } base_address = entry_p+1; for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) { Z_TaggedElement *tag; int data_length; int data_offset; int end_offset; int i; char tag_str[4]; int identifier_flag = 1; memcpy (tag_str, buf+entry_p, 3); entry_p += 3; tag_str[3] = '\0'; if ((r->num_elements + 1) >= max_elements) { Z_TaggedElement **tmp = r->elements; /* double array space, throw away old buffer (nibble memory) */ r->elements = odr_malloc(o, sizeof(*r->elements) * (max_elements *= 2)); memcpy(r->elements, tmp, r->num_elements * sizeof(*tmp)); } tag = r->elements[r->num_elements++] = odr_malloc (o, sizeof(*tag)); tag->tagType = odr_malloc(o, sizeof(*tag->tagType)); *tag->tagType = 3; tag->tagOccurrence = 0; tag->metaData = 0; tag->appliedVariant = 0; tag->tagValue = odr_malloc (o, sizeof(*tag->tagValue)); tag->tagValue->which = Z_StringOrNumeric_string; tag->tagValue->u.string = odr_strdup(o, tag_str); tag->content = odr_malloc(o, sizeof(*tag->content)); tag->content->which = Z_ElementData_subtree; tag->content->u.subtree = odr_malloc (o, sizeof(*tag->content->u.subtree)); tag->content->u.subtree->elements = odr_malloc (o, sizeof(*r->elements)); tag->content->u.subtree->num_elements = 1; tag = tag->content->u.subtree->elements[0] = odr_malloc (o, sizeof(**tag->content->u.subtree->elements)); tag->tagType = odr_malloc(o, sizeof(*tag->tagType)); *tag->tagType = 3; tag->tagOccurrence = 0; tag->metaData = 0; tag->appliedVariant = 0; tag->tagValue = odr_malloc (o, sizeof(*tag->tagValue)); tag->tagValue->which = Z_StringOrNumeric_string; tag->content = odr_malloc(o, sizeof(*tag->content)); data_length = atoi_n (buf+entry_p, length_data_entry); entry_p += length_data_entry; data_offset = atoi_n (buf+entry_p, length_starting); entry_p += length_starting; i = data_offset + base_address; end_offset = i+data_length-1; if (indicator_length > 0 && indicator_length < 5) { if (buf[i + indicator_length] != ISO2709_IDFS) identifier_flag = 0; } else if (!memcmp (tag_str, "00", 2)) identifier_flag = 0; if (identifier_flag && indicator_length) { /* indicator */ tag->tagValue->u.string = odr_malloc(o, indicator_length+1); memcpy (tag->tagValue->u.string, buf + i, indicator_length); tag->tagValue->u.string[indicator_length] = '\0'; i += indicator_length; tag->content->which = Z_ElementData_subtree; tag->content->u.subtree = odr_malloc (o, sizeof(*tag->content->u.subtree)); tag->content->u.subtree->elements = odr_malloc (o, 256 * sizeof(*r->elements)); tag->content->u.subtree->num_elements = 0; while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) { int i0; /* prepare tag */ Z_TaggedElement *parent_tag = tag; Z_TaggedElement *tag = odr_malloc (o, sizeof(*tag)); if (parent_tag->content->u.subtree->num_elements < 256) parent_tag->content->u.subtree->elements[ parent_tag->content->u.subtree->num_elements++] = tag; tag->tagType = odr_malloc(o, sizeof(*tag->tagType)); *tag->tagType = 3; tag->tagOccurrence = 0; tag->metaData = 0; tag->appliedVariant = 0; tag->tagValue = odr_malloc (o, sizeof(*tag->tagValue)); tag->tagValue->which = Z_StringOrNumeric_string; /* sub field */ tag->tagValue->u.string = odr_malloc (o, identifier_length); memcpy (tag->tagValue->u.string, buf+i+1, identifier_length-1); tag->tagValue->u.string[identifier_length-1] = '\0'; i += identifier_length; /* data ... */ tag->content = odr_malloc(o, sizeof(*tag->content)); tag->content->which = Z_ElementData_string; i0 = i; while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS && buf[i] != ISO2709_FS && i < end_offset) i++; tag->content->u.string = odr_malloc (o, i - i0 + 1); memcpy (tag->content->u.string, buf + i0, i - i0); tag->content->u.string[i - i0] = '\0'; } } else { int i0 = i; tag->tagValue->u.string = "@"; tag->content->which = Z_ElementData_string; while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) i++; tag->content->u.string = odr_malloc (o, i - i0 +1); memcpy (tag->content->u.string, buf+i0, i - i0); tag->content->u.string[i-i0] = '\0'; } } return r;}static void retval_grs1 (zval *return_value, Z_GenericRecord *p){ Z_GenericRecord *grs[20]; int eno[20]; int level = 0; if (array_init(return_value) == FAILURE) { RETURN_FALSE; } eno[level] = 0; grs[level] = p; while (level >= 0) { zval *my_zval; Z_TaggedElement *e = 0; Z_GenericRecord *p = grs[level]; int i; char tag[256]; int taglen = 0; if (eno[level] >= p->num_elements) { --level; if (level >= 0) eno[level]++; continue; } /* eno[level]++; */ *tag = '\0'; for (i = 0; i<=level; i++) { int tag_type = 3; e = grs[i]->elements[eno[i]]; if (e->tagType) tag_type = *e->tagType; taglen = strlen(tag); sprintf (tag+taglen, "(%d,", tag_type); taglen = strlen(tag); if (e->tagValue->which == Z_StringOrNumeric_string) { int len = strlen(e->tagValue->u.string); memcpy (tag + taglen, e->tagValue->u.string, len); tag[taglen+len] = '\0'; } else if (e->tagValue->which == Z_StringOrNumeric_numeric) { sprintf (tag + taglen, "%d", *e->tagValue->u.numeric); } taglen = strlen(tag); strcpy (tag + taglen, ")"); } ALLOC_ZVAL(my_zval); array_init(my_zval); INIT_PZVAL(my_zval); add_next_index_string(my_zval, tag, 1); switch (e->content->which) { case Z_ElementData_string: add_next_index_string (my_zval, e->content->u.string, 1); break; case Z_ElementData_numeric: add_next_index_long (my_zval, *e->content->u.numeric); break; case Z_ElementData_trueOrFalse: add_next_index_long (my_zval, *e->content->u.trueOrFalse); break; case Z_ElementData_subtree: level++; grs[level] = e->content->u.subtree; eno[level] = -1; } zend_hash_next_index_insert (return_value->value.ht, (void *) &my_zval, sizeof(zval *), NULL); eno[level]++; }}/* {{{ proto string yaz_record(int id, int pos, string type) Return record information at given result set position */PHP_FUNCTION(yaz_record){ pval **pval_id, **pval_pos, **pval_type; Yaz_Association p; int pos; char *type; if (ZEND_NUM_ARGS() != 3) WRONG_PARAM_COUNT; if (zend_get_parameters_ex(3, &pval_id, &pval_pos, &pval_type) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, pval_id, &p); convert_to_long_ex(pval_pos); pos = (*pval_pos)->value.lval; convert_to_string_ex(pval_type); type = (*pval_type)->value.str.val; if (p && p->zoom_set) { ZOOM_record r = ZOOM_resultset_record (p->zoom_set, pos-1); if (!strcmp(type, "string")) type = "render"; if (r) { if (!strcmp (type, "array")) { Z_External *ext = (Z_External *) ZOOM_record_get (r, "ext", 0); if (ext) { oident *ent = oid_getentbyoid(ext->direct_reference); if (ext->which == Z_External_grs1 && ent->value == VAL_GRS1) { retval_grs1 (return_value, ext->u.grs1); } else if (ext->which == Z_External_octet) { char *buf = (char *) (ext->u.octet_aligned->buf); ODR odr = odr_createmem (ODR_DECODE); Z_GenericRecord *rec = 0; switch (ent->value) { case VAL_SOIF: case VAL_HTML: break; case VAL_TEXT_XML: case VAL_APPLICATION_XML: /* text2grs1 (&buf, &len, t->odr_in, 0, 0); */ break; default: rec = marc_to_grs1 (buf, odr); } if (rec) retval_grs1 (return_value, rec); odr_destroy (odr); } } } else { int rlen; const char *info = ZOOM_record_get (r, type, &rlen); return_value->value.str.len = (rlen > 0) ? rlen : 0; return_value->value.str.val = estrndup(info, return_value->value.str.len); return_value->type = IS_STRING; } } } release_assoc (p);}/* }}} *//* {{{ proto int yaz_syntax(int id, string syntax) Set record syntax for retrieval */PHP_FUNCTION(yaz_syntax){ pval **pval_id, **pval_syntax; Yaz_Association p; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pval_id, &pval_syntax) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, pval_id, &p); convert_to_string_ex (pval_syntax); option_set (p, "preferredRecordSyntax", (*pval_syntax)->value.str.val); release_assoc (p);}/* }}} *//* {{{ proto int yaz_element(int id, string elementsetname) Set Element-Set-Name for retrieval */PHP_FUNCTION(yaz_element){ pval **pval_id, **pval_element; Yaz_Association p; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pval_id, &pval_element) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, pval_id, &p); convert_to_string_ex (pval_element); option_set (p, "elementSetName", (*pval_element)->value.str.val); release_assoc (p);}/* }}} *//* {{{ proto int yaz_schema(int id, string schema) Set Schema for retrieval */PHP_FUNCTION(yaz_schema){ pval **pval_id, **pval_element; Yaz_Association p; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pval_id, &pval_element) == FAILURE) { WRONG_PARAM_COUNT; } get_assoc (INTERNAL_FUNCTION_PARAM_PASSTHRU, pval_id, &p); convert_to_string_ex (pval_element); option_set (p, "schema", (*pval_element)->value.str.val); release_assoc (p);}/* }}} *//* {{{ proto int yaz_range(int id, int start, int number) Set result set start point and number of records to request */PHP_FUNCTION(yaz_range){ pval **pval_id, **pval_start, **pval_number;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -