source: trunk/zoo-project/zoo-kernel/service_internal_php.c @ 509

Last change on this file since 509 was 509, checked in by djay, 8 years ago

Apply updates of the PHP support and fixes in ulinet provided by Knut Landmark. Fix building issue on GNU/Linux by defining semun.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 6.6 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright (c) 2009-2010 GeoLabs SARL
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25#include "service_internal_php.h"
26
27#include <sapi/embed/php_embed.h>
28#include <zend_stream.h>
29
30#ifdef ZTS
31void ***tsrm_ls;
32#endif
33
34zval *php_Array_from_maps(maps* t);
35zval*  php_Array_from_map(map*);
36maps* php_maps_from_Array(HashTable* t);
37map* php_map_from_HasTable(HashTable* t);
38
39int zoo_php_support(maps** main_conf,map* request,service* s,maps **real_inputs,maps **real_outputs){
40  maps* m=*main_conf;
41  maps* inputs=*real_inputs;
42  maps* outputs=*real_outputs;
43  char ntmp[1024];
44  getcwd(ntmp,1024);
45  map* tmp=getMap(request,"metapath");
46
47  int res=SERVICE_FAILED;
48
49  tmp=getMap(s->content,"serviceProvider");
50  zend_file_handle iscript;
51  iscript.type=ZEND_HANDLE_FP;
52  iscript.filename=tmp->value;
53  iscript.opened_path=NULL;
54  //iscript.free_filname=0;
55  if(!(iscript.handle.fp=fopen(iscript.filename,"rb"))){
56    char tmp1[1024];
57    sprintf(tmp1,"Unable to load PHP file %s",tmp->value);
58    map* err=createMap("text",tmp1);
59    addToMap(err,"code","NoApplicableCode");
60    printExceptionReportResponse(m,err);
61    exit(-1);
62  }
63
64  php_embed_init(0,NULL,&tsrm_ls);
65 
66  zend_try {
67    php_execute_script(&iscript TSRMLS_CC);
68
69    zval *iargs[3];
70    zval iret, ifunc,ifile;
71     
72    ZVAL_STRING(&ifunc, s->name, 0);
73    iargs[0] = php_Array_from_maps(*main_conf);
74    iargs[1] = php_Array_from_maps(*real_inputs);
75    iargs[2] = php_Array_from_maps(*real_outputs);
76   
77    call_user_function(EG(function_table), NULL, &ifunc, &iret, 3, iargs TSRMLS_CC);
78
79    HashTable* t=HASH_OF(iargs[2]);
80    *real_outputs=php_maps_from_Array(t);
81   
82    char tmp1[1024];
83
84    res=SERVICE_SUCCEEDED;
85
86  } zend_catch { 
87    map* err=createMap("text","Unable to process.");
88    addToMap(err,"code","NoApplicableCode");
89    printExceptionReportResponse(m,err);
90    exit(-1);
91  } zend_end_try();
92
93  php_embed_shutdown(TSRMLS_C);
94
95  return res;
96}
97
98zval *php_Array_from_maps(maps* t){
99  zval *mapArray;
100  zval *mapArrayTmp;
101  maps* tmp=t;
102  int tres=0;
103  MAKE_STD_ZVAL(mapArray);
104  tres=array_init(mapArray);
105  while(tmp!=NULL){
106    add_assoc_zval(mapArray,tmp->name,php_Array_from_map(tmp->content));
107    tmp=tmp->next;
108  }
109  return mapArray;
110}
111
112zval *php_Array_from_map(map* t){
113  zval *mapArray;
114  zval *mapArrayTmp;
115  map* tmp=t;
116  int tres=0;
117  MAKE_STD_ZVAL(mapArray);
118  tres=array_init(mapArray);
119  while(tmp!=NULL){
120    map* sMap=getMapArray(tmp,"size",0);
121    if(strncmp(tmp->name,"value",5)==0 && sMap!=NULL){
122      tres=add_assoc_stringl(mapArray,tmp->name,tmp->value,atoi(sMap->value),1);
123    }else
124      tres=add_assoc_string(mapArray,tmp->name,tmp->value,1);
125    tmp=tmp->next;
126  }
127  return mapArray;
128}
129
130maps* php_maps_from_Array(HashTable *t){
131  maps* final_res=NULL;
132  maps* cursor=final_res;
133  char key[1024];
134  for(zend_hash_internal_pointer_reset(t); 
135      zend_hash_has_more_elements(t) == SUCCESS; 
136      zend_hash_move_forward(t)) { 
137    char *key; 
138    uint keylen; 
139    ulong idx; 
140    int type; 
141    zval **ppzval, tmpcopy; 
142    type = zend_hash_get_current_key_ex(t, &key, &keylen, &idx, 0, NULL); 
143    if (zend_hash_get_current_data(t, (void**)&ppzval) == FAILURE) { 
144      /**
145       * Should never actually fail since the key is known to exist.
146       */
147      continue; 
148    }
149    /**
150     * Duplicate the zval so that * the orignal’s contents are not destroyed
151     */
152    tmpcopy = **ppzval;
153#ifdef DEBUG
154    fprintf(stderr,"key : %s\n",key);
155#endif
156    zval_copy_ctor(&tmpcopy); 
157#ifdef DEBUG
158    fprintf(stderr,"key : %s\n",key);
159#endif
160    /**
161     * Reset refcount & Convert
162     */
163    INIT_PZVAL(&tmpcopy); 
164    //convert_to_string(&tmpcopy);
165    if (type == HASH_KEY_IS_STRING) { 
166      /**
167       * String Key / Associative
168       */
169      cursor=(maps*)malloc(MAPS_SIZE);
170      cursor->name=strdup(key);
171    }
172    fprintf(stderr,"key : %s\n",key);
173    HashTable* t=HASH_OF(*ppzval);
174#ifdef DEBUG
175    fprintf(stderr,"key : %s\n",key);
176#endif
177    cursor->content=php_map_from_HasTable(t);
178    cursor->next=NULL;
179    if(final_res==NULL)
180      final_res=cursor;
181    else
182      addMapsToMaps(&final_res,cursor);
183#ifdef DEBUG
184    fprintf(stderr,"key : %s\n",key);
185#endif
186    /**
187     * Toss out old copy
188     */
189    zval_dtor(&tmpcopy);
190  }
191  return final_res;
192}
193
194map* php_map_from_HasTable(HashTable* t){
195#ifdef DEBUG
196  fprintf(stderr,"mapsFromPHPArray start\n");
197#endif
198  map* final_res=(map*)malloc(MAP_SIZE);
199  final_res=NULL;
200  char key[1024];
201  for(zend_hash_internal_pointer_reset(t);
202      zend_hash_has_more_elements(t) == SUCCESS;
203      zend_hash_move_forward(t)) {
204    char *key;
205    uint keylen;
206    ulong idx;
207    int type;
208    int len;
209    zval **ppzval, tmpcopy;
210    type = zend_hash_get_current_key_ex(t, &key, &keylen, &idx, 0, NULL); 
211    if (zend_hash_get_current_data(t, (void**)&ppzval) == FAILURE) { 
212      /* Should never actually fail * since the key is known to exist. */ 
213      continue; 
214    }
215    /**
216     * Duplicate the zval so that * the orignal’s contents are not destroyed
217     */ 
218    tmpcopy = **ppzval; 
219    zval_copy_ctor(&tmpcopy); 
220    /**
221     * Reset refcount & Convert
222     */ 
223    INIT_PZVAL(&tmpcopy); 
224    convert_to_string(&tmpcopy);
225    if(strncmp(key,"value",5)==0){
226      len=Z_STRLEN_P(&tmpcopy);
227      addToMapWithSize(final_res,key,Z_STRVAL_P(&tmpcopy),len);
228    }
229    else{
230      if(final_res==NULL){
231#ifdef DEBUG
232        fprintf(stderr,"%s => %s\n",key,Z_STRVAL(tmpcopy));
233#endif
234        final_res=createMap(key,Z_STRVAL(tmpcopy));
235      }
236      else{
237#ifdef DEBUG
238        fprintf(stderr,"%s => %s\n",key,Z_STRVAL(tmpcopy));
239#endif
240        addToMap(final_res,key,Z_STRVAL(tmpcopy));
241      }
242    }
243    /* Toss out old copy */ 
244    zval_dtor(&tmpcopy); 
245  }
246  return final_res;
247}
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png