⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 php_yaz.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -