dmitry Tue Feb 10 08:41:22 2004 EDT
Modified files:
/php-src/ext/soap TODO php_encoding.c php_packet_soap.c
php_schema.c php_schema.h php_sdl.c php_sdl.h
php_soap.h soap.c
Log:
WSDL caching was implemented
http://cvs.php.net/diff.php/php-src/ext/soap/TODO?r1=1.40&r2=1.41&ty=u
Index: php-src/ext/soap/TODO
diff -u php-src/ext/soap/TODO:1.40 php-src/ext/soap/TODO:1.41
--- php-src/ext/soap/TODO:1.40 Thu Feb 5 15:26:02 2004
+++ php-src/ext/soap/TODO Tue Feb 10 08:41:21 2004
@@ -3,7 +3,7 @@
- make sure soapserver.map(), soap_encode_to_xml() and soap_encode_to_zval() are
really need
- reimplement SoapObject::__getfunctions() and SoapObject::__gettypes()
to return structures instead of strings
-- memory leaks (libxml and WSDL/Schema use malloc to cache WSDL)
+? memory leaks (libxml and WSDL/Schema use malloc to cache WSDL)
- error handling???
SOAP
@@ -57,7 +57,7 @@
- support for <opperation> <fault>
? server part support for "document" style encoding
- function/method overloading/redeclaration (test(int); test(string))
-- wsdl caching
++ wsdl caching
- wsdl auto generation
? SOAP binding
- <soap:body> parts attribute
http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.51&r2=1.52&ty=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.51 php-src/ext/soap/php_encoding.c:1.52
--- php-src/ext/soap/php_encoding.c:1.51 Fri Feb 6 09:22:33 2004
+++ php-src/ext/soap/php_encoding.c Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_encoding.c,v 1.51 2004/02/06 14:22:33 dmitry Exp $ */
+/* $Id: php_encoding.c,v 1.52 2004/02/10 13:41:21 dmitry Exp $ */
#include <time.h>
@@ -826,7 +826,7 @@
}
}
case XSD_CONTENT_GROUP:
- model_to_zval_object(ret, model->u.group, data, sdl TSRMLS_CC);
+ model_to_zval_object(ret, model->u.group->model, data, sdl
TSRMLS_CC);
default:
break;
}
@@ -1023,7 +1023,7 @@
return 0;
}
case XSD_CONTENT_GROUP: {
- return model_to_xml_object(node, model->u.group, prop, style,
model->min_occurs > 0);
+ return model_to_xml_object(node, model->u.group->model, prop,
style, model->min_occurs > 0);
}
default:
break;
@@ -1555,7 +1555,7 @@
int dimension = 1;
int* dims = NULL;
int* pos = NULL;
- xmlAttrPtr attr;
+ xmlAttrPtr attr;
sdlPtr sdl;
sdlAttributePtr *arrayType;
sdlExtraAttributePtr *ext;
http://cvs.php.net/diff.php/php-src/ext/soap/php_packet_soap.c?r1=1.32&r2=1.33&ty=u
Index: php-src/ext/soap/php_packet_soap.c
diff -u php-src/ext/soap/php_packet_soap.c:1.32 php-src/ext/soap/php_packet_soap.c:1.33
--- php-src/ext/soap/php_packet_soap.c:1.32 Thu Feb 5 04:28:09 2004
+++ php-src/ext/soap/php_packet_soap.c Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_packet_soap.c,v 1.32 2004/02/05 09:28:09 dmitry Exp $ */
+/* $Id: php_packet_soap.c,v 1.33 2004/02/10 13:41:21 dmitry Exp $ */
#include "php_soap.h"
@@ -240,63 +240,66 @@
char *name, *ns = NULL;
zval* tmp;
sdlSoapBindingFunctionPtr fnb =
(sdlSoapBindingFunctionPtr)fn->bindingAttributes;
- int res_count = zend_hash_num_elements(fn->responseParameters);
+ int res_count;
hdrs = fnb->output.headers;
- zend_hash_internal_pointer_reset(fn->responseParameters);
- while (zend_hash_get_current_data(fn->responseParameters,
(void **)&h_param) == SUCCESS) {
- param = (*h_param);
- if (fnb->style == SOAP_DOCUMENT) {
- name = param->encode->details.type_str;
- ns = param->encode->details.ns;
- } else {
- name = fn->responseName;
- /* ns = ? */
- }
-
- /* Get value of parameter */
- cur = get_node_ex(resp, name, ns);
- if (!cur) {
- cur = get_node(resp, name);
- /* TODO: produce warning invalid ns */
- }
- if (cur) {
+ if (fn->responseParameters) {
+ res_count = zend_hash_num_elements(fn->responseParameters);
+
zend_hash_internal_pointer_reset(fn->responseParameters);
+ while
(zend_hash_get_current_data(fn->responseParameters, (void **)&h_param) == SUCCESS) {
+ param = (*h_param);
if (fnb->style == SOAP_DOCUMENT) {
- val = cur;
+ name = param->encode->details.type_str;
+ ns = param->encode->details.ns;
} else {
- val = get_node(cur->children,
param->paramName);
- if (val == NULL && res_count == 1) {
- val = get_node(cur->children,
"return");
- }
- if (val == NULL && res_count == 1) {
- val = get_node(cur->children,
"result");
+ name = fn->responseName;
+ /* ns = ? */
+ }
+
+ /* Get value of parameter */
+ cur = get_node_ex(resp, name, ns);
+ if (!cur) {
+ cur = get_node(resp, name);
+ /* TODO: produce warning invalid ns */
+ }
+ if (cur) {
+ if (fnb->style == SOAP_DOCUMENT) {
+ val = cur;
+ } else {
+ val = get_node(cur->children,
param->paramName);
+ if (val == NULL && res_count
== 1) {
+ val =
get_node(cur->children, "return");
+ }
+ if (val == NULL && res_count
== 1) {
+ val =
get_node(cur->children, "result");
+ }
}
}
- }
- if (!val) {
- /* TODO: may be "nil" is not OK? */
- MAKE_STD_ZVAL(tmp);
- ZVAL_NULL(tmp);
+ if (!val) {
+ /* TODO: may be "nil" is not OK? */
+ MAKE_STD_ZVAL(tmp);
+ ZVAL_NULL(tmp);
/*
- add_soap_fault(this_ptr, "Client", "Can't find
response data", NULL, NULL TSRMLS_CC);
- xmlFreeDoc(response);
- return FALSE;
+ add_soap_fault(this_ptr, "Client",
"Can't find response data", NULL, NULL TSRMLS_CC);
+ xmlFreeDoc(response);
+ return FALSE;
*/
- } else {
- /* Decoding value of parameter */
- if (param != NULL) {
- tmp = master_to_zval(param->encode,
val);
} else {
- tmp = master_to_zval(NULL, val);
+ /* Decoding value of parameter */
+ if (param != NULL) {
+ tmp =
master_to_zval(param->encode, val);
+ } else {
+ tmp = master_to_zval(NULL,
val);
+ }
}
- }
- add_assoc_zval(return_value, param->paramName, tmp);
+ add_assoc_zval(return_value, param->paramName,
tmp);
- param_count++;
+ param_count++;
- zend_hash_move_forward(fn->responseParameters);
+ zend_hash_move_forward(fn->responseParameters);
+ }
}
} else {
/* Function hasn't WSDL description */
http://cvs.php.net/diff.php/php-src/ext/soap/php_schema.c?r1=1.40&r2=1.41&ty=u
Index: php-src/ext/soap/php_schema.c
diff -u php-src/ext/soap/php_schema.c:1.40 php-src/ext/soap/php_schema.c:1.41
--- php-src/ext/soap/php_schema.c:1.40 Fri Feb 6 11:52:14 2004
+++ php-src/ext/soap/php_schema.c Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_schema.c,v 1.40 2004/02/06 16:52:14 dmitry Exp $ */
+/* $Id: php_schema.c,v 1.41 2004/02/10 13:41:21 dmitry Exp $ */
#include "php_soap.h"
#include "libxml/uri.h"
@@ -46,13 +46,6 @@
static void schema_type_fixup(sdlCtx *ctx, sdlTypePtr type);
-static void delete_model(void *handle);
-static void delete_type(void *data);
-static void delete_extra_attribute(void *attribute);
-static void delete_attribute(void *attribute);
-static void delete_restriction_var_int(void *rvi);
-static void delete_schema_restriction_var_char(void *srvc);
-
static encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const char *ns,
const char *type)
{
smart_str nscat = {0};
@@ -697,7 +690,7 @@
schema_restriction_var_char(trav, &enumval);
if (cur_type->restrictions->enumeration == NULL) {
cur_type->restrictions->enumeration =
sdl_malloc(sizeof(HashTable));
- zend_hash_init(cur_type->restrictions->enumeration, 0,
NULL, delete_schema_restriction_var_char, SDL_PERSISTENT);
+ zend_hash_init(cur_type->restrictions->enumeration, 0,
NULL, delete_restriction_var_char, SDL_PERSISTENT);
}
zend_hash_add(cur_type->restrictions->enumeration,
enumval->value, strlen(enumval->value)+1, &enumval, sizeof(sdlRestrictionCharPtr),
NULL);
} else {
@@ -2113,7 +2106,7 @@
schema_type_fixup(ctx,*tmp);
efree(model->u.group_ref);
model->kind = XSD_CONTENT_GROUP;
- model->u.group = (*tmp)->model;
+ model->u.group = (*tmp);
} else {
php_error(E_ERROR, "SOAP-ERROR: Parsing Schema:
unresolved group 'ref' attribute");
}
@@ -2231,7 +2224,7 @@
}
}
-static void delete_model(void *handle)
+void delete_model(void *handle)
{
sdlContentModelPtr tmp = *((sdlContentModelPtr*)handle);
switch (tmp->kind) {
@@ -2251,7 +2244,7 @@
sdl_free(tmp);
}
-static void delete_type(void *data)
+void delete_type(void *data)
{
sdlTypePtr type = *((sdlTypePtr*)data);
if (type->name) {
@@ -2287,8 +2280,8 @@
delete_restriction_var_int(&type->restrictions->length);
delete_restriction_var_int(&type->restrictions->minLength);
delete_restriction_var_int(&type->restrictions->maxLength);
- delete_schema_restriction_var_char(&type->restrictions->whiteSpace);
- delete_schema_restriction_var_char(&type->restrictions->pattern);
+ delete_restriction_var_char(&type->restrictions->whiteSpace);
+ delete_restriction_var_char(&type->restrictions->pattern);
if (type->restrictions->enumeration) {
zend_hash_destroy(type->restrictions->enumeration);
sdl_free(type->restrictions->enumeration);
@@ -2298,7 +2291,7 @@
sdl_free(type);
}
-static void delete_extra_attribute(void *attribute)
+void delete_extra_attribute(void *attribute)
{
sdlExtraAttributePtr attr = *((sdlExtraAttributePtr*)attribute);
@@ -2311,7 +2304,7 @@
sdl_free(attr);
}
-static void delete_attribute(void *attribute)
+void delete_attribute(void *attribute)
{
sdlAttributePtr attr = *((sdlAttributePtr*)attribute);
@@ -2334,7 +2327,7 @@
sdl_free(attr);
}
-static void delete_restriction_var_int(void *rvi)
+void delete_restriction_var_int(void *rvi)
{
sdlRestrictionIntPtr ptr = *((sdlRestrictionIntPtr*)rvi);
if (ptr) {
@@ -2342,7 +2335,7 @@
}
}
-static void delete_schema_restriction_var_char(void *srvc)
+void delete_restriction_var_char(void *srvc)
{
sdlRestrictionCharPtr ptr = *((sdlRestrictionCharPtr*)srvc);
if (ptr) {
http://cvs.php.net/diff.php/php-src/ext/soap/php_schema.h?r1=1.10&r2=1.11&ty=u
Index: php-src/ext/soap/php_schema.h
diff -u php-src/ext/soap/php_schema.h:1.10 php-src/ext/soap/php_schema.h:1.11
--- php-src/ext/soap/php_schema.h:1.10 Fri Feb 6 06:56:03 2004
+++ php-src/ext/soap/php_schema.h Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_schema.h,v 1.10 2004/02/06 11:56:03 dmitry Exp $ */
+/* $Id: php_schema.h,v 1.11 2004/02/10 13:41:21 dmitry Exp $ */
#ifndef PHP_SCHEMA_H
#define PHP_SCHEMA_H
@@ -25,4 +25,10 @@
int load_schema(sdlCtx *ctx, xmlNodePtr schema);
void schema_pass2(sdlCtx *ctx);
+void delete_model(void *handle);
+void delete_type(void *data);
+void delete_extra_attribute(void *attribute);
+void delete_attribute(void *attribute);
+void delete_restriction_var_int(void *rvi);
+void delete_restriction_var_char(void *srvc);
#endif
http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.c?r1=1.53&r2=1.54&ty=u
Index: php-src/ext/soap/php_sdl.c
diff -u php-src/ext/soap/php_sdl.c:1.53 php-src/ext/soap/php_sdl.c:1.54
--- php-src/ext/soap/php_sdl.c:1.53 Fri Feb 6 11:54:34 2004
+++ php-src/ext/soap/php_sdl.c Tue Feb 10 08:41:21 2004
@@ -17,14 +17,25 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_sdl.c,v 1.53 2004/02/06 16:54:34 dmitry Exp $ */
+/* $Id: php_sdl.c,v 1.54 2004/02/10 13:41:21 dmitry Exp $ */
#include "php_soap.h"
#include "libxml/uri.h"
+#include "ext/standard/md5.h"
+#include "tsrm_virtual_cwd.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
static void delete_binding(void *binding);
static void delete_function(void *function);
-static void delete_paramater(void *paramater);
+static void delete_parameter(void *paramater);
static void delete_header(void *header);
static void delete_document(void *doc_ptr);
@@ -149,8 +160,6 @@
return;
}
- /* TODO: WSDL Caching */
-
wsdl = soap_xmlParseFile(struri);
if (!wsdl) {
@@ -403,7 +412,7 @@
message = *tmp;
parameters = sdl_malloc(sizeof(HashTable));
- zend_hash_init(parameters, 0, NULL, delete_paramater, SDL_PERSISTENT);
+ zend_hash_init(parameters, 0, NULL, delete_parameter, SDL_PERSISTENT);
trav = message->children;
FOREACHNODE(trav, "part", part) {
@@ -751,7 +760,1059 @@
return ctx.sdl;
}
-sdlPtr get_sdl(char *uri)
+#define WSDL_CACHE_VERSION 01
+
+#define WSDL_CACHE_GET(ret,type,buf) memcpy(&ret,*buf,sizeof(type)); *buf +=
sizeof(type);
+#define WSDL_CACHE_GET_INT(ret,buf) ret =
((int)(*buf)[0])+((int)(*buf)[1]<<8)+((int)(*buf)[2]<<16)+((int)(*buf)[3]<<24); *buf
+= 4;
+#define WSDL_CACHE_GET_1(ret,type,buf) ret = (type)(**buf); (*buf)++;
+#define WSDL_CACHE_GET_N(ret,n,buf) memcpy(ret,*buf,n); *buf += n;
+#define WSDL_CACHE_SKIP(n,buf) *buf += n;
+
+#define WSDL_CACHE_PUT_INT(val,buf) smart_str_appendc(buf,val & 0xff); \
+ smart_str_appendc(buf,(val >> 8) & 0xff); \
+ smart_str_appendc(buf,(val >> 16) & 0xff); \
+ smart_str_appendc(buf,(val >> 24) & 0xff);
+#define WSDL_CACHE_PUT_1(val,buf) smart_str_appendc(buf,val);
+#define WSDL_CACHE_PUT_N(val,n,buf) smart_str_appendl(buf,(char*)val,n);
+
+static char* sdl_deserialize_string(char **in)
+{
+ char *s;
+ int len;
+
+ WSDL_CACHE_GET_INT(len, in);
+ if (len == 0) {
+ return NULL;
+ } else {
+ s = sdl_malloc(len+1);
+ WSDL_CACHE_GET_N(s, len, in);
+ s[len] = '\0';
+ return s;
+ }
+}
+
+static void sdl_deserialize_key(HashTable* ht, void* data, char **in)
+{
+ int len;
+
+ WSDL_CACHE_GET_INT(len, in);
+ if (len == 0) {
+ zend_hash_next_index_insert(ht, &data, sizeof(void*), NULL);
+ } else {
+ zend_hash_add(ht, *in, len, &data, sizeof(void*), NULL);
+ WSDL_CACHE_SKIP(len, in);
+ }
+}
+
+static void sdl_deserialize_attribute(sdlAttributePtr attr, encodePtr *encoders, char
**in)
+{
+ int i;
+
+ attr->name = sdl_deserialize_string(in);
+ attr->ref = sdl_deserialize_string(in);
+ attr->def = sdl_deserialize_string(in);
+ attr->fixed = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_1(attr->form, sdlForm, in);
+ WSDL_CACHE_GET_1(attr->use, sdlUse, in);
+ WSDL_CACHE_GET_INT(i, in);
+ attr->encode = encoders[i];
+ WSDL_CACHE_GET_INT(i, in);
+ if (i > 0) {
+ attr->extraAttributes = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(attr->extraAttributes, i, NULL, delete_extra_attribute,
SDL_PERSISTENT);
+ while (i > 0) {
+ sdlExtraAttributePtr x = sdl_malloc(sizeof(sdlExtraAttribute));
+ sdl_deserialize_key(attr->extraAttributes, x, in);
+ x->ns = sdl_deserialize_string(in);
+ x->val = sdl_deserialize_string(in);
+ --i;
+ }
+ }
+}
+
+static sdlRestrictionIntPtr sdl_deserialize_resriction_int(char **in)
+{
+ if (**in == 1) {
+ sdlRestrictionIntPtr x = sdl_malloc(sizeof(sdlRestrictionInt));
+ WSDL_CACHE_SKIP(1, in);
+ WSDL_CACHE_GET_INT(x->value, in);
+ WSDL_CACHE_GET_1(x->fixed, char, in);
+ return x;
+ } else {
+ WSDL_CACHE_SKIP(1, in);
+ return NULL;
+ }
+}
+
+static sdlRestrictionCharPtr sdl_deserialize_resriction_char(char **in)
+{
+ if (**in == 1) {
+ sdlRestrictionCharPtr x = sdl_malloc(sizeof(sdlRestrictionChar));
+ WSDL_CACHE_SKIP(1, in);
+ x->value = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_1(x->fixed, char, in);
+ return x;
+ } else {
+ WSDL_CACHE_SKIP(1, in);
+ return NULL;
+ }
+}
+
+static sdlContentModelPtr sdl_deserialize_model(sdlTypePtr *types, sdlTypePtr
*elements, char **in)
+{
+ int i;
+ sdlContentModelPtr model = sdl_malloc(sizeof(sdlContentModel));
+
+ WSDL_CACHE_GET_1(model->kind, sdlContentKind, in);
+ WSDL_CACHE_GET_INT(model->min_occurs, in);
+ WSDL_CACHE_GET_INT(model->max_occurs, in);
+ switch (model->kind) {
+ case XSD_CONTENT_ELEMENT:
+ WSDL_CACHE_GET_INT(i, in);
+ model->u.element = elements[i];
+ break;
+ case XSD_CONTENT_SEQUENCE:
+ case XSD_CONTENT_ALL:
+ case XSD_CONTENT_CHOICE:
+ WSDL_CACHE_GET_INT(i, in);
+ if (i > 0) {
+ model->u.content = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(model->u.content, i, NULL,
delete_model, SDL_PERSISTENT);
+ while (i > 0) {
+ sdlContentModelPtr x =
sdl_deserialize_model(types, elements, in);
+
zend_hash_next_index_insert(model->u.content,&x,sizeof(sdlContentModelPtr),NULL);
+ i--;
+ }
+ }
+ break;
+ case XSD_CONTENT_GROUP_REF:
+ model->u.group_ref = sdl_deserialize_string(in);
+ break;
+ case XSD_CONTENT_GROUP:
+ WSDL_CACHE_GET_INT(i, in);
+ model->u.group = types[i];
+ break;
+ default:
+ break;
+ }
+ return model;
+}
+
+static void sdl_deserialize_type(sdlTypePtr type, sdlTypePtr *types, encodePtr
*encoders, char **in)
+{
+ int i;
+ sdlTypePtr *elements = NULL;
+
+ WSDL_CACHE_GET_1(type->kind, sdlTypeKind, in);
+ type->name = sdl_deserialize_string(in);
+ type->namens = sdl_deserialize_string(in);
+ type->def = sdl_deserialize_string(in);
+ type->fixed = sdl_deserialize_string(in);
+ type->ref = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_1(type->nillable, char, in);
+
+ WSDL_CACHE_GET_INT(i, in);
+ type->encode = encoders[i];
+
+ if (**in == 1) {
+ WSDL_CACHE_SKIP(1, in);
+ type->restrictions = sdl_malloc(sizeof(sdlRestrictions));
+ /*memset(type->restrictions, 0, sizeof(sdlRestrictions));*/
+ type->restrictions->minExclusive = sdl_deserialize_resriction_int(in);
+ type->restrictions->minInclusive = sdl_deserialize_resriction_int(in);
+ type->restrictions->maxExclusive = sdl_deserialize_resriction_int(in);
+ type->restrictions->maxInclusive = sdl_deserialize_resriction_int(in);
+ type->restrictions->totalDigits = sdl_deserialize_resriction_int(in);
+ type->restrictions->fractionDigits =
sdl_deserialize_resriction_int(in);
+ type->restrictions->length = sdl_deserialize_resriction_int(in);
+ type->restrictions->minLength = sdl_deserialize_resriction_int(in);
+ type->restrictions->maxLength = sdl_deserialize_resriction_int(in);
+ type->restrictions->whiteSpace = sdl_deserialize_resriction_char(in);
+ type->restrictions->pattern = sdl_deserialize_resriction_char(in);
+ WSDL_CACHE_GET_INT(i, in);
+ if (i > 0) {
+ type->restrictions->enumeration =
sdl_malloc(sizeof(HashTable));
+ zend_hash_init(type->restrictions->enumeration, i, NULL,
delete_restriction_var_char, SDL_PERSISTENT);
+ while (i > 0) {
+ sdlRestrictionCharPtr x =
sdl_deserialize_resriction_char(in);
+ sdl_deserialize_key(type->restrictions->enumeration,
x, in);
+ --i;
+ }
+ } else {
+ type->restrictions->enumeration = NULL;
+ }
+ } else {
+ WSDL_CACHE_SKIP(1, in);
+ }
+
+ WSDL_CACHE_GET_INT(i, in);
+ if (i > 0) {
+ elements = do_alloca((i+1) * sizeof(sdlTypePtr));
+ elements[0] = NULL;
+ type->elements = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(type->elements, i, NULL, delete_type, SDL_PERSISTENT);
+ while (i > 0) {
+ sdlTypePtr t = sdl_malloc(sizeof(sdlType));
+ memset(t, 0, sizeof(sdlType));
+ sdl_deserialize_key(type->elements, t, in);
+ sdl_deserialize_type(t, types, encoders, in);
+ elements[i] = t;
+ --i;
+ }
+ }
+
+ WSDL_CACHE_GET_INT(i, in);
+ if (i > 0) {
+ type->attributes = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(type->attributes, i, NULL, delete_attribute,
SDL_PERSISTENT);
+ while (i > 0) {
+ sdlAttributePtr attr = sdl_malloc(sizeof(sdlAttribute));
+ memset(attr, 0, sizeof(sdlAttribute));
+ sdl_deserialize_key(type->attributes, attr, in);
+ sdl_deserialize_attribute(attr, encoders, in);
+ --i;
+ }
+ }
+
+ if (**in != 0) {
+ WSDL_CACHE_SKIP(1, in);
+ type->model = sdl_deserialize_model(types, elements, in);
+ } else {
+ WSDL_CACHE_SKIP(1, in);
+ }
+ if (elements != NULL) {
+ free_alloca(elements);
+ }
+}
+
+static void sdl_deserialize_encoder(encodePtr enc, sdlTypePtr *types, char **in)
+{
+ int i;
+
+ WSDL_CACHE_GET_INT(enc->details.type, in);
+ enc->details.type_str = sdl_deserialize_string(in);
+ enc->details.ns = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_INT(i, in);
+ enc->details.sdl_type = types[i];
+ enc->to_xml = sdl_guess_convert_xml;
+ enc->to_zval = sdl_guess_convert_zval;
+}
+
+static void sdl_deserialize_soap_body(sdlSoapBindingFunctionBodyPtr body, encodePtr
*encoders, sdlTypePtr *types, char **in)
+{
+ int i, n;
+
+ WSDL_CACHE_GET_1(body->use, sdlEncodingUse, in);
+ body->ns = sdl_deserialize_string(in);
+ body->parts = sdl_deserialize_string(in);
+ body->encodingStyle = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_INT(i, in);
+ if (i > 0) {
+ body->headers = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(body->headers, i, NULL, delete_header, SDL_PERSISTENT);
+ while (i > 0) {
+ sdlSoapBindingFunctionHeaderPtr tmp =
sdl_malloc(sizeof(sdlSoapBindingFunctionHeader));
+ sdl_deserialize_key(body->headers, tmp, in);
+ WSDL_CACHE_GET_1(tmp->use, sdlEncodingUse, in);
+ tmp->name = sdl_deserialize_string(in);
+ tmp->ns = sdl_deserialize_string(in);
+ tmp->encodingStyle = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_INT(n, in);
+ tmp->encode = encoders[n];
+ WSDL_CACHE_GET_INT(n, in);
+ tmp->element = types[n];
+ --i;
+ }
+ }
+}
+
+static HashTable* sdl_deserialize_parameters(encodePtr *encoders, sdlTypePtr *types,
char **in)
+{
+ int i, n;
+ HashTable *ht;
+
+ WSDL_CACHE_GET_INT(i, in);
+ if (i == 0) {return NULL;}
+ ht = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(ht, i, NULL, delete_parameter, SDL_PERSISTENT);
+ while (i > 0) {
+ sdlParamPtr param = sdl_malloc(sizeof(sdlParam));
+ sdl_deserialize_key(ht, param, in);
+ param->paramName = sdl_deserialize_string(in);
+ WSDL_CACHE_GET_INT(param->order, in);
+ WSDL_CACHE_GET_INT(n, in);
+ param->encode = encoders[n];
+ WSDL_CACHE_GET_INT(n, in);
+ param->element = types[n];
+ --i;
+ }
+ return ht;
+}
+
+static sdlPtr get_sdl_from_cache(const char *fn, const char *uri, time_t t)
+{
+ sdlPtr sdl;
+ time_t old_t;
+ int i, num_groups, num_types, num_elements, num_encoders, num_bindings,
num_func;
+ sdlFunctionPtr *functions;
+ sdlBindingPtr *bindings;
+ sdlTypePtr *types;
+ encodePtr *encoders;
+ encodePtr enc;
+
+ int f;
+ struct stat st;
+ char *in, *buf;
+
+ f = open(fn, O_RDONLY|O_BINARY);
+ if (f < 0) {
+ return NULL;
+ }
+ if (fstat(f, &st) != 0) {
+ close(f);
+ return NULL;
+ }
+ buf = in = do_alloca(st.st_size);
+ if (read(f, in, st.st_size) != st.st_size) {
+ close(f);
+ free_alloca(in);
+ return NULL;
+ }
+ close(f);
+
+ if (strncmp(in,"wsdl",4) != 0 || in[4] != WSDL_CACHE_VERSION || in[5] != '\0')
{
+ unlink(fn);
+ free_alloca(buf);
+ return NULL;
+ }
+ in += 6;
+
+ WSDL_CACHE_GET(old_t, time_t, &in);
+ if (old_t < t) {
+ unlink(fn);
+ free_alloca(buf);
+ return NULL;
+ }
+
+ WSDL_CACHE_GET_INT(i, &in);
+ if (i == 0 && strncmp(in, uri, i) != 0) {
+ unlink(fn);
+ free_alloca(buf);
+ return NULL;
+ }
+ WSDL_CACHE_SKIP(i, &in);
+
+ sdl = sdl_malloc(sizeof(*sdl));
+ memset(sdl, 0, sizeof(*sdl));
+
+ sdl->source = sdl_deserialize_string(&in);
+ sdl->target_ns = sdl_deserialize_string(&in);
+
+ WSDL_CACHE_GET_INT(num_groups, &in);
+ WSDL_CACHE_GET_INT(num_types, &in);
+ WSDL_CACHE_GET_INT(num_elements, &in);
+ WSDL_CACHE_GET_INT(num_encoders, &in);
+
+ i = num_groups+num_types+num_elements;
+ types = do_alloca((i+1)*sizeof(sdlTypePtr));
+ types[0] = NULL;
+ while (i > 0) {
+ types[i] = sdl_malloc(sizeof(sdlType));
+ memset(types[i], 0, sizeof(sdlType));
+ i--;
+ }
+
+ i = num_encoders;
+ enc = defaultEncoding;
+ while (enc->details.type != END_KNOWN_TYPES) {
+ i++; enc++;
+ }
+ encoders = do_alloca((i+1)*sizeof(encodePtr));
+ i = num_encoders;
+ encoders[0] = NULL;
+ while (i > 0) {
+ encoders[i] = sdl_malloc(sizeof(encode));
+ memset(encoders[i], 0, sizeof(encode));
+ i--;
+ }
+ i = num_encoders;
+ enc = defaultEncoding;
+ while (enc->details.type != END_KNOWN_TYPES) {
+ encoders[++i] = enc++;
+ }
+
+ i = 1;
+ if (num_groups > 0) {
+ sdl->groups = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(sdl->groups, num_groups, NULL, delete_type,
SDL_PERSISTENT);
+ while (i < num_groups+1) {
+ sdl_deserialize_key(sdl->groups, types[i], &in);
+ sdl_deserialize_type(types[i], types, encoders, &in);
+ i++;
+ }
+ }
+
+ if (num_types > 0) {
+ sdl->types = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(sdl->types, num_types, NULL, delete_type,
SDL_PERSISTENT);
+ while (i < num_groups+num_types+1) {
+ sdl_deserialize_key(sdl->types, types[i], &in);
+ sdl_deserialize_type(types[i], types, encoders, &in);
+ i++;
+ }
+ }
+
+ if (num_elements > 0) {
+ sdl->elements = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(sdl->elements, num_elements, NULL, delete_type,
SDL_PERSISTENT);
+ while (i < num_groups+num_types+num_elements+1) {
+ sdl_deserialize_key(sdl->elements, types[i], &in);
+ sdl_deserialize_type(types[i], types, encoders, &in);
+ i++;
+ }
+ }
+
+ i = 1;
+ if (num_encoders > 0) {
+ sdl->encoders = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(sdl->encoders, num_encoders, NULL, delete_encoder,
SDL_PERSISTENT);
+ while (i < num_encoders+1) {
+ sdl_deserialize_key(sdl->encoders, encoders[i], &in);
+ sdl_deserialize_encoder(encoders[i], types, &in);
+ i++;
+ }
+ }
+
+ /* deserialize bindings */
+ WSDL_CACHE_GET_INT(num_bindings, &in);
+ bindings = do_alloca(num_bindings*sizeof(sdlBindingPtr));
+ if (num_bindings > 0) {
+ sdl->bindings = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(sdl->bindings, num_bindings, NULL, delete_binding,
SDL_PERSISTENT);
+ for (i = 0; i < num_bindings; i++) {
+ sdlBindingPtr binding = sdl_malloc(sizeof(sdlBinding));
+ memset(binding, 0, sizeof(sdlBinding));
+ sdl_deserialize_key(sdl->bindings, binding, &in);
+ binding->name = sdl_deserialize_string(&in);
+ binding->location = sdl_deserialize_string(&in);
+ WSDL_CACHE_GET_1(binding->bindingType,sdlBindingType,&in);
+ if (binding->bindingType == BINDING_SOAP) {
+ if (*in != 0) {
+ sdlSoapBindingPtr soap_binding =
binding->bindingAttributes = sdl_malloc(sizeof(sdlSoapBinding));
+
WSDL_CACHE_GET_1(soap_binding->style,sdlEncodingStyle,&in);
+ soap_binding->transport =
sdl_deserialize_string(&in);
+ } else {
+ WSDL_CACHE_SKIP(1,&in);
+ }
+ }
+ bindings[i] = binding;
+ }
+ }
+
+ /* deserialize functions */
+ WSDL_CACHE_GET_INT(num_func, &in);
+ zend_hash_init(&sdl->functions, num_func, NULL, delete_function,
SDL_PERSISTENT);
+ functions = do_alloca(num_func*sizeof(sdlFunctionPtr));
+ for (i = 0; i < num_func; i++) {
+ int binding_num;
+ sdlFunctionPtr func = sdl_malloc(sizeof(sdlFunction));
+ sdl_deserialize_key(&sdl->functions, func, &in);
+ func->functionName = sdl_deserialize_string(&in);
+ func->requestName = sdl_deserialize_string(&in);
+ func->responseName = sdl_deserialize_string(&in);
+
+ WSDL_CACHE_GET_INT(binding_num, &in);
+ if (binding_num == 0) {
+ func->binding = NULL;
+ } else {
+ func->binding = bindings[binding_num-1];
+ }
+ if (func->binding && func->binding->bindingType == BINDING_SOAP) {
+ if (*in != 0) {
+ sdlSoapBindingFunctionPtr binding =
func->bindingAttributes = sdl_malloc(sizeof(sdlSoapBindingFunction));
+ memset(binding, 0, sizeof(sdlSoapBindingFunction));
+ WSDL_CACHE_GET_1(binding->style,sdlEncodingStyle,&in);
+ binding->soapAction = sdl_deserialize_string(&in);
+ sdl_deserialize_soap_body(&binding->input, encoders,
types, &in);
+ sdl_deserialize_soap_body(&binding->output, encoders,
types, &in);
+ /*sdl_deserialize_soap_body(&binding->fault, encoders,
types, &in);*/
+ } else {
+ WSDL_CACHE_SKIP(1, &in);
+ }
+ }
+
+ func->requestParameters = sdl_deserialize_parameters(encoders, types,
&in);
+ func->responseParameters = sdl_deserialize_parameters(encoders, types,
&in);
+ functions[i] = func;
+ }
+
+ /* deserialize requests */
+ WSDL_CACHE_GET_INT(i, &in);
+ if (i > 0) {
+ sdl->requests = sdl_malloc(sizeof(HashTable));
+ zend_hash_init(sdl->requests, i, NULL, NULL, SDL_PERSISTENT);
+ while (i > 0) {
+ int function_num;
+
+ WSDL_CACHE_GET_INT(function_num, &in);
+ sdl_deserialize_key(sdl->requests, functions[function_num],
&in);
+ i--;
+ }
+ }
+
+ free_alloca(functions);
+ free_alloca(bindings);
+ free_alloca(encoders);
+ free_alloca(types);
+ free_alloca(buf);
+ return sdl;
+}
+
+static void sdl_serialize_string(const char *str, smart_str *out)
+{
+ int i;
+
+ if (str) {
+ i = strlen(str);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ WSDL_CACHE_PUT_N(str, i, out);
+ }
+}
+
+static void sdl_serialize_key(HashTable *ht, smart_str *out)
+{
+ char *key;
+ uint key_len;
+ ulong index;
+
+ if (zend_hash_get_current_key_ex(ht, &key, &key_len, &index, 0, NULL) ==
HASH_KEY_IS_STRING) {
+ WSDL_CACHE_PUT_INT(key_len, out);
+ WSDL_CACHE_PUT_N(key, key_len, out);
+ } else {
+ WSDL_CACHE_PUT_INT(0, out);
+ }
+}
+
+static void sdl_serialize_encoder_ref(encodePtr enc, HashTable *tmp_encoders,
smart_str *out) {
+ if (enc) {
+ int *encoder_num;
+ if (zend_hash_find(tmp_encoders, (char*)&enc, sizeof(enc),
(void**)&encoder_num) == SUCCESS) {
+ WSDL_CACHE_PUT_INT(*encoder_num, out);
+ } else {
+ WSDL_CACHE_PUT_INT(0, out);
+ }
+ } else {
+ WSDL_CACHE_PUT_INT(0, out);
+ }
+}
+
+static void sdl_serialize_type_ref(sdlTypePtr type, HashTable *tmp_types, smart_str
*out) {
+ if (type) {
+ int *type_num;
+ if (zend_hash_find(tmp_types, (char*)&type, sizeof(type),
(void**)&type_num) == SUCCESS) {
+ WSDL_CACHE_PUT_INT(*type_num, out);
+ } else {
+ WSDL_CACHE_PUT_INT(0, out);
+ }
+ } else {
+ WSDL_CACHE_PUT_INT(0,out);
+ }
+}
+
+static void sdl_serialize_attribute(sdlAttributePtr attr, HashTable *tmp_encoders,
smart_str *out)
+{
+ int i;
+
+ sdl_serialize_string(attr->name, out);
+ sdl_serialize_string(attr->ref, out);
+ sdl_serialize_string(attr->def, out);
+ sdl_serialize_string(attr->fixed, out);
+ WSDL_CACHE_PUT_1(attr->form, out);
+ WSDL_CACHE_PUT_1(attr->use, out);
+ sdl_serialize_encoder_ref(attr->encode, tmp_encoders, out);
+ if (attr->extraAttributes) {
+ i = zend_hash_num_elements(attr->extraAttributes);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlExtraAttributePtr *tmp;
+ zend_hash_internal_pointer_reset(attr->extraAttributes);
+ while (zend_hash_get_current_data(attr->extraAttributes, (void**)&tmp)
== SUCCESS) {
+ sdl_serialize_key(attr->extraAttributes, out);
+ sdl_serialize_string((*tmp)->ns, out);
+ sdl_serialize_string((*tmp)->val, out);
+ zend_hash_move_forward(attr->extraAttributes);
+ }
+ }
+}
+
+static void sdl_serialize_model(sdlContentModelPtr model, HashTable *tmp_types,
HashTable *tmp_elements, smart_str *out)
+{
+ WSDL_CACHE_PUT_1(model->kind, out);
+ WSDL_CACHE_PUT_INT(model->min_occurs, out);
+ WSDL_CACHE_PUT_INT(model->max_occurs, out);
+ switch (model->kind) {
+ case XSD_CONTENT_ELEMENT:
+ sdl_serialize_type_ref(model->u.element, tmp_elements, out);
+ break;
+ case XSD_CONTENT_SEQUENCE:
+ case XSD_CONTENT_ALL:
+ case XSD_CONTENT_CHOICE: {
+ sdlContentModelPtr *tmp;
+ int i = zend_hash_num_elements(model->u.content);
+
+ WSDL_CACHE_PUT_INT(i, out);
+ zend_hash_internal_pointer_reset(model->u.content);
+ while (zend_hash_get_current_data(model->u.content,
(void**)&tmp) == SUCCESS) {
+ sdl_serialize_model(*tmp, tmp_types,
tmp_elements, out);
+ zend_hash_move_forward(model->u.content);
+ }
+ }
+ break;
+ case XSD_CONTENT_GROUP_REF:
+ sdl_serialize_string(model->u.group_ref,out);
+ break;
+ case XSD_CONTENT_GROUP:
+ sdl_serialize_type_ref(model->u.group, tmp_types, out);
+ break;
+ default:
+ break;
+ }
+}
+
+static void sdl_serialize_resriction_int(sdlRestrictionIntPtr x, smart_str *out)
+{
+ if (x) {
+ WSDL_CACHE_PUT_1(1, out);
+ WSDL_CACHE_PUT_INT(x->value, out);
+ WSDL_CACHE_PUT_1(x->fixed, out);
+ } else {
+ WSDL_CACHE_PUT_1(0, out);
+ }
+}
+
+static void sdl_serialize_resriction_char(sdlRestrictionCharPtr x, smart_str *out)
+{
+ if (x) {
+ WSDL_CACHE_PUT_1(1, out);
+ sdl_serialize_string(x->value, out);
+ WSDL_CACHE_PUT_1(x->fixed, out);
+ } else {
+ WSDL_CACHE_PUT_1(0, out);
+ }
+}
+
+static void sdl_serialize_type(sdlTypePtr type, HashTable *tmp_encoders, HashTable
*tmp_types, smart_str *out)
+{
+ int i;
+ HashTable *tmp_elements = NULL;
+
+ WSDL_CACHE_PUT_1(type->kind, out);
+ sdl_serialize_string(type->name, out);
+ sdl_serialize_string(type->namens, out);
+ sdl_serialize_string(type->def, out);
+ sdl_serialize_string(type->fixed, out);
+ sdl_serialize_string(type->ref, out);
+ WSDL_CACHE_PUT_1(type->nillable, out);
+ sdl_serialize_encoder_ref(type->encode, tmp_encoders, out);
+
+ if (type->restrictions) {
+ WSDL_CACHE_PUT_1(1, out);
+ sdl_serialize_resriction_int(type->restrictions->minExclusive,out);
+ sdl_serialize_resriction_int(type->restrictions->minInclusive,out);
+ sdl_serialize_resriction_int(type->restrictions->maxExclusive,out);
+ sdl_serialize_resriction_int(type->restrictions->maxInclusive,out);
+ sdl_serialize_resriction_int(type->restrictions->totalDigits,out);
+ sdl_serialize_resriction_int(type->restrictions->fractionDigits,out);
+ sdl_serialize_resriction_int(type->restrictions->length,out);
+ sdl_serialize_resriction_int(type->restrictions->minLength,out);
+ sdl_serialize_resriction_int(type->restrictions->maxLength,out);
+ sdl_serialize_resriction_char(type->restrictions->whiteSpace,out);
+ sdl_serialize_resriction_char(type->restrictions->pattern,out);
+ if (type->restrictions->enumeration) {
+ i = zend_hash_num_elements(type->restrictions->enumeration);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlRestrictionCharPtr *tmp;
+
+
zend_hash_internal_pointer_reset(type->restrictions->enumeration);
+ while
(zend_hash_get_current_data(type->restrictions->enumeration, (void**)&tmp) == SUCCESS)
{
+ sdl_serialize_resriction_char(*tmp, out);
+ sdl_serialize_key(type->restrictions->enumeration,
out);
+
zend_hash_move_forward(type->restrictions->enumeration);
+ }
+ }
+ } else {
+ WSDL_CACHE_PUT_1(0, out);
+ }
+ if (type->elements) {
+ i = zend_hash_num_elements(type->elements);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlTypePtr *tmp;
+
+ tmp_elements = emalloc(sizeof(HashTable));
+ zend_hash_init(tmp_elements, 0, NULL, NULL, 0);
+
+ zend_hash_internal_pointer_reset(type->elements);
+ while (zend_hash_get_current_data(type->elements, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(type->elements, out);
+ sdl_serialize_type(*tmp, tmp_encoders, tmp_types, out);
+ zend_hash_add(tmp_elements, (char*)tmp, sizeof(*tmp), &i,
sizeof(int), NULL);
+ i--;
+ zend_hash_move_forward(type->elements);
+ }
+ }
+
+ if (type->attributes) {
+ i = zend_hash_num_elements(type->attributes);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlAttributePtr *tmp;
+ zend_hash_internal_pointer_reset(type->attributes);
+ while (zend_hash_get_current_data(type->attributes, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(type->attributes, out);
+ sdl_serialize_attribute(*tmp, tmp_encoders, out);
+ zend_hash_move_forward(type->attributes);
+ }
+ }
+ if (type->model) {
+ WSDL_CACHE_PUT_1(1, out);
+ sdl_serialize_model(type->model, tmp_types, tmp_elements, out);
+ } else {
+ WSDL_CACHE_PUT_1(0, out);
+ }
+ if (tmp_elements != NULL) {
+ zend_hash_destroy(tmp_elements);
+ efree(tmp_elements);
+ }
+}
+
+static void sdl_serialize_encoder(encodePtr enc, HashTable *tmp_types, smart_str *out)
+{
+ WSDL_CACHE_PUT_INT(enc->details.type, out);
+ sdl_serialize_string(enc->details.type_str, out);
+ sdl_serialize_string(enc->details.ns, out);
+ sdl_serialize_type_ref(enc->details.sdl_type, tmp_types, out);
+}
+
+static void sdl_serialize_parameters(HashTable *ht, HashTable *tmp_encoders,
HashTable *tmp_types, smart_str *out)
+{
+ int i;
+
+ if (ht) {
+ i = zend_hash_num_elements(ht);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlParamPtr *tmp;
+
+ zend_hash_internal_pointer_reset(ht);
+ while (zend_hash_get_current_data(ht, (void**)&tmp) == SUCCESS) {
+ sdl_serialize_key(ht, out);
+ sdl_serialize_string((*tmp)->paramName, out);
+ WSDL_CACHE_PUT_INT((*tmp)->order, out);
+ sdl_serialize_encoder_ref((*tmp)->encode, tmp_encoders, out);
+ sdl_serialize_type_ref((*tmp)->element, tmp_types, out);
+ zend_hash_move_forward(ht);
+ }
+ }
+}
+
+static void sdl_serialize_soap_body(sdlSoapBindingFunctionBodyPtr body, HashTable
*tmp_encoders, HashTable *tmp_types, smart_str *out)
+{
+ int i;
+
+ WSDL_CACHE_PUT_1(body->use, out);
+ sdl_serialize_string(body->ns, out);
+ sdl_serialize_string(body->parts, out);
+ sdl_serialize_string(body->encodingStyle, out);
+ if (body->headers) {
+ i = zend_hash_num_elements(body->headers);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlSoapBindingFunctionHeaderPtr *tmp;
+ zend_hash_internal_pointer_reset(body->headers);
+ while (zend_hash_get_current_data(body->headers, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(body->headers, out);
+ WSDL_CACHE_PUT_1((*tmp)->use, out);
+ sdl_serialize_string((*tmp)->name, out);
+ sdl_serialize_string((*tmp)->ns, out);
+ sdl_serialize_string((*tmp)->encodingStyle, out);
+ sdl_serialize_encoder_ref((*tmp)->encode, tmp_encoders, out);
+ sdl_serialize_type_ref((*tmp)->element, tmp_types, out);
+ zend_hash_move_forward(body->headers);
+ }
+ }
+}
+
+static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr sdl)
+{
+ smart_str buf = {0};
+ smart_str *out = &buf;
+ int i;
+ int type_num = 1;
+ int encoder_num = 1;
+ int f;
+ encodePtr enc;
+ HashTable tmp_types;
+ HashTable tmp_encoders;
+ HashTable tmp_bindings;
+ HashTable tmp_functions;
+
+ f = open(fn,O_CREAT|O_WRONLY|O_EXCL|O_BINARY,S_IREAD|S_IWRITE);
+ if (f < 0) {return;}
+
+ zend_hash_init(&tmp_types, 0, NULL, NULL, 0);
+ zend_hash_init(&tmp_encoders, 0, NULL, NULL, 0);
+ zend_hash_init(&tmp_bindings, 0, NULL, NULL, 0);
+ zend_hash_init(&tmp_functions, 0, NULL, NULL, 0);
+
+ WSDL_CACHE_PUT_N("wsdl", 4, out);
+ WSDL_CACHE_PUT_1(WSDL_CACHE_VERSION,out);
+ WSDL_CACHE_PUT_1(0,out);
+ WSDL_CACHE_PUT_N(&t, sizeof(t), out);
+
+ sdl_serialize_string(uri, out);
+ sdl_serialize_string(sdl->source, out);
+ sdl_serialize_string(sdl->target_ns, out);
+
+ if (sdl->groups) {
+ i = zend_hash_num_elements(sdl->groups);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlTypePtr *tmp;
+
+ zend_hash_internal_pointer_reset(sdl->groups);
+ while (zend_hash_get_current_data(sdl->groups, (void**)&tmp) ==
SUCCESS) {
+ zend_hash_add(&tmp_types, (char*)tmp, sizeof(*tmp),
(void**)&type_num, sizeof(type_num), NULL);
+ ++type_num;
+ zend_hash_move_forward(sdl->groups);
+ }
+ }
+
+ if (sdl->types) {
+ i = zend_hash_num_elements(sdl->types);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlTypePtr *tmp;
+
+ zend_hash_internal_pointer_reset(sdl->types);
+ while (zend_hash_get_current_data(sdl->types, (void**)&tmp) ==
SUCCESS) {
+ zend_hash_add(&tmp_types, (char*)tmp, sizeof(*tmp),
(void**)&type_num, sizeof(type_num), NULL);
+ ++type_num;
+ zend_hash_move_forward(sdl->types);
+ }
+ }
+
+ if (sdl->elements) {
+ i = zend_hash_num_elements(sdl->elements);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlTypePtr *tmp;
+
+ zend_hash_internal_pointer_reset(sdl->elements);
+ while (zend_hash_get_current_data(sdl->elements, (void**)&tmp) ==
SUCCESS) {
+ zend_hash_add(&tmp_types, (char*)tmp, sizeof(*tmp),
(void**)&type_num, sizeof(type_num), NULL);
+ ++type_num;
+ zend_hash_move_forward(sdl->elements);
+ }
+ }
+
+ if (sdl->encoders) {
+ i = zend_hash_num_elements(sdl->encoders);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ encodePtr *tmp;
+
+ zend_hash_internal_pointer_reset(sdl->encoders);
+ while (zend_hash_get_current_data(sdl->encoders, (void**)&tmp) ==
SUCCESS) {
+ zend_hash_add(&tmp_encoders, (char*)tmp, sizeof(*tmp),
(void**)&encoder_num, sizeof(encoder_num), NULL);
+ ++encoder_num;
+ zend_hash_move_forward(sdl->encoders);
+ }
+ }
+ enc = defaultEncoding;
+ while (enc->details.type != END_KNOWN_TYPES) {
+ zend_hash_add(&tmp_encoders, (char*)&enc, sizeof(encodePtr),
(void**)&encoder_num, sizeof(encoder_num), NULL);
+ enc++;
+ ++encoder_num;
+ }
+
+ if (sdl->groups) {
+ sdlTypePtr *tmp;
+ zend_hash_internal_pointer_reset(sdl->groups);
+ while (zend_hash_get_current_data(sdl->groups, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(sdl->groups, out);
+ sdl_serialize_type(*tmp, &tmp_encoders, &tmp_types, out);
+ zend_hash_move_forward(sdl->groups);
+ }
+ }
+
+ if (sdl->types) {
+ sdlTypePtr *tmp;
+ zend_hash_internal_pointer_reset(sdl->types);
+ while (zend_hash_get_current_data(sdl->types, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(sdl->types, out);
+ sdl_serialize_type(*tmp, &tmp_encoders, &tmp_types, out);
+ zend_hash_move_forward(sdl->types);
+ }
+ }
+
+ if (sdl->elements) {
+ sdlTypePtr *tmp;
+ zend_hash_internal_pointer_reset(sdl->elements);
+ while (zend_hash_get_current_data(sdl->elements, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(sdl->elements, out);
+ sdl_serialize_type(*tmp, &tmp_encoders, &tmp_types, out);
+ zend_hash_move_forward(sdl->elements);
+ }
+ }
+
+ if (sdl->encoders) {
+ encodePtr *tmp;
+ zend_hash_internal_pointer_reset(sdl->encoders);
+ while (zend_hash_get_current_data(sdl->encoders, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(sdl->encoders, out);
+ sdl_serialize_encoder(*tmp, &tmp_types, out);
+ zend_hash_move_forward(sdl->encoders);
+ }
+ }
+
+ /* serialize bindings */
+ if (sdl->bindings) {
+ i = zend_hash_num_elements(sdl->bindings);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlBindingPtr *tmp;
+ int binding_num = 1;
+
+ zend_hash_internal_pointer_reset(sdl->bindings);
+ while (zend_hash_get_current_data(sdl->bindings, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(sdl->bindings, out);
+ sdl_serialize_string((*tmp)->name, out);
+ sdl_serialize_string((*tmp)->location, out);
+ WSDL_CACHE_PUT_1((*tmp)->bindingType,out);
+ if ((*tmp)->bindingType == BINDING_SOAP &&
(*tmp)->bindingAttributes != NULL) {
+ sdlSoapBindingPtr binding =
(sdlSoapBindingPtr)(*tmp)->bindingAttributes;
+ WSDL_CACHE_PUT_1(binding->style, out);
+ sdl_serialize_string(binding->transport, out);
+ } else {
+ WSDL_CACHE_PUT_1(0,out);
+ }
+
+ zend_hash_add(&tmp_bindings, (char*)tmp, sizeof(*tmp),
(void**)&binding_num, sizeof(binding_num), NULL);
+ binding_num++;
+ zend_hash_move_forward(sdl->bindings);
+ }
+ }
+
+ /* serialize functions */
+ i = zend_hash_num_elements(&sdl->functions);
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlFunctionPtr *tmp;
+ int *binding_num;
+ int function_num = 1;
+
+ zend_hash_internal_pointer_reset(&sdl->functions);
+ while (zend_hash_get_current_data(&sdl->functions, (void**)&tmp) ==
SUCCESS) {
+ sdl_serialize_key(&sdl->functions, out);
+ sdl_serialize_string((*tmp)->functionName, out);
+ sdl_serialize_string((*tmp)->requestName, out);
+ sdl_serialize_string((*tmp)->responseName, out);
+
+ if ((*tmp)->binding == NULL ||
+
zend_hash_find(&tmp_bindings,(char*)&(*tmp)->binding,sizeof((*tmp)->binding),
(void**)&binding_num) != SUCCESS) {
+ }
+ WSDL_CACHE_PUT_INT(*binding_num, out);
+ if (binding_num >= 0) {
+ if ((*tmp)->binding->bindingType == BINDING_SOAP &&
(*tmp)->bindingAttributes != NULL) {
+ sdlSoapBindingFunctionPtr binding =
(sdlSoapBindingFunctionPtr)(*tmp)->bindingAttributes;
+ WSDL_CACHE_PUT_1(binding->style, out);
+ sdl_serialize_string(binding->soapAction, out);
+ sdl_serialize_soap_body(&binding->input,
&tmp_encoders, &tmp_types, out);
+ sdl_serialize_soap_body(&binding->output,
&tmp_encoders, &tmp_types, out);
+ /*sdl_serialize_soap_body(&binding->fault,
&tmp_encoders, &tmp_types, out);*/
+ } else {
+ WSDL_CACHE_PUT_1(0,out);
+ }
+ }
+ sdl_serialize_parameters((*tmp)->requestParameters,
&tmp_encoders, &tmp_types, out);
+ sdl_serialize_parameters((*tmp)->responseParameters,
&tmp_encoders, &tmp_types, out);
+
+ zend_hash_add(&tmp_functions, (char*)tmp, sizeof(*tmp),
(void**)&function_num, sizeof(function_num), NULL);
+ function_num++;
+ zend_hash_move_forward(&sdl->functions);
+ }
+ }
+
+ /* serialize requests */
+ if (sdl->requests) {
+ i = zend_hash_num_elements(sdl->requests);
+ } else {
+ i = 0;
+ }
+ WSDL_CACHE_PUT_INT(i, out);
+ if (i > 0) {
+ sdlFunctionPtr *tmp;
+ int *function_num;
+
+ zend_hash_internal_pointer_reset(sdl->requests);
+ while (zend_hash_get_current_data(sdl->requests, (void**)&tmp) ==
SUCCESS) {
+ if (zend_hash_find(&tmp_functions, (char*)tmp, sizeof(*tmp),
(void**)&function_num) != SUCCESS) {
+ }
+ WSDL_CACHE_PUT_INT(*function_num, out);
+ sdl_serialize_key(sdl->requests, out);
+ zend_hash_move_forward(sdl->requests);
+ }
+ }
+
+ write(f, buf.c, buf.len);
+ close(f);
+ smart_str_free(&buf);
+ zend_hash_destroy(&tmp_functions);
+ zend_hash_destroy(&tmp_bindings);
+ zend_hash_destroy(&tmp_encoders);
+ zend_hash_destroy(&tmp_types);
+}
+
+sdlPtr get_sdl(char *uri TSRMLS_DC)
{
#ifdef SDL_CACHE
sdlPtr tmp, *hndl;
@@ -768,7 +1829,43 @@
return tmp;
#else
- return load_wsdl(uri);
+ if (SOAP_GLOBAL(cache_enabled)) {
+ char fn[MAXPATHLEN];
+ char* key;
+ sdlPtr sdl;
+ time_t t = time(0);
+
+ char md5str[33];
+ PHP_MD5_CTX context;
+ unsigned char digest[16];
+ int len = strlen(SOAP_GLOBAL(cache_dir));
+
+ if (strchr(uri,':') != NULL || IS_ABSOLUTE_PATH(uri,strlen(uri))) {
+ strcpy(fn, uri);
+ } else if (VCWD_REALPATH(uri, fn) == NULL) {
+ return load_wsdl(uri);
+ }
+ md5str[0] = '\0';
+ PHP_MD5Init(&context);
+ PHP_MD5Update(&context, fn, strlen(fn));
+ PHP_MD5Final(digest, &context);
+ make_digest(md5str, digest);
+ key = do_alloca(len+sizeof("/wsdl-")-1+sizeof(md5str));
+ memcpy(key,SOAP_GLOBAL(cache_dir),len);
+ memcpy(key+len,"/wsdl-",sizeof("/wsdl-")-1);
+ memcpy(key+len+sizeof("/wsdl-")-1,md5str,sizeof(md5str));
+
+ if ((sdl = get_sdl_from_cache(key, fn, t-SOAP_GLOBAL(cache_ttl))) ==
NULL) {
+ sdl = load_wsdl(fn);
+ if (sdl != NULL) {
+ add_sdl_to_cache(key, fn, t, sdl);
+ }
+ }
+ free_alloca(key);
+ return sdl;
+ } else {
+ return load_wsdl(uri);
+ }
#endif
}
@@ -884,13 +1981,13 @@
}
delete_sdl_soap_binding_function_body(soapFunction->input);
delete_sdl_soap_binding_function_body(soapFunction->output);
- delete_sdl_soap_binding_function_body(soapFunction->falut);
+ delete_sdl_soap_binding_function_body(soapFunction->fault);
sdl_free(soapFunction);
}
sdl_free(function);
}
-static void delete_paramater(void *data)
+static void delete_parameter(void *data)
{
sdlParamPtr param = *((sdlParamPtr*)data);
if (param->paramName) {
http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.h?r1=1.25&r2=1.26&ty=u
Index: php-src/ext/soap/php_sdl.h
diff -u php-src/ext/soap/php_sdl.h:1.25 php-src/ext/soap/php_sdl.h:1.26
--- php-src/ext/soap/php_sdl.h:1.25 Fri Feb 6 09:22:33 2004
+++ php-src/ext/soap/php_sdl.h Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_sdl.h,v 1.25 2004/02/06 14:22:33 dmitry Exp $ */
+/* $Id: php_sdl.h,v 1.26 2004/02/10 13:41:21 dmitry Exp $ */
#ifndef PHP_SDL_H
#define PHP_SDL_H
@@ -38,14 +38,20 @@
#define XSD_WHITESPACE_PRESERVE 1
#define XSD_WHITESPACE_REPLACE 1
-#define BINDING_SOAP 1
-#define BINDING_HTTP 2
-
-#define SOAP_RPC 1
-#define SOAP_DOCUMENT 2
-
-#define SOAP_ENCODED 1
-#define SOAP_LITERAL 2
+typedef enum _sdlBindingType {
+ BINDING_SOAP = 1,
+ BINDING_HTTP = 2
+} sdlBindingType;
+
+typedef enum _sdlEncodingStyle {
+ SOAP_RPC = 1,
+ SOAP_DOCUMENT = 2
+} sdlEncodingStyle;
+
+typedef enum _sdlEncodingUse {
+ SOAP_ENCODED = 1,
+ SOAP_LITERAL = 2
+} sdlEncodingUse;
struct _sdl {
HashTable functions; /* array of sdlFunction */
@@ -74,42 +80,42 @@
} sdlCtx;
struct _sdlBinding {
- char *name;
- char *location;
- int bindingType;
- void *bindingAttributes; /* sdlSoapBindingPtr */
+ char *name;
+ char *location;
+ sdlBindingType bindingType;
+ void *bindingAttributes; /* sdlSoapBindingPtr */
};
/* Soap Binding Specfic stuff */
struct _sdlSoapBinding {
- char *transport;
- int style;
+ char *transport;
+ sdlEncodingStyle style;
};
typedef struct _sdlSoapBindingFunctionHeader {
- char *name;
- char *ns;
- int use;
- sdlTypePtr element;
- encodePtr encode;
- char *encodingStyle; /* not implemented yet */
+ char *name;
+ char *ns;
+ sdlEncodingUse use;
+ sdlTypePtr element;
+ encodePtr encode;
+ char *encodingStyle; /* not implemented yet */
} sdlSoapBindingFunctionHeader, *sdlSoapBindingFunctionHeaderPtr;
struct _sdlSoapBindingFunctionBody {
- char *ns;
- int use;
- char *parts; /* not implemented yet */
- char *encodingStyle; /* not implemented yet */
- HashTable *headers; /* array of sdlSoapBindingFunctionHeaderPtr */
+ char *ns;
+ sdlEncodingUse use;
+ char *parts; /* not implemented yet */
+ char *encodingStyle; /* not implemented yet */
+ HashTable *headers; /* array of sdlSoapBindingFunctionHeaderPtr */
};
struct _sdlSoapBindingFunction {
- char *soapAction;
- int style;
+ char *soapAction;
+ sdlEncodingStyle style;
- sdlSoapBindingFunctionBody input;
- sdlSoapBindingFunctionBody output;
- sdlSoapBindingFunctionBody falut;
+ sdlSoapBindingFunctionBody input;
+ sdlSoapBindingFunctionBody output;
+ sdlSoapBindingFunctionBody fault;
};
struct _sdlRestrictionInt {
@@ -155,7 +161,7 @@
int max_occurs;
union {
sdlTypePtr element; /* pointer to element */
- sdlContentModelPtr group; /* pointer to group */
+ sdlTypePtr group; /* pointer to group */
HashTable *content; /* array of sdlContentModel for
sequnce,all,choice*/
char *group_ref; /* reference to group */
} u;
@@ -174,7 +180,7 @@
sdlTypeKind kind;
char *name;
char *namens;
- int nillable;
+ char nillable;
HashTable *elements; /* array of sdlTypePtr */
HashTable *attributes; /* array of sdlAttributePtr */
sdlRestrictionsPtr restrictions;
@@ -231,7 +237,7 @@
encodePtr encode;
};
-sdlPtr get_sdl(char *uri);
+sdlPtr get_sdl(char *uri TSRMLS_DC);
encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr data, const char *type);
encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type);
http://cvs.php.net/diff.php/php-src/ext/soap/php_soap.h?r1=1.27&r2=1.28&ty=u
Index: php-src/ext/soap/php_soap.h
diff -u php-src/ext/soap/php_soap.h:1.27 php-src/ext/soap/php_soap.h:1.28
--- php-src/ext/soap/php_soap.h:1.27 Fri Feb 6 06:56:03 2004
+++ php-src/ext/soap/php_soap.h Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_soap.h,v 1.27 2004/02/06 11:56:03 dmitry Exp $ */
+/* $Id: php_soap.h,v 1.28 2004/02/10 13:41:21 dmitry Exp $ */
#ifndef PHP_SOAP_H
#define PHP_SOAP_H
@@ -148,6 +148,9 @@
int soap_version;
sdlPtr sdl;
zend_bool use_soap_error_handler;
+ zend_bool cache_enabled;
+ char* cache_dir;
+ long cache_ttl;
ZEND_END_MODULE_GLOBALS(soap)
#ifdef PHP_WIN32
http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.76&r2=1.77&ty=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.76 php-src/ext/soap/soap.c:1.77
--- php-src/ext/soap/soap.c:1.76 Mon Feb 9 04:31:12 2004
+++ php-src/ext/soap/soap.c Tue Feb 10 08:41:21 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: soap.c,v 1.76 2004/02/09 09:31:12 dmitry Exp $ */
+/* $Id: soap.c,v 1.77 2004/02/10 13:41:21 dmitry Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -278,6 +278,20 @@
ZEND_GET_MODULE(soap)
#endif
+PHP_INI_BEGIN()
+STD_PHP_INI_ENTRY("soap.wsdl_cache_enabled", "1", PHP_INI_ALL, OnUpdateBool,
+ cache_enabled, zend_soap_globals, soap_globals)
+STD_PHP_INI_ENTRY("soap.wsdl_cache_dir", "/tmp", PHP_INI_ALL, OnUpdateString,
+ cache_dir, zend_soap_globals, soap_globals)
+#ifdef ZEND_ENGINE_2
+STD_PHP_INI_ENTRY("soap.wsdl_cache_ttl", "86400", PHP_INI_ALL, OnUpdateLong,
+ cache_ttl, zend_soap_globals, soap_globals)
+#else
+STD_PHP_INI_ENTRY("soap.wsdl_cache_ttl", "86400", PHP_INI_ALL, OnUpdateInt,
+ cache_ttl, zend_soap_globals, soap_globals)
+#endif
+PHP_INI_END()
+
static void php_soap_init_globals(zend_soap_globals *soap_globals)
{
int i;
@@ -343,6 +357,7 @@
/* TODO: add ini entry for always use soap errors */
ZEND_INIT_MODULE_GLOBALS(soap, php_soap_init_globals, NULL);
+ REGISTER_INI_ENTRIES();
#ifndef ZEND_ENGINE_2
/* Enable php stream/wrapper support for libxml */
@@ -489,6 +504,7 @@
php_info_print_table_row(2, "Soap Client", "enabled");
php_info_print_table_row(2, "Soap Server", "enabled");
php_info_print_table_end();
+ DISPLAY_INI_ENTRIES();
}
#ifdef HAVE_PHP_DOMXML
@@ -695,7 +711,7 @@
zend_hash_init(service->soap_functions.ft, 0, NULL, ZVAL_PTR_DTOR, 0);
if (wsdl) {
- service->sdl = get_sdl(Z_STRVAL_P(wsdl));
+ service->sdl = get_sdl(Z_STRVAL_P(wsdl) TSRMLS_CC);
if (service->uri == NULL) {
if (service->sdl->target_ns) {
service->uri = estrdup(service->sdl->target_ns);
@@ -1130,6 +1146,7 @@
php_error(E_ERROR, "PHP-SOAP requires
'always_populate_raw_post_data' to be on please check your php.ini file");
}
php_error(E_ERROR, "Can't find HTTP_RAW_POST_DATA");
+ return;
}
} else {
doc_request = soap_xmlParseMemory(arg,arg_len);
@@ -1577,7 +1594,7 @@
old_soap_version = SOAP_GLOBAL(soap_version);
SOAP_GLOBAL(soap_version) = soap_version;
- sdl = get_sdl(Z_STRVAL_P(wsdl));
+ sdl = get_sdl(Z_STRVAL_P(wsdl) TSRMLS_CC);
ret = zend_list_insert(sdl, le_sdl);
add_property_resource(this_ptr, "sdl", ret);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php