39 buffer *result, *cmd_status;
49 if (PQresultStatus(res) != PGRES_COMMAND_OK)
57 wr->delete_results += atoi(cmd_status->
buf);
62 wr->update_results += atoi(cmd_status->
buf);
84 fprintf(o->
output,
"<wfs:TransactionSummary>\n");
88 if (wr->insert_results) {
89 for (an = wr->insert_results->first ; an ; an = an->
next) nb += an->
value->
size;
90 fprintf(o->
output,
" <wfs:totalInserted>%d</wfs:totalInserted>\n", nb);
93 fprintf(o->
output,
"<wfs:totalUpdated>%d</wfs:totalUpdated>\n", wr->update_results);
94 fprintf(o->
output,
" <wfs:totalDeleted>%d</wfs:totalDeleted>\n", wr->delete_results);
97 fprintf(o->
output,
"</wfs:TransactionSummary>\n");
119 fprintf(o->
output,
"<wfs:InsertResults>\n");
121 for (an = wr->insert_results->first ; an ; an = an->
next) {
124 fprintf(o->
output,
"<wfs:InsertResult handle=\"%s\">", an->
key->
buf);
126 fprintf(o->
output,
"<ogc:FeatureId fid=\"%s\"/>", ln->
value->
buf);
127 fprintf(o->
output,
"</wfs:InsertResult>\n");
130 fprintf(o->
output,
"<wfs:Feature handle=\"%s\">\n", an->
key->
buf);
131 fprintf(o->
output,
" <ogc:FeatureId fid=\"%s\"/>\n", ln->
value->
buf);
132 fprintf(o->
output,
"</wfs:Feature>\n");
138 fprintf(o->
output,
"</wfs:InsertResults>");
152 if (!
buffer_cmp(result,
"PGRES_COMMAND_OK")) assert(locator);
157 && !
buffer_cmp(result,
"PGRES_COMMAND_OK"))) {
160 fprintf(o->
output,
"<wfs:TransactionResults>\n");
162 fprintf(o->
output,
"<wfs:TransactionResult>\n");
164 fprintf(o->
output,
"<wfs:Status>");
167 fprintf(o->
output,
"<wfs:SUCCESS/>");
168 else fprintf(o->
output,
"<wfs:FAILED/>");
170 fprintf(o->
output,
"</wfs:Status>\n");
175 fprintf(o->
output,
"</wfs:TransactionResult>\n");
177 fprintf(o->
output,
"</wfs:Action>\n");
178 fprintf(o->
output,
"</wfs:TransactionResults>\n");
193 if (!
buffer_cmp(result,
"PGRES_COMMAND_OK")) {
194 if (
buffer_cmp(result,
"No FE selector on DELETE statement"))
201 fprintf(o->
output,
"Content-Type: application/xml\n\n");
205 fprintf(o->
output,
"<wfs:WFS_TransactionResponse version=\"1.0.0\"\n");
206 else fprintf(o->
output,
"<wfs:TransactionResponse version=\"1.1.0\"\n");
208 fprintf(o->
output,
" xmlns:wfs=\"http://www.opengis.net/wfs\"\n");
209 fprintf(o->
output,
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
210 fprintf(o->
output,
" xmlns:ogc=\"http://www.opengis.net/ogc\"\n");
213 fprintf(o->
output,
" xsi:schemaLocation='http://www.opengis.net/wfs");
214 fprintf(o->
output,
" http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd'>\n");
216 fprintf(o->
output,
" xsi:schemaLocation='http://www.opengis.net/wfs");
217 fprintf(o->
output,
" http://schemas.opengis.net/wfs/1.1.0/wfs.xsd'>\n");
230 fprintf(o->
output,
"</wfs:WFS_TransactionResponse>\n");
231 else fprintf(o->
output,
"</wfs:TransactionResponse>\n");
241 char *content_escaped;
248 content = xmlNodeGetContent(n);
251 if (!content_escaped) {
256 "Some forbidden character are present into the request",
"transaction");
264 free(content_escaped);
284 for (att = n->properties ; att ; att = att->next) {
286 if (!strcmp((
char *) att->name,
"typeName")) {
287 content = xmlNodeGetContent(att->children);
292 if (n->nsDef && n->nsDef->href &&
array_is_value(o_ns, (
char *) n->nsDef->href)) {
293 buffer_shift(
typename, strlen((
char *) n->nsDef->prefix));
319 buffer *values, *column, *layer_name, *layer_ns_prefix, *result, *sql, *gml;
320 buffer *handle, *id_column, *fid_full_name, *dup_sql, *id;
321 xmlNodePtr node, elemt;
328 xmlChar *attr = NULL;
342 if (xmlHasProp(n, (xmlChar *)
"handle")) {
343 attr = xmlGetProp(n, (xmlChar *)
"handle");
354 if (xmlHasProp(n, (xmlChar *)
"idgen")) {
355 attr = xmlGetProp(n, (xmlChar *)
"idgen");
357 else if (!strcmp((
char *) attr,
"UseExisting")) handle_idgen =
WFS_USE_EXISTING;
366 if (xmlHasProp(n, (xmlChar *)
"srsName")) {
367 attr = xmlGetProp(n, (xmlChar *)
"srsName");
386 while (n->type != XML_ELEMENT_NODE) n = n->next;
389 for ( ; n ; n = n->next) {
390 if (n->type != XML_ELEMENT_NODE)
continue;
412 idgen = handle_idgen;
418 if (xmlHasProp(n, (xmlChar *)
"id")) attr = xmlGetProp(n, (xmlChar *)
"id");
419 else if (xmlHasProp(n, (xmlChar *)
"fid")) attr = xmlGetProp(n, (xmlChar *)
"fid");
435 result =
buffer_from_str(
"Error unknown Layer Name or not id column available");
449 (void)layer_ns_prefix;
474 if (PQresultStatus(res) != PGRES_TUPLES_OK || atoi((
char *) PQgetvalue(res, 0, 0)) != 0)
495 alist_add(wr->insert_results, handle, fid_full_name);
508 while (node != NULL && node->type != XML_ELEMENT_NODE) node = node->next;
511 for ( ; node; node = node->next) {
514 if (node->type == XML_ELEMENT_NODE &&
516 || !strcmp(
"http://www.opengis.net/gml", (
char *) node->ns->href)
517 || !strcmp(
"http://www.opengis.net/gml/3.2", (
char *) node->ns->href))) {
521 if ( !strcmp(
"http://www.opengis.net/gml", (
char *) node->ns->href)
522 || !strcmp(
"http://www.opengis.net/gml/3.2", (
char *) node->ns->href)) {
524 if (!
array_is_key(table, (
char *) node->name))
continue;
541 elemt = node->children;
544 while (elemt != NULL && elemt->type != XML_ELEMENT_NODE) elemt = elemt->next;
546 if (!strcmp((
char *) elemt->name,
"Box") ||
547 !strcmp((
char *) elemt->name,
"Envelope")) {
564 }
else if (!strcmp((
char *) elemt->name,
"Null")) {
615 if (!
buffer_cmp(result,
"PGRES_COMMAND_OK")) {
637 buffer *sql, *result, *where, *layer_name, *locator;
655 size = wr->typename->size;
656 ln_typename = wr->typename->first;
659 if (wr->filter) ln_filter = wr->filter->first;
661 size = wr->featureid->size;
662 mln_fid = wr->featureid->first;
666 for (cpt = 0; cpt < size; cpt++) {
698 else if (wr->bbox) where =
fe_kvp_bbox(o, wr, layer_name, wr->bbox);
725 if (wr->featureid) mln_fid = mln_fid->
next;
726 if (wr->typename) ln_typename = ln_typename->
next;
727 if (wr->filter) ln_filter = ln_filter->
next;
751 buffer *
typename, *layer_name, *xmlstring, *result, *sql, *s, *t;
769 if (!layer_name || !s || !t) {
772 result =
buffer_from_str(
"Typename provided is unknown or not writable");
793 while (n->type != XML_ELEMENT_NODE) n = n->next;
801 filter =
fe_filter(o, filter,
typename, xmlstring);
828 buffer *
typename, *layer_name, *xmlstring, *result, *sql, *property_name, *values, *gml, *s, *t;
830 xmlNodePtr node, elemt;
835 xmlChar *attr = NULL;
845 s = t = result = layer_name = NULL;
851 if (xmlHasProp(n, (xmlChar *)
"srsName")) {
852 attr = xmlGetProp(n, (xmlChar *)
"srsName");
874 if (!layer_name || !s || !t) {
878 result =
buffer_from_str(
"Typename provided is unknown or not writable");
891 while (n->type != XML_ELEMENT_NODE) n = n->next;
896 for (; n; n = n->next) {
899 if (n->type == XML_ELEMENT_NODE) {
900 if (!strcmp((
char *) n->name,
"Property")) {
903 while (node->type != XML_ELEMENT_NODE) node = node->next;
907 if ( !strcmp(
"http://www.opengis.net/gml", (
char *) node->ns->href)
908 || !strcmp(
"http://www.opengis.net/gml/3.2", (
char *) node->ns->href)) {
910 if (!
array_is_key(table, (
char *) node->name))
continue;
916 if (!strcmp((
char *) node->name,
"Name")) {
917 content = xmlNodeGetContent(node);
937 if (node && node->type != XML_ELEMENT_NODE) node = node->next;
941 else if (!strcmp((
char *) node->name,
"Value")) {
943 elemt = node->children;
946 while (elemt->type != XML_ELEMENT_NODE) elemt = elemt->next;
948 if (!strcmp((
char *) elemt->name,
"Box") ||
949 !strcmp((
char *) elemt->name,
"Envelope")) {
969 }
else if (!strcmp((
char *) elemt->name,
"Null")) {
995 if (!strcmp((
char *) n->name,
"Filter")) {
1001 filter =
fe_filter(o, filter,
typename, xmlstring);
1022 if (n->next && !strcmp((
char *) n->next->name,
"Property"))
buffer_add_str(sql,
",");
1049 buffer *sql, *result, *end_transaction, *locator;
1060 xmldoc = xmlParseMemory(op->
buf, op->
use);
1069 n = xmldoc->children;
1070 while (n->type != XML_ELEMENT_NODE) n = n->next;
1072 while (n->type != XML_ELEMENT_NODE) n = n->next;
1083 for ( ; n && (
buffer_cmp(result,
"PGRES_COMMAND_OK")) ; n = n->next) {
1084 if (n->type != XML_ELEMENT_NODE)
continue;
1086 if (!strcmp((
char *) n->name,
"Insert")) {
1089 }
else if (!strcmp((
char *) n->name,
"Delete")) {
1092 }
else if (!strcmp((
char *) n->name,
"Update")) {
1098 if (!
buffer_cmp(result,
"PGRES_COMMAND_OK")) {
1101 if (n->properties) {
1102 att = n->properties;
1104 if (!strcmp((
char *) att->name,
"handle")) {
1105 content = xmlNodeGetContent(att->children);
void buffer_add(buffer *buf, char c)
int ows_version_get(ows_version *v)
void list_add_by_copy(list *l, buffer *value)
void buffer_empty(buffer *buf)
filter_encoding * fe_filter(ows *o, filter_encoding *fe, buffer *typename, buffer *xmlchar)
buffer * wfs_request_remove_prop_ns_prefix(ows *o, buffer *prop, list *layer_name)
buffer * fill_fe_error(ows *o, filter_encoding *fe)
PGresult * ows_psql_exec(ows *o, const char *sql)
buffer * ows_psql_gml_to_sql(ows *o, xmlNodePtr n, const ows_srs *parent_srs)
void buffer_copy(buffer *dest, const buffer *src)
bool array_is_value(const array *a, const char *value)
void fe_error(ows *o, filter_encoding *fe)
filter_encoding * filter_encoding_init()
bool buffer_cmp(const buffer *buf, const char *str)
buffer * array_get_key(const array *a, const char *value)
buffer * fe_envelope(ows *o, buffer *typename, filter_encoding *fe, buffer *envelope, xmlNodePtr n)
void buffer_add_str(buffer *buf, const char *str)
bool ows_srs_set_from_srsname(ows *o, ows_srs *s, const char *srsname)
buffer * cgi_add_xml_into_buffer(buffer *element, xmlNodePtr n)
char * ows_psql_escape_string(ows *o, const char *content)
array * ows_layer_list_namespaces(ows_layer_list *ll)
buffer * ows_psql_id_column(ows *o, buffer *layer_name)
void wfs_error(ows *o, wfs_request *wf, enum wfs_error_code code, char *message, char *locator)
void ows_error(ows *o, enum ows_error_code code, char *message, char *locator)
void array_free(array *a)
void filter_encoding_free(filter_encoding *fe)
void buffer_add_head_str(buffer *buf, char *str)
buffer * buffer_replace(buffer *buf, char *before, char *after)
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)
void buffer_shift(buffer *buf, size_t len)
buffer * ows_layer_ns_prefix(ows_layer_list *ll, buffer *layer_name_prefix)
void alist_add(alist *al, buffer *key, buffer *value)
bool ows_psql_is_geometry_column(ows *o, buffer *layer_name, buffer *column)
buffer * ows_layer_ns_uri(ows_layer_list *ll, buffer *ns_prefix)
buffer * ows_psql_generate_id(ows *o, buffer *layer_name)
void ows_srs_free(ows_srs *c)
buffer * ows_psql_table_name(ows *o, buffer *layer_name)
bool ows_layer_writable(const ows_layer_list *ll, const buffer *name)
list * list_explode(char separator, const buffer *value)
buffer * fe_kvp_featureid(ows *o, wfs_request *wr, buffer *layer_name, list *fid)
bool check_regexp(const char *str_request, const char *str_regex)
buffer * fe_kvp_bbox(ows *o, wfs_request *wr, buffer *layer_name, ows_bbox *bbox)
buffer * ows_layer_prefix_to_uri(ows_layer_list *ll, buffer *layer_name_prefix)
buffer * ows_psql_schema_name(ows *o, buffer *layer_name)
struct List_node list_node
struct Mlist_node mlist_node
@ WFS_ERROR_INVALID_PARAMETER
@ WFS_ERROR_MISSING_PARAMETER
struct Alist_node alist_node
@ OWS_ERROR_FORBIDDEN_CHARACTER
struct Filter_encoding filter_encoding
char * buf
size to next realloc
enum fe_error_code error_code
static buffer * wfs_execute_transaction_request(ows *o, wfs_request *wr, buffer *sql)
static void wfs_transaction_insert_result(ows *o, wfs_request *wr, buffer *result)
static buffer * wfs_retrieve_value(ows *o, wfs_request *wr, buffer *value, xmlDocPtr xmldoc, xmlNodePtr n)
void wfs_delete(ows *o, wfs_request *wr)
static void wfs_transaction_result(ows *o, wfs_request *wr, buffer *result, buffer *locator)
void wfs_parse_operation(ows *o, wfs_request *wr, buffer *op)
static buffer * wfs_delete_xml(ows *o, wfs_request *wr, xmlNodePtr n)
static buffer * wfs_update_xml(ows *o, wfs_request *wr, xmlDocPtr xmldoc, xmlNodePtr n)
static buffer * wfs_retrieve_typename(ows *o, wfs_request *wr, xmlNodePtr n)
static void wfs_transaction_response(ows *o, wfs_request *wr, buffer *result, buffer *locator)
static buffer * wfs_insert_xml(ows *o, wfs_request *wr, xmlDocPtr xmldoc, xmlNodePtr n)
static void wfs_transaction_summary(ows *o, wfs_request *wr, buffer *result)