73 fprintf(output,
"[\n");
76 fprintf(output,
"sql -> ");
78 fprintf(output,
"\n");
81 fprintf(output,
" error code -> %d\n]\n", fe->
error_code);
92 xmlChar *content = NULL;
97 if (node->type == XML_ELEMENT_NODE) {
98 for (n = node; n; n = n->next) {
99 fprintf(output,
"name:%s\n", n->name);
101 for (att = n->properties; att ; att = att->next)
102 fprintf(output,
"%s=%s\n", att->name, (
char *) xmlNodeGetContent(att->children));
106 }
else if ((node->type == XML_CDATA_SECTION_NODE) || (node->type == XML_TEXT_NODE)) {
107 content = xmlNodeGetContent(node);
108 fprintf(output,
"%s\n", content);
124 assert(o &&
typename && fe && sql);
127 if (!strcmp((
char *) n->name,
"Function"))
return fe_function(o,
typename, fe, sql, n);
131 if (n->children->type == XML_ELEMENT_NODE && n->children->children)
buffer_add_str(sql,
"(");
132 else if (n->children->next && (n->children->next->children))
buffer_add_str(sql,
"(");
138 content = xmlNodeGetContent(n);
142 else if (!strcmp((
char *) n->name,
"Sub"))
buffer_add_str(sql,
" - ");
143 else if (!strcmp((
char *) n->name,
"Mul"))
buffer_add_str(sql,
" * ");
144 else if (!strcmp((
char *) n->name,
"Div"))
buffer_add_str(sql,
" / ");
145 else if (!strcmp((
char *) n->name,
"PropertyName")) {
149 }
else if (!strcmp((
char *) n->name,
"Literal")) {
157 }
else if (n->type != XML_ELEMENT_NODE) {
164 if (n->children && n->children->next) {
165 if (n->children->type == XML_ELEMENT_NODE && n->children->next->type == XML_ELEMENT_NODE)
166 sql =
fe_expression(o,
typename, fe, sql, n->children->next);
167 else sql =
fe_expression(o,
typename, fe, sql, n->children->next->next);
169 content = xmlNodeGetContent(n->children->next);
190 assert(o &&
typename && property);
217 assert(o &&
typename && n && fe && sql);
219 while (n->type != XML_ELEMENT_NODE) n = n->next;
225 content = xmlNodeGetContent(n);
268 bool feature_id, gid;
270 buffer *buf_fid, *id_name = NULL;
272 assert(o &&
typename && n && fe);
274 for (feature_id = gid =
false ; n ; n = n->next) {
275 if (n->type == XML_ELEMENT_NODE) {
279 if (!strcmp((
char *) n->name,
"FeatureId")) {
283 if (!gid) fid = xmlGetProp(n, (xmlChar *)
"fid");
292 if (!strcmp((
char *) n->name,
"GmlObjectId")) {
296 if (feature_id ==
false) fid = xmlGetProp(n, (xmlChar *)
"id");
319 if (!id_name || !id_name->
use) {
341 if (n->next && n->next->type == XML_ELEMENT_NODE)
buffer_add_str(fe->
sql,
" OR ");
360 assert(o && fe &&
typename && xmlchar);
385 xmldoc = xmlParseMemory(xmlchar->
buf, xmlchar->
use);
399 n = xmldoc->children->children;
402 while (n->type != XML_ELEMENT_NODE) n = n->next;
407 if (!strcmp((
char *) n->name,
"FeatureId")) fe->
sql =
fe_feature_id(o,
typename, fe, n);
426 bool transform =
false;
428 assert(o && wr && layer_name && bbox);
439 if (wr->bbox->srs && (wr->bbox->srs->srid != wr->srs->srid)) {
440 srid = wr->srs->srid;
444 for (ln = geom->
first ; ln ; ln = ln->
next) {
501 assert(o && wr && layer_name && fid);
506 if (!id_name || id_name->
use == 0)
return where;
510 for (ln = fid->
first ; ln ; ln = ln->
next) {
filter_encoding * fe_filter(ows *o, filter_encoding *fe, buffer *typename, buffer *xmlchar)
filter_encoding * filter_encoding_init()
buffer * fe_xpath_property_name(ows *o, buffer *typename, buffer *property)
buffer * fe_expression(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
void filter_encoding_free(filter_encoding *fe)
buffer * fe_feature_id(ows *o, buffer *typename, filter_encoding *fe, xmlNodePtr n)
buffer * fe_property_name(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n, bool check_geom_column, bool mandatory)
buffer * fe_kvp_featureid(ows *o, wfs_request *wr, buffer *layer_name, list *fid)
buffer * fe_kvp_bbox(ows *o, wfs_request *wr, buffer *layer_name, ows_bbox *bbox)
void buffer_add(buffer *buf, char c)
int ows_version_get(ows_version *v)
buffer * ows_psql_column_name(ows *o, buffer *layer_name, int number)
void list_add_by_copy(list *l, buffer *value)
void buffer_empty(buffer *buf)
buffer * wfs_request_remove_prop_ns_prefix(ows *o, buffer *prop, list *layer_name)
buffer * fe_function(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
void buffer_copy(buffer *dest, const buffer *src)
bool buffer_cmp(const buffer *buf, const char *str)
list * ows_psql_geometry_column(ows *o, buffer *layer_name)
bool fe_is_comparison_op(char *name)
void buffer_add_str(buffer *buf, const char *str)
void buffer_flush(buffer *buf, FILE *output)
buffer * fe_logical_op(ows *o, buffer *typename, filter_encoding *fe, xmlNodePtr n)
bool fe_is_spatial_op(char *name)
bool fe_is_logical_op(char *name)
char * ows_psql_escape_string(ows *o, const char *content)
void ows_bbox_to_query(ows *o, ows_bbox *bbox, buffer *query)
buffer * array_get(const array *a, const char *key)
buffer * ows_psql_id_column(ows *o, buffer *layer_name)
bool ows_libxml_check_namespace(ows *o, xmlNodePtr n)
bool array_is_key(const array *a, const char *key)
array * ows_psql_describe_table(ows *o, buffer *layer_name)
buffer * buffer_from_str(const char *str)
void buffer_free(buffer *buf)
buffer * fe_comparison_op(ows *o, buffer *typename, filter_encoding *fe, xmlNodePtr n)
void buffer_add_int(buffer *buf, int i)
void buffer_shift(buffer *buf, size_t len)
bool ows_psql_is_numeric(buffer *type)
buffer * ows_layer_no_uri(ows_layer_list *ll, buffer *layer_name)
int ows_srs_get_srid_from_layer(ows *o, buffer *layer_name)
bool ows_psql_is_geometry_column(ows *o, buffer *layer_name, buffer *column)
void fe_node_flush(xmlNodePtr node, FILE *output)
buffer * fe_spatial_op(ows *o, buffer *typename, filter_encoding *fe, xmlNodePtr n)
void buffer_pop(buffer *buf, size_t len)
list * list_explode(char separator, const buffer *value)
int ows_schema_validation(ows *o, buffer *xml_schema, buffer *xml, bool schema_is_file, enum ows_schema_type schema_type)
bool check_regexp(const char *str_request, const char *str_regex)
buffer * ows_layer_prefix_to_uri(ows_layer_list *ll, buffer *layer_name_prefix)
void filter_encoding_flush(filter_encoding *fe, FILE *output)
struct List_node list_node
@ FE_ERROR_GEOM_PROPERTYNAME
struct Filter_encoding filter_encoding
char * buf
size to next realloc
enum fe_error_code error_code