src/server/plugins/postgresql/webdav.c

Sun, 27 Nov 2022 13:33:30 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 27 Nov 2022 13:33:30 +0100
changeset 443
ef3c8a0e1fee
parent 415
d938228c382e
child 479
2a42ba73ecdd
permissions
-rw-r--r--

improve daemon startup
parent will wait until daemon is started and returns error code if startup failed
daemon startup log messages will be printed by parent

299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2022 Olaf Wintermann. All rights reserved.
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "webdav.h"
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
30 #include "vfs.h"
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 356
diff changeset
31 #include "config.h"
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
32
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
33 #include "../../util/util.h"
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
34 #include "../../util/pblock.h"
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
35
348
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
36 #include "../../daemon/http.h" // etag
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
37
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
38 #include <cx/buffer.h>
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
39 #include <cx/utils.h>
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
40 #include <cx/printf.h>
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
41 #include <libxml/tree.h>
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
43
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 static WebdavBackend pg_webdav_backend = {
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 pg_dav_propfind_init,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 pg_dav_propfind_do,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 pg_dav_propfind_finish,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 pg_dav_proppatch_do,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 pg_dav_proppatch_finish,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 NULL, // opt_mkcol
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 NULL, // opt_mkcol_finish
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 NULL, // opt_delete
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 NULL, // opt_delete_finish
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 0,
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
55 NULL,
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 NULL
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 };
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
59
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
60
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
61 /*
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
62 * SQL query components
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
63 */
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
64
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
65 /*
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
66 * PROPFIND queries are build from components:
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
67 *
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
68 * cte cte_recursive or empty
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
69 * select
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
70 * ppath ppath column
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
71 * cols list of columns
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
72 * ext_cols* list of extension columns
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
73 * from from [table] / from cte
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
74 * prop_join join with property table, allprop or plist
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
75 * ext_join* extension table join
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
76 * where different where clauses for depth0 and depth1
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
77 * order depth0 doesn't need order
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
78 */
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
79
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
80 static const char *sql_propfind_cte_recursive = "\
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
81 with recursive resolvepath as (\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
82 select\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
83 '' as ppath,\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
84 *\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
85 from Resource\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
86 where resource_id = $1 \n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
87 union\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
88 select\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
89 p.ppath || '/' || r.nodename,\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
90 r.*\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
91 from Resource r\n\
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
92 inner join resolvepath p on r.parent_id = p.resource_id\n\
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
93 )\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
94
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
95 static const char *sql_propfind_select = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
96 select\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
97
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
98 static const char *sql_propfind_ppath_depth0 = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
99 $2::text as ppath,\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
100
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
101 static const char *sql_propfind_ppath_depth1 = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
102 case when r.resource_id = $1 then $2\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
103 else $2 || '/' || r.nodename\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
104 end as ppath,\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
105
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
106 static const char *sql_propfind_ppath_depth_infinity = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
107 case when r.resource_id = $1 then $2\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
108 else $2 || r.ppath\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
109 end as ppath,\n";
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
110
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
111 static const char *sql_propfind_cols = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
112 r.resource_id,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
113 r.parent_id,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
114 r.nodename,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
115 r.iscollection,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
116 r.lastmodified,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
117 r.creationdate,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
118 r.contentlength,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
119 r.etag,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
120 p.prefix,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
121 p.xmlns,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
122 p.pname,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
123 p.lang,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
124 p.nsdeflist,\n\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
125 p.pvalue\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
126
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
127 static const char *sql_propfind_from_table = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
128 from Resource r\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
129
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
130 static const char *sql_propfind_from_cte = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
131 from resolvepath r\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
132
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
133 static const char *sql_propfind_propjoin_allprop = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
134 left join Property p on r.resource_id = p.resource_id\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
135
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
136 static const char *sql_propfind_propjoin_plist = "\
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
137 left join (\n\
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
138 select p.* from Property p\
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
139 inner join (select unnest($3::text[]) as xmlns, unnest($4::text[]) as pname) n\n\
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
140 on p.xmlns = n.xmlns and p.pname = n.pname\n\
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
141 ) p on r.resource_id = p.resource_id\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
142
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
143 static const char *sql_propfind_where_depth0 = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
144 where r.resource_id = $1\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
145
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
146 static const char *sql_propfind_where_depth1 = "\
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
147 where r.resource_id = $1 or r.parent_id = $1\n";
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
148
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
149 static const char *sql_propfind_order_depth1 = "\
401
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
150 order by case when r.resource_id = $1 then 0 else 1 end, r.nodename, r.resource_id";
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
151
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
152 static const char *sql_propfind_order_depth_infinity = "\
401
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
153 order by replace(ppath, '/', chr(1)), r.resource_id";
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
154
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
155 /*
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
156 * SQL Queries
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
157 */
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
158
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
159
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
160 // proppatch: set property
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
161 // params: $1: resource_id
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
162 // $2: xmlns prefix
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
163 // $3: xmlns href
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
164 // $4: property name
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
165 // $5: lang attribute value
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
166 // $6: namespace list string
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
167 // $7: property value
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
168 static const char *sql_proppatch_set = "\
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
169 insert into Property(resource_id, prefix, xmlns, pname, lang, nsdeflist, pvalue)\n\
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
170 values($1, $2, $3, $4, $5, $6, $7)\n\
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
171 on conflict (resource_id, xmlns, pname) do\n\
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
172 update set prefix=$2, lang=$5, nsdeflist=$6, pvalue=$7;";
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
173
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
174 // proppatch: remove property
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
175 // params: $1: resource_id
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
176 // $2: xmlns href
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
177 // $3: property name
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
178 static const char *sql_proppatch_remove = "\
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
179 delete from Property where resource_id = $1 and xmlns = $2 and pname = $3";
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
180
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
181
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 356
diff changeset
182 void* pg_webdav_init(ServerConfiguration *cfg, pool_handle_t *pool, WSConfigNode *config) {
372
1d2538a1ba8f add config option for pg root node lookup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
183 return pg_init_repo(cfg, pool, config);
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 356
diff changeset
184 }
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 356
diff changeset
185
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 356
diff changeset
186 WebdavBackend* pg_webdav_create(Session *sn, Request *rq, pblock *pb, void *initData) {
370
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
187 PgRepository *repo = initData;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
188
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
189 char *resource_pool;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
190 if(repo) {
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
191 resource_pool = repo->resourcepool.ptr;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
192 } else {
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
193 // resourcepool is required
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
194 resource_pool = pblock_findval("resourcepool", pb);
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
195 if(!resource_pool) {
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
196 log_ereport(LOG_MISCONFIG, "pg_webdav_create: missing resourcepool parameter");
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
197 return NULL;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
198 }
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
199 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
200
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
201 // get the resource first (should only fail in case of misconfig)
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
202 ResourceData *resdata = resourcepool_lookup(sn, rq, resource_pool, 0);
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
203 if(!resdata) {
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
204 log_ereport(LOG_MISCONFIG, "postgresql webdav: resource pool %s not found", resource_pool);
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
205 return NULL;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
206 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
207
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
208 return pg_webdav_create_from_resdata(sn, rq, repo, resdata);
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
209 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
210
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
211 WebdavBackend* pg_webdav_create_from_resdata(Session *sn, Request *rq, PgRepository *repo, ResourceData *resdata) {
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
212 WebdavBackend *webdav = pool_malloc(sn->pool, sizeof(WebdavBackend));
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
213 if(!webdav) {
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
214 return NULL;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
215 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
216 *webdav = pg_webdav_backend;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
217
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
218 PgWebdavBackend *instance = pool_malloc(sn->pool, sizeof(PgWebdavBackend));
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
219 if(!instance) {
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
220 pool_free(sn->pool, webdav);
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
221 return NULL;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
222 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
223 webdav->instance = instance;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
224
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
225 instance->pg_resource = resdata;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
226 instance->connection = resdata->data;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
227
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
228 instance->repository = repo;
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
229 snprintf(instance->root_resource_id_str, 32, "%" PRId64, repo->root_resource_id);
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
230
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
231 return webdav;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
232 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
233
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
234 WebdavBackend* pg_webdav_prop_create(Session *sn, Request *rq, pblock *pb) {
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
235 return NULL;
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
236 }
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
237
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
238 /*
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
239 * adds str to the buffer
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
240 * some characters will be escaped: \,{}
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
241 */
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
242 static void buf_addstr_escaped(CxBuffer *buf, const char *str) {
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
243 size_t len = strlen(str);
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
244 for(size_t i=0;i<len;i++) {
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
245 char c = str[i];
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
246 if(c == '{' || c == '}' || c == ',' || c == '\\') {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
247 cxBufferPut(buf, '\\');
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
248 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
249 cxBufferPut(buf, c);
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
250 }
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
251 }
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
252
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
253 /*
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
254 * convert a property list to two pg array parameter strings
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
255 * array format: {elm1,elm2,elm3}
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
256 * xmlns: buffer for the xmlns array
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
257 * pname: buffer for the property name array
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
258 *
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
259 * returns 0 on success, 1 otherwise
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
260 */
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
261 int pg_create_property_param_arrays(WebdavPList *plist, CxBuffer *xmlns, CxBuffer *pname) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
262 cxBufferPut(xmlns, '{');
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
263 cxBufferPut(pname, '{');
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
264 while(plist) {
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
265 WebdavProperty *property = plist->property;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
266 if(property && property->namespace && property->namespace->href && property->name) {
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
267 buf_addstr_escaped(xmlns, (const char*)property->namespace->href);
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
268 buf_addstr_escaped(pname, (const char*)property->name);
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
269 if(plist->next) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
270 cxBufferPut(xmlns, ',');
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
271 cxBufferPut(pname, ',');
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
272 }
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
273 }
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
274 plist = plist->next;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
275 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
276 int r1 = cxBufferWrite("}\0", 2, 1, xmlns) == 0;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
277 int r2 = cxBufferWrite("}\0", 2, 1, pname) == 0;
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
278 return r1+r2 != 0;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
279 }
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
280
303
ad9ba51c8634 add pg webdav backend initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 300
diff changeset
281
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
282 static int propfind_ext_cmp(const void *f1, const void *f2) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
283 const PgPropfindExtCol *e1 = f1;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
284 const PgPropfindExtCol *e2 = f2;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
285
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
286 if(e1->ext->tableindex != e2->ext->tableindex) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
287 return e1->ext->tableindex < e2->ext->tableindex ? -1 : 1;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
288 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
289
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
290 return 0;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
291 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
292
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
293
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
294 static int pg_create_propfind_query(
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
295 WebdavPropfindRequest *rq,
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
296 WSBool iscollection,
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
297 PgPropfindExtCol *ext,
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
298 size_t numext,
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
299 CxBuffer *sql)
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
300 {
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
301 PgWebdavBackend *pgdav = rq->dav->instance;
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
302 PgRepository *repo = pgdav->repository;
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
303 int depth = !iscollection ? 0 : rq->depth;
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
304
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
305 /*
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
306 * PROPFIND queries are build from components:
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
307 *
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
308 * cte cte_recursive or empty
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
309 * select
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
310 * ppath ppath column
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
311 * cols list of columns
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
312 * ext_cols* list of extension columns
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
313 * from from [table] / from cte
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
314 * prop_join join with property table, allprop or plist
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
315 * ext_join* extension table join
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
316 * where different where clauses for depth0 and depth1
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
317 * order depth0 doesn't need order
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
318 */
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
319
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
320 // CTE
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
321 if(depth == -1) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
322 cxBufferPutString(sql, sql_propfind_cte_recursive);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
323 }
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
324
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
325 // select
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
326 cxBufferPutString(sql, sql_propfind_select);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
327
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
328 // ppath
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
329 switch(depth) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
330 case 0: cxBufferPutString(sql, sql_propfind_ppath_depth0); break;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
331 case 1: cxBufferPutString(sql, sql_propfind_ppath_depth1); break;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
332 case -1: cxBufferPutString(sql, sql_propfind_ppath_depth_infinity); break;
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
333 }
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
334
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
335 // cols
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
336 cxBufferPutString(sql, sql_propfind_cols);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
337
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
338 // ext_cols
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
339 if(ext) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
340 if(rq->allprop) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
341 for(int i=0;i<repo->ntables;i++) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
342 cx_bprintf(sql, ",x%d.*\n", i);
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
343 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
344 } else {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
345 for(int i=0;i<numext;i++) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
346 PgPropfindExtCol e = ext[i];
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
347 cx_bprintf(sql, ",x%d.%s\n", e.ext->tableindex, e.ext->column);
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
348 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
349 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
350 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
351
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
352 // from
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
353 cxBufferPutString(sql, depth == -1 ? sql_propfind_from_cte : sql_propfind_from_table);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
354
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
355 // prop join
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
356 cxBufferPutString(sql, rq->allprop ? sql_propfind_propjoin_allprop : sql_propfind_propjoin_plist);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
357
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
358 // ext_join
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
359 if(ext) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
360 if(rq->allprop) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
361 for(int i=0;i<repo->ntables;i++) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
362 cx_bprintf(sql, "left join %s x%d on r.resource_id = x%d.resource_id\n", repo->tables[i].table, i, i);
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
363 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
364 } else {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
365 int tab = -1;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
366 for(int i=0;i<numext;i++) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
367 PgPropfindExtCol e = ext[i];
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
368 if(e.ext->tableindex != tab) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
369 tab = e.ext->tableindex;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
370 cx_bprintf(sql, "left join %s x%d on r.resource_id = x%d.resource_id\n", repo->tables[tab].table, tab, tab);
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
371 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
372 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
373 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
374
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
375 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
376
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
377 // where
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
378 if(depth == 0) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
379 cxBufferPutString(sql, sql_propfind_where_depth0);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
380 } else if(depth == 1) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
381 cxBufferPutString(sql, sql_propfind_where_depth1);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
382 }
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
383
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
384 // order
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
385 if(depth == 1) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
386 cxBufferPutString(sql, sql_propfind_order_depth1);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
387 } else if(depth == -1) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
388 cxBufferPutString(sql, sql_propfind_order_depth_infinity);
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
389 }
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
390
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
391 // end
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
392 cxBufferWrite(";\0", 1, 2, sql);
401
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
393
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
394 return 0;
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
395 }
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
396
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
397 int pg_dav_propfind_init(
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
398 WebdavPropfindRequest *rq,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
399 const char *path,
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
400 const char *href,
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
401 WebdavPList **outplist)
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
402 {
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
403 PgWebdavBackend *pgdav = rq->dav->instance;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
404 CxAllocator *a = pool_allocator(rq->sn->pool);
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
405
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
406 // first, check if the resource exists
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
407 // if it doesn't exist, we can return immediately
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
408 int64_t parent_id;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
409 int64_t resource_id;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
410 const char *resourcename;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
411 WSBool iscollection;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
412 int res_errno = 0;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
413 int err = pg_resolve_path(
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
414 pgdav->connection,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
415 path,
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
416 pgdav->root_resource_id_str,
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
417 &parent_id,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
418 &resource_id,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
419 NULL, // OID
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
420 &resourcename,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
421 &iscollection,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
422 NULL, // stat
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
423 NULL, // etag
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
424 &res_errno);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
425
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
426 if(err) {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
427 if(res_errno == ENOENT) {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
428 protocol_status(rq->sn, rq->rq, PROTOCOL_NOT_FOUND, NULL);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
429 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
430 return 1;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
431 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
432
380
0f85d9bde309 pg propfind stores resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
433 // store resource_id in rq->vars, maybe some other modules
0f85d9bde309 pg propfind stores resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
434 // like to use it
0f85d9bde309 pg propfind stores resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
435 char resource_id_str[32];
0f85d9bde309 pg propfind stores resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
436 snprintf(resource_id_str, 32, "%" PRId64, resource_id);
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
437 pblock_nvinsert("resource_id", resource_id_str, rq->rq->vars);
380
0f85d9bde309 pg propfind stores resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
438
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
439 // create a list of requsted extended properties
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
440 PgPropfindExtCol *ext;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
441 size_t numext;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
442 if(pgdav->repository->ntables == 0) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
443 // no property extensions configured
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
444 ext = NULL;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
445 numext = 0;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
446 } else {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
447 numext = pgdav->repository->prop_ext->size;
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
448 ext = pool_calloc(rq->sn->pool, numext, sizeof(PgPropfindExtCol));
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
449
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
450 if(rq->allprop) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
451 // the map pgdav->repository->prop_ext contains all property extensions
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
452 // we can just convert the map to an array
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
453 CxIterator i = cxMapIteratorValues(pgdav->repository->prop_ext);
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
454 int j = 0;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
455 cx_foreach(PgPropertyStoreExt *, cfg_ext, i) {
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
456 PgPropfindExtCol extcol;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
457 extcol.ext = cfg_ext;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
458 extcol.field_num = -1; // get the field_num after the PQexec
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
459 ext[j++] = extcol;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
460 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
461 } else {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
462 WebdavPListIterator i = webdav_plist_iterator(outplist);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
463 WebdavPList *cur;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
464 int j = 0;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
465 while(webdav_plist_iterator_next(&i, &cur)) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
466 WSNamespace *ns = cur->property->namespace;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
467 if(ns) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
468 CxHashKey pkey = webdav_property_key((const char*)ns->href, cur->property->name);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
469 PgPropertyStoreExt *cfg_ext = cxMapGet(pgdav->repository->prop_ext, pkey);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
470 free(pkey.data.bytes);
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
471 if(cfg_ext) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
472 PgPropfindExtCol extcol;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
473 extcol.ext = cfg_ext;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
474 extcol.field_num = -1; // get the field_num after the PQexec
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
475 ext[j++] = extcol;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
476
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
477 webdav_plist_iterator_remove_current(&i);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
478 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
479 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
480 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
481 numext = j;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
482 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
483
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
484 qsort(ext, numext, sizeof(PgPropfindExtCol), propfind_ext_cmp);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
485 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
486
375
32b8017f5308 build pg propfind query from components
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
487 // create sql query
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
488 const char *query = NULL;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
489 CxBuffer sql;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
490 if(cxBufferInit(&sql, NULL, 2048, a, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
491 return 1;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
492 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
493
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
494 if(pg_create_propfind_query(rq, iscollection, ext, numext, &sql)) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
495 return 1;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
496 }
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
497 query = sql.space;
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
498
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
499 // get all resources and properties
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
500 size_t href_len = strlen(href);
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
501 char *href_param = pool_malloc(rq->sn->pool, href_len + 1);
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
502 memcpy(href_param, href, href_len);
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
503 if(href_param[href_len-1] == '/') {
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
504 href_len--;
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
505 }
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
506 href_param[href_len] = '\0';
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
507
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
508 // if allprop is false, create array pair for xmlns/property names
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
509 CxBuffer xmlns_buf;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
510 CxBuffer pname_buf;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
511 WSBool buf_initialized = FALSE;
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
512 char *xmlns_param = NULL;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
513 char *pname_param = NULL;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
514 int nparam = 2;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
515 if(!rq->allprop) {
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
516 size_t bufsize = rq->propcount < 200 ? 8 + rq->propcount * 32 : 4096;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
517 if(cxBufferInit(&xmlns_buf, NULL, bufsize, a, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
518 return 1;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
519 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
520 if(cxBufferInit(&pname_buf, NULL, bufsize, a, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
521 cxBufferDestroy(&xmlns_buf);
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
522 return 1;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
523 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
524 if(pg_create_property_param_arrays(*outplist, &xmlns_buf, &pname_buf)) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
525 cxBufferDestroy(&xmlns_buf);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
526 cxBufferDestroy(&pname_buf);
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
527 return 1;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
528 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
529 buf_initialized = TRUE;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
530 xmlns_param = xmlns_buf.space;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
531 pname_param = pname_buf.space;
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
532 nparam = 4;
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
533 }
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
534
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
535
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
536
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
537 const char* params[4] = { resource_id_str, href_param, xmlns_param, pname_param };
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
538 PGresult *result = PQexecParams(
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
539 pgdav->connection,
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
540 query,
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
541 nparam, // number of parameters
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
542 NULL,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
543 params, // parameter value
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
544 NULL,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
545 NULL,
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
546 0); // 0: result in text format
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
547 int nrows = PQntuples(result);
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
548 pool_free(rq->sn->pool, href_param);
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
549 if(buf_initialized) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
550 cxBufferDestroy(&xmlns_buf);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
551 cxBufferDestroy(&pname_buf);
315
b608b7aa43a6 fix sql query for selecting specific properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 314
diff changeset
552 }
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
553 if(nrows < 1) {
401
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
554 // we resolved the path, so the resource exists and nrows should
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
555 // be >= 1
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
556 if(PQresultStatus(result) != PGRES_TUPLES_OK) {
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
557 log_ereport(LOG_FAILURE, "pg_dav_propfind_init: %s", PQerrorMessage(pgdav->connection));
d2bfd11d3f8f fix invalid propfind pg queries created for allprop requests on collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 384
diff changeset
558 }
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
559 PQclear(result);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
560 return 1;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
561 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
562
300
0e3f275b2492 add instance field to webdav backend struct
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
563 PgPropfind *pg = pool_malloc(rq->sn->pool, sizeof(PgPropfind));
0e3f275b2492 add instance field to webdav backend struct
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
564 rq->userdata = pg;
0e3f275b2492 add instance field to webdav backend struct
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
565
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
566 pg->path = path;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
567 pg->resource_id = resource_id;
331
ab26980faad6 implement allprop in default and postgresql webdav backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 324
diff changeset
568 pg->vfsproperties = webdav_vfs_properties(outplist, TRUE, rq->allprop, 0);
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
569 pg->result = result;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
570 pg->nrows = nrows;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
571
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
572 pg->ext = ext;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
573 pg->numext = numext;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
574 if(ext) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
575 // get field_nums for all property extensions
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
576 for(int i=0;i<numext;i++) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
577 PgPropfindExtCol *c = &ext[i];
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
578 c->field_num = PQfnumber(result, c->ext->column);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
579 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
580 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
581
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
582 return 0;
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
583 }
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
584
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
585 int pg_dav_propfind_do(
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
586 WebdavPropfindRequest *rq,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
587 WebdavResponse *response,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
588 VFS_DIR parent,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
589 WebdavResource *resource,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
590 struct stat *s)
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
591 {
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
592 PgPropfind *pg = rq->userdata;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
593 pool_handle_t *pool = rq->sn->pool;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
594 PGresult *result = pg->result;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
595 WebdavVFSProperties vfsprops = pg->vfsproperties;
378
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
596
313
3ad0b65ec838 test pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 312
diff changeset
597 WSBool vfsprops_set = 0; // are live properties added to the response?
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
598 WSBool extprops_set = 0; // are extended properties added to the response?
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
599 int64_t current_resource_id = pg->resource_id;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
600 for(int r=0;r<pg->nrows;r++) {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
601 // columns:
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
602 // 0: path
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
603 // 1: resource_id
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
604 // 2: parent_id
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
605 // 3: nodename
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
606 // 4: iscollection
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
607 // 5: lastmodified
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
608 // 6: creationdate
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
609 // 7: contentlength
348
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
610 // 8: etag
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
611 // 9: property prefix
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
612 // 10: property xmlns
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
613 // 11: property name
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
614 // 12: property lang
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
615 // 13: property nsdeflist
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
616 // 14: property value
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
617
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
618 char *path = PQgetvalue(result, r, 0);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
619 char *res_id = PQgetvalue(result, r, 1);
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
620 char *iscollection_str = PQgetvalue(result, r, 4);
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
621 WSBool iscollection = iscollection_str && iscollection_str[0] == 't';
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
622 int64_t resource_id;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
623 if(!util_strtoint(res_id, &resource_id)) {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
624 log_ereport(LOG_FAILURE, "pg_dav_propfind_do: cannot convert resource_id '%s' to int", res_id);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
625 return 1;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
626 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
627
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
628 if(resource_id != current_resource_id) {
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
629 // create a href string for the new resource
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
630 // if the resource is a collection, it should have a trailing '/'
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
631 size_t pathlen = strlen(path);
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
632 if(pathlen == 0) {
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
633 log_ereport(LOG_FAILURE, "pg_dav_propfind_do: query returned invalid path");
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
634 return 1;
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
635 }
356
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
636 if(pathlen > PG_MAX_PATH_LEN) {
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
637 log_ereport(LOG_FAILURE, "pg_dav_propfind_do: path too long: resource_id: %s", res_id);
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
638 return 1;
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
639 }
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
640 char *newres_href = pool_malloc(pool, (pathlen*3)+2);
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
641 util_uri_escape(newres_href, path);
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
642 if(iscollection && path[pathlen-1] != '/') {
356
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
643 size_t newres_href_len = strlen(newres_href);
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
644 newres_href[newres_href_len] = '/';
eebc3d32c7c1 escape child href in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
645 newres_href[newres_href_len+1] = '\0';
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
646 }
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
647
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
648 // new resource
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
649 resource = response->addresource(response, newres_href);
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
650 vfsprops_set = FALSE;
378
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
651 extprops_set = FALSE;
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
652 current_resource_id = resource_id;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
653 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
654
313
3ad0b65ec838 test pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 312
diff changeset
655 // standard webdav live properties
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
656 if(!vfsprops_set) {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
657 if(vfsprops.getresourcetype) {
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
658 if(iscollection) {
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
659 resource->addproperty(resource, webdav_resourcetype_collection(), 200);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
660 } else {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
661 resource->addproperty(resource, webdav_resourcetype_empty(), 200);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
662 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
663 }
348
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
664
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
665 char *lastmodified = PQgetvalue(result, r, 5);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
666 char *contentlength = PQgetvalue(result, r, 7);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
667 time_t t = pg_convert_timestamp(lastmodified);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
668
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
669 if(vfsprops.getlastmodified) {
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 309
diff changeset
670 struct tm tm;
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 309
diff changeset
671 gmtime_r(&t, &tm);
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 309
diff changeset
672
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 309
diff changeset
673 char buf[HTTP_DATE_LEN+1];
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 309
diff changeset
674 strftime(buf, HTTP_DATE_LEN, HTTP_DATE_FMT, &tm);
314
6b1a6066ee43 fix pg propfind for getlastmodified property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 313
diff changeset
675 webdav_resource_add_dav_stringproperty(resource, pool, "getlastmodified", buf, strlen(buf));
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
676 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
677 if(vfsprops.creationdate) {
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
678 char *creationdate = PQgetvalue(result, r, 6);
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 309
diff changeset
679 webdav_resource_add_dav_stringproperty(resource, pool, "creationdate", creationdate, strlen(creationdate));
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
680 }
314
6b1a6066ee43 fix pg propfind for getlastmodified property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 313
diff changeset
681 if(vfsprops.getcontentlength && !iscollection) {
309
fc021bd576d4 implement pg getcontentlength property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 307
diff changeset
682 webdav_resource_add_dav_stringproperty(resource, pool, "getcontentlength", contentlength, strlen(contentlength));
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
683 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
684 if(vfsprops.getetag) {
348
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
685 char *etag = PQgetvalue(result, r, 8);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
686 if(!PQgetisnull(result, r, 8)) {
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
687 webdav_resource_add_dav_stringproperty(resource, pool, "getetag", etag, strlen(etag));
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
688 } else {
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
689 int64_t ctlen;
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
690 if(util_strtoint(contentlength, &ctlen)) {
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
691 char etag[MAX_ETAG];
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
692 http_format_etag(rq->sn, rq->rq, etag, MAX_ETAG, ctlen, t);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
693 webdav_resource_add_dav_stringproperty(resource, pool, "getetag", etag, strlen(etag));
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
694 }
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
695 }
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
696 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
697
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
698 vfsprops_set = TRUE;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
699 }
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
700
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
701 if(!extprops_set) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
702 // extended properties
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
703 if(pg->ext) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
704 for(int extc=0;extc<pg->numext;extc++) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
705 PgPropfindExtCol ext = pg->ext[extc];
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
706 int fieldnum = ext.field_num;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
707
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
708 if(!PQgetisnull(result, r, fieldnum)) {
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
709 char *ext_value = PQgetvalue(result, r, fieldnum);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
710 int ext_value_len = PQgetlength(result, r, fieldnum);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
711 char ext_xmlns_prefix[32];
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
712 snprintf(ext_xmlns_prefix, 32, "x%d", ext.ext->tableindex);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
713
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
714 WebdavProperty *property = pool_malloc(pool, sizeof(WebdavProperty));
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
715 property->lang = NULL;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
716 property->name = pool_strdup(pool, ext.ext->name);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
717
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
718 xmlNs *namespace = pool_malloc(pool, sizeof(xmlNs));
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
719 memset(namespace, 0, sizeof(struct _xmlNs));
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
720 namespace->href = (xmlChar*)pool_strdup(pool, ext.ext->ns);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
721 namespace->prefix = (xmlChar*)pool_strdup(pool, ext_xmlns_prefix);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
722 property->namespace = namespace;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
723
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
724 char *content = pool_malloc(pool, ext_value_len+1);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
725 memcpy(content, ext_value, ext_value_len);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
726 content[ext_value_len] = '\0';
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
727
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
728 WebdavNSList *nslist = pool_malloc(pool, sizeof(WebdavNSList));
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
729 nslist->namespace = namespace;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
730 nslist->prev = NULL;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
731 nslist->next = NULL;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
732
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
733 property->vtype = WS_VALUE_XML_DATA;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
734 property->value.data.data = content;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
735 property->value.data.length = ext_value_len;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
736 property->value.data.namespaces = nslist;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
737
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
738 resource->addproperty(resource, property, 200);
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
739 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
740 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
741 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
742
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
743 extprops_set = TRUE;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
744 }
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
745
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
746 // dead properties
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
747 if(!PQgetisnull(result, r, 9)) {
348
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
748 char *prefix = PQgetvalue(result, r, 9);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
749 char *xmlns = PQgetvalue(result, r, 10);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
750 char *pname = PQgetvalue(result, r, 11);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
751 char *lang = PQgetvalue(result, r, 12);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
752 char *nsdef = PQgetvalue(result, r, 13);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
753 char *pvalue = PQgetvalue(result, r, 14);
317
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
754
348
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
755 int pvalue_len = PQgetlength(result, r, 14);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
756 WSBool lang_isnull = PQgetisnull(result, r, 12);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
757 WSBool nsdef_isnull = PQgetisnull(result, r, 13);
bdd31584141f implement etag in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
758 WSBool pvalue_isnull = PQgetisnull(result, r, 14);
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
759
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
760 WebdavProperty *property = pool_malloc(pool, sizeof(WebdavProperty));
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
761 property->lang = NULL;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
762 property->name = pool_strdup(pool, pname);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
763
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
764 xmlNs *namespace = pool_malloc(pool, sizeof(xmlNs));
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
765 memset(namespace, 0, sizeof(struct _xmlNs));
307
8787cb5ebab3 fix href in pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 306
diff changeset
766 namespace->href = (xmlChar*)pool_strdup(pool, xmlns);
317
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
767 namespace->prefix = (xmlChar*)pool_strdup(pool, prefix);
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
768 property->namespace = namespace;
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
769
317
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
770 if(!lang_isnull) {
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
771 property->lang = pool_strdup(pool, lang);
317
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
772 }
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
773
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
774 if(!pvalue_isnull) {
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
775 char *content = pool_malloc(pool, pvalue_len+1);
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
776 memcpy(content, pvalue, pvalue_len);
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
777 content[pvalue_len] = '\0';
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
778
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
779 if(nsdef_isnull) {
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
780 property->vtype = WS_VALUE_TEXT;
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
781 property->value.text.str = content;
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
782 property->value.text.length = pvalue_len;
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
783 } else {
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
784 WebdavNSList *nslist = wsxml_string2nslist(pool, nsdef);
324
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
785 property->vtype = WS_VALUE_XML_DATA;
376
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
786 property->value.data.data = content;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
787 property->value.data.length = pvalue_len;
61d481d3c2e4 Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 375
diff changeset
788 property->value.data.namespaces = nslist;
324
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
789
317
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
790 }
09676b559091 store property prefix in the database
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
791 }
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
792
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
793 resource->addproperty(resource, property, 200);
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
794 }
313
3ad0b65ec838 test pg propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 312
diff changeset
795 }
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
796
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
797 return 0;
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
798 }
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
799
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
800 int pg_dav_propfind_finish(WebdavPropfindRequest *rq) {
312
f7544e220a0f add pg propfind cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
801 PgPropfind *pg = rq->userdata;
f7544e220a0f add pg propfind cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
802 pool_handle_t *pool = rq->sn->pool;
f7544e220a0f add pg propfind cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
803 PGresult *result = pg->result;
f7544e220a0f add pg propfind cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
804
f7544e220a0f add pg propfind cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
805 PQclear(result);
f7544e220a0f add pg propfind cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
806
306
e03737cea6e2 add semi functional pg propfind handler
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 303
diff changeset
807 return 0;
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
808 }
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
809
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
810 enum PgDavProp {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
811 PG_DAV_PROPPATCH_NOT_ALLOWED = 0,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
812 PG_DAV_CREATIONDATE,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
813 PG_DAV_DISPLAYNAME,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
814 PG_DAV_DEADPROP
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
815 };
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
816 /*
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
817 * checks if the property can be manipulated
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
818 */
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
819 static enum PgDavProp proppatch_check_dav_prop(const char *name) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
820 if(!strcmp(name, "getlastmodified")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
821 return PG_DAV_PROPPATCH_NOT_ALLOWED;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
822 } else if(!strcmp(name, "getcontentlength")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
823 return PG_DAV_PROPPATCH_NOT_ALLOWED;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
824 } else if(!strcmp(name, "resourcetype")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
825 return PG_DAV_PROPPATCH_NOT_ALLOWED;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
826 } else if(!strcmp(name, "getetag")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
827 return PG_DAV_PROPPATCH_NOT_ALLOWED;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
828 } else if(!strcmp(name, "creationdate")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
829 return PG_DAV_CREATIONDATE;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
830 } else if(!strcmp(name, "displayname")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
831 return PG_DAV_DISPLAYNAME;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
832 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
833 return PG_DAV_DEADPROP;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
834 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
835
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
836 typedef struct {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
837 WebdavProperty *creationdate;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
838 WebdavProperty *displayname;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
839 int error;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
840 } PgProppatchOpResult;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
841
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
842 typedef int(*pg_proppatch_func)(PgWebdavBackend*, WebdavProppatchRequest*, WebdavResource*, WebdavProperty*, void*);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
843
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
844 /*
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
845 * This function iterates the property list 'plist',
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
846 * analyses if any DAV: property is in the list
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
847 * and calls opfunc for the each property
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
848 *
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
849 * If the property list contains the properties creationdate or displayname,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
850 * the pointers to these properties will be stored in the result structure
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
851 */
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
852 static PgProppatchOpResult pg_proppatch_op(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
853 PgWebdavBackend *pgdav,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
854 WebdavProppatchRequest *request,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
855 WebdavResource *response,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
856 WebdavPList **plist,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
857 enum PgDavProp forbidden_extra,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
858 pg_proppatch_func opfunc,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
859 void *op_userdata)
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
860 {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
861 PgProppatchOpResult result;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
862 result.creationdate = NULL;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
863 result.displayname = NULL;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
864 result.error = 0;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
865
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
866 WebdavPListIterator i = webdav_plist_iterator(plist);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
867 WebdavPList *cur;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
868 while(webdav_plist_iterator_next(&i, &cur)) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
869 WebdavProperty *property = cur->property;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
870 WSNamespace *ns = property->namespace;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
871 if(!ns) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
872 continue; // maybe we should abort
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
873 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
874
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
875 // check if the property is a DAV: property that requires special
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
876 // handling
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
877 // get* properties can't be manipulated
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
878 // some properties can't be removed
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
879 if(!strcmp((const char*)ns->href, "DAV:")) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
880 const char *name = property->name;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
881 enum PgDavProp davprop = proppatch_check_dav_prop(name);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
882 if(davprop != PG_DAV_DEADPROP) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
883 if(davprop == PG_DAV_PROPPATCH_NOT_ALLOWED || davprop == forbidden_extra) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
884 response->addproperty(response, property, 409);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
885 } else if(davprop == PG_DAV_CREATIONDATE) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
886 result.creationdate = property;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
887 } else if(davprop == PG_DAV_DISPLAYNAME) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
888 result.displayname = property;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
889 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
890 webdav_plist_iterator_remove_current(&i);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
891 continue;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
892 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
893 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
894
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
895 // call op func (set, remove specific code)
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
896 if(opfunc(pgdav, request, response, property, op_userdata)) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
897 result.error = 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
898 break;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
899 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
900
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
901 webdav_plist_iterator_remove_current(&i);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
902 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
903
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
904 return result;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
905 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
906
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
907
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
908 static PgPropertyStoreExt* pg_proppatch_prop_get_ext(PgWebdavBackend *pgdav, WebdavProperty *property) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
909 CxHashKey pkey = webdav_property_key((const char*)property->namespace->href, property->name);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
910 PgPropertyStoreExt *ext = cxMapGet(pgdav->repository->prop_ext, pkey);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
911 free(pkey.data.bytes);
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
912 return ext;
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
913 }
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
914
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
915 #define PG_PROPPATCH_EXT_SET 0
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
916 #define PG_PROPPATCH_EXT_REMOVE 1
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
917
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
918 static int pg_proppatch_add_ext_prop(
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
919 pool_handle_t *pool,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
920 PgWebdavBackend *pgdav,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
921 PgProppatch *proppatch,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
922 WebdavProperty *property,
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
923 PgPropertyStoreExt *ext,
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
924 int proppatch_op)
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
925 {
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
926 PgProppatchExtProp *ext_prop = pool_malloc(pool, sizeof(PgProppatchExtProp));
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
927 if(!ext_prop) {
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
928 return 1;
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
929 }
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
930 ext_prop->column = ext;
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
931 ext_prop->property = property;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
932
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
933 CxAllocator *a = pool_allocator(pool);
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
934 proppatch->ext[ext->tableindex].isused = TRUE;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
935
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
936 PgProppatchExtProp **list_begin;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
937 PgProppatchExtProp **list_end;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
938 if(proppatch_op == PG_PROPPATCH_EXT_SET) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
939 list_begin = &proppatch->ext[ext->tableindex].set_begin;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
940 list_end = &proppatch->ext[ext->tableindex].set_end;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
941 } else {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
942 list_begin = &proppatch->ext[ext->tableindex].remove_begin;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
943 list_end = &proppatch->ext[ext->tableindex].remove_end;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
944 }
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
945
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
946 cx_linked_list_add((void**)list_begin, (void**)list_end, -1, offsetof(PgProppatchExtProp, next), ext_prop);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
947
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
948 proppatch->extensions_used = TRUE;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
949
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
950 return 0;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
951 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
952
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
953 static int pg_dav_set_property(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
954 PgWebdavBackend *pgdav,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
955 WebdavProppatchRequest *request,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
956 WebdavResource *response,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
957 WebdavProperty *property,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
958 void *userdata)
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
959 {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
960 pool_handle_t *pool = request->sn->pool;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
961 PgProppatch *proppatch = request->userdata;
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
962 WSNamespace *ns = property->namespace;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
963
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
964 // check if the property belongs to an extension
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
965 if(proppatch->ext && ns) {
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
966 PgPropertyStoreExt *ext = pg_proppatch_prop_get_ext(pgdav, property);
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
967 if(ext) {
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
968 return pg_proppatch_add_ext_prop(pool, pgdav, proppatch, property, ext, PG_PROPPATCH_EXT_SET);
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
969 } // else: property is not stored in an extension table, continue with normal property store
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
970 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
971
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
972 char *resource_id_str = userdata;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
973 int ret = 0;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
974
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
975 // convert the property value to WSXmlData
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
976 // property->vtype == WS_VALUE_XML_NODE should always be true
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
977 WSXmlData *property_value = property->vtype == WS_VALUE_XML_NODE ? wsxml_node2data(pool, property->value.node) : NULL;
324
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
978 char *value_str = NULL;
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
979 char *nsdef_str = NULL;
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
980 if(property_value) {
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
981 value_str = property_value->data;
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
982 if(property_value->namespaces) {
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
983 nsdef_str = wsxml_nslist2string(pool, property_value->namespaces);
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
984 if(!nsdef_str) {
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
985 return 1; // OOM
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
986 }
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
987 }
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
988 }
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
989
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
990 // exec sql
324
44cf877b3d9f add support for xml properties in propfind/proppatch requests (pg)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
991 const char* params[7] = { resource_id_str, (const char*)ns->prefix, (const char*)ns->href, property->name, NULL, nsdef_str, value_str};
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
992 PGresult *result = PQexecParams(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
993 pgdav->connection,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
994 sql_proppatch_set,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
995 7, // number of parameters
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
996 NULL,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
997 params, // parameter value
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
998 NULL,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
999 NULL,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1000 0); // 0: result in text format
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1001
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1002 if(PQresultStatus(result) != PGRES_COMMAND_OK) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1003 response->addproperty(response, property, 500);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1004 //printf(PQerrorMessage(pgdav->connection));
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1005 //fflush(stdout);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1006 ret = 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1007 } else {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1008 response->addproperty(response, property, 200);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1009 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1010 PQclear(result);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1011 if(value_str) pool_free(pool, value_str);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1012
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1013 return ret;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1014 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1015
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1016
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1017 static int pg_dav_remove_property(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1018 PgWebdavBackend *pgdav,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1019 WebdavProppatchRequest *request,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1020 WebdavResource *response,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1021 WebdavProperty *property,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1022 void *userdata)
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1023 {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1024 pool_handle_t *pool = request->sn->pool;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1025 PgProppatch *proppatch = request->userdata;
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1026 WSNamespace *ns = property->namespace;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1027
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1028 // check if the property belongs to an extension
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1029 if(proppatch->ext && ns) {
402
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
1030 PgPropertyStoreExt *ext = pg_proppatch_prop_get_ext(pgdav, property);
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
1031 if(ext) {
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
1032 return pg_proppatch_add_ext_prop(pool, pgdav, proppatch, property, ext, PG_PROPPATCH_EXT_REMOVE);
712aca08da7f pg: fix proppatch not working for normal dead properties if extensions are enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 401
diff changeset
1033 } // else: property is not stored in an extension table, continue with normal property store
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1034 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1035
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1036 char *resource_id_str = userdata;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1037 int ret = 0;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1038
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1039 // exec sql
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1040 const char* params[3] = { resource_id_str, (const char*)ns->href, property->name };
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1041 PGresult *result = PQexecParams(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1042 pgdav->connection,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1043 sql_proppatch_remove,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1044 3, // number of parameters
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1045 NULL,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1046 params, // parameter value
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1047 NULL,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1048 NULL,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1049 0); // 0: result in text format
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1050
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1051 if(PQresultStatus(result) != PGRES_COMMAND_OK) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1052 response->addproperty(response, property, 500);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1053 //printf(PQerrorMessage(pgdav->connection));
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1054 //fflush(stdout);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1055 ret = 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1056 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1057 PQclear(result);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1058
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1059 return ret;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1060 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1061
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1062
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1063 /*
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1064 * Creates an SQL query for inserting a new row to an extension table
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1065 * A parameter list for PQexecParams will also be generated, however
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1066 * params[0] will be empty (resource_id str)
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1067 *
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1068 * Query: insert into <table> (resource_id, col1, ...) values ($1, $2 ...);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1069 */
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1070 static CxBuffer* ext_row_create_insert_query(WebdavProppatchRequest *request, PgProppatchExt *ext, PgExtTable *table, char *** params, size_t *nparams) {
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1071 pool_handle_t *pool = request->sn->pool;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1072
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1073 CxBuffer *sql = pool_malloc(pool, sizeof(CxBuffer));
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1074 if(!sql) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1075 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1076 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1077 if(cxBufferInit(sql, NULL, 1024, pool_allocator(pool), CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1078 pool_free(pool, sql);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1079 return NULL;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1080 }
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1081
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1082 size_t pg_nparams = cx_linked_list_size(ext->set_begin, offsetof(PgProppatchExtProp, next)) + 1;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1083 char** pg_params = pool_calloc(pool, pg_nparams, sizeof(char*));
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1084 if(!pg_params) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1085 cxBufferDestroy(sql);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1086 pool_free(pool, sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1087 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1088 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1089
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1090 cxBufferPutString(sql, "insert into ");
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1091 cxBufferPutString(sql, table->table);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1092 cxBufferPutString(sql, "(resource_id");
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1093 for(PgProppatchExtProp *prop=ext->set_begin;prop;prop=prop->next) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1094 cx_bprintf(sql, ",%s", prop->column->name);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1095 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1096
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1097 cxBufferPutString(sql, ") values ($1\n");
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1098 int i = 1;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1099 for(PgProppatchExtProp *prop=ext->set_begin;prop;prop=prop->next) {
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1100 WebdavProperty *property = prop->property;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1101 // convert the property value to WSXmlData
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1102 // property->vtype == WS_VALUE_XML_NODE should always be true
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1103 WSXmlData *property_value = property->vtype == WS_VALUE_XML_NODE ? wsxml_node2data(pool, property->value.node) : NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1104 char *value_str = NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1105 //char *nsdef_str = NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1106 if(property_value) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1107 value_str = property_value->data;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1108 if(property_value->namespaces) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1109 // currently only text data is supported
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1110 pool_free(pool, params);
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1111 cxBufferDestroy(sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1112 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1113 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1114 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1115
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1116 pg_params[i] = value_str;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1117 cx_bprintf(sql, ",$%d", ++i);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1118 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1119 cxBufferPutString(sql, ");");
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1120
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1121
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1122 //printf("\n\n%.*s\n\n", (int)sql->size, sql->space);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1123 //fflush(stdout);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1124
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1125 *params = pg_params;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1126 *nparams = pg_nparams;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1127
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1128 return sql;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1129 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1130
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1131 /*
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1132 * Creates an SQL query for updating an extension table row
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1133 * A parameter list for PQexecParams will also be generated, however
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1134 * params[0] will be empty (resource_id str)
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1135 *
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1136 * Query: update <table> set
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1137 * col1 = $2,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1138 * col2 = $3,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1139 * ...
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1140 * where resource_id = $1 ;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1141 */
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1142 static CxBuffer* ext_row_create_update_query(WebdavProppatchRequest *request, PgProppatchExt *ext, PgExtTable *table, char *** params, size_t *nparams) {
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1143 pool_handle_t *pool = request->sn->pool;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1144
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1145 CxBuffer *sql = pool_malloc(pool, sizeof(CxBuffer));
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1146 if(!sql) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1147 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1148 }
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1149 if(cxBufferInit(sql, NULL, 1024, pool_allocator(pool), CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1150 pool_free(pool, sql);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1151 return NULL;
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1152 }
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1153
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1154 cxBufferPutString(sql, "update ");
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1155 cxBufferPutString(sql, table->table);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1156 cxBufferPutString(sql, " set\n");
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1157
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1158 size_t pg_nparams = cx_linked_list_size(ext->set_begin, offsetof(PgProppatchExtProp, next)) + 1;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1159 char** pg_params = pool_calloc(pool, pg_nparams, sizeof(char*));
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1160 if(!pg_params) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1161 cxBufferDestroy(sql);
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1162 pool_free(pool, sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1163 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1164 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1165
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1166 int i = 1;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1167 for(PgProppatchExtProp *prop=ext->set_begin;prop;prop=prop->next) {
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1168 WebdavProperty *property = prop->property;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1169 // convert the property value to WSXmlData
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1170 // property->vtype == WS_VALUE_XML_NODE should always be true
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1171 WSXmlData *property_value = property->vtype == WS_VALUE_XML_NODE ? wsxml_node2data(pool, property->value.node) : NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1172 char *value_str = NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1173 //char *nsdef_str = NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1174 if(property_value) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1175 value_str = property_value->data;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1176 if(property_value->namespaces) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1177 // currently only text data is supported
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1178 pool_free(pool, params);
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1179 cxBufferDestroy(sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1180 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1181 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1182 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1183
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1184 pg_params[i] = value_str;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1185 cx_bprintf(sql, " %s = $%d,\n", prop->column->name, ++i);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1186 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1187
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1188 for(PgProppatchExtProp *prop=ext->remove_begin;prop;prop=prop->next) {
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1189 cx_bprintf(sql, " %s = NULL,\n", prop->column->name);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1190 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1191
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1192 // check if any write worked
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1193 if(sql->pos == 0) {
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1194 cxBufferDestroy(sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1195 pool_free(pool, pg_params);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1196 return NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1197 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1198
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1199 // last line should end with ',' '\n'
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1200 // replace ',' with space
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1201 if(sql->space[sql->pos-2] == ',') {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1202 sql->space[sql->pos-2] = ' ';
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1203 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1204
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1205 cxBufferPutString(sql, "where resource_id = $1 ;");
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1206 cxBufferPut(sql, '\0');
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1207
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1208 //printf("\n\n%.*s\n\n", (int)sql->size, sql->space);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1209 //fflush(stdout);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1210
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1211 *params = pg_params;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1212 *nparams = pg_nparams;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1213
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1214 return sql;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1215 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1216
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1217 /*
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1218 * Executes an SQL insert for the extension table
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1219 */
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1220 int ext_row_insert(WebdavProppatchRequest *request, PgProppatchExt *ext, PgExtTable *table) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1221 PgWebdavBackend *pgdav = request->dav->instance;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1222 PgProppatch *proppatch = request->userdata;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1223 pool_handle_t *pool = request->sn->pool;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1224
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1225 char **params;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1226 size_t nparam;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1227 CxBuffer *sql = ext_row_create_insert_query(request, ext, table, &params, &nparam);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1228 if(!sql) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1229 return 1;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1230 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1231
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1232 char resource_id_str[32];
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1233 snprintf(resource_id_str, 32, "%" PRId64, proppatch->resource_id);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1234 params[0] = resource_id_str;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1235
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1236 PGresult *result = PQexecParams(
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1237 pgdav->connection,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1238 sql->space,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1239 nparam, // number of parameters
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1240 NULL,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1241 ( const char *const *)params, // parameter value
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1242 NULL,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1243 NULL,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1244 0); // 0: result in text format
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1245
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1246 cxBufferDestroy(sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1247
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1248 int ret = 1;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1249 if(PQresultStatus(result) == PGRES_COMMAND_OK) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1250 // command ok, check if any row was updated
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1251 char *nrows_affected = PQcmdTuples(result);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1252 if(nrows_affected[0] == '1') {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1253 ret = 0;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1254 } else {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1255 log_ereport(LOG_FAILURE, "pg: extension row insert failed");
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1256 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1257 } else {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1258 log_ereport(LOG_FAILURE, "pg: extension row insert failed: %s", PQresultErrorMessage(result));
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1259 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1260
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1261 PQclear(result);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1262
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1263 return ret;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1264 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1265
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1266 /*
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1267 * Executes an SQL update for the extension table
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1268 */
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1269 int ext_row_update(WebdavProppatchRequest *request, PgProppatchExt *ext, PgExtTable *table) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1270 PgWebdavBackend *pgdav = request->dav->instance;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1271 PgProppatch *proppatch = request->userdata;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1272 pool_handle_t *pool = request->sn->pool;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1273
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1274 char **params;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1275 size_t nparam;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1276 CxBuffer *sql = ext_row_create_update_query(request, ext, table, &params, &nparam);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1277 if(!sql) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1278 return 1;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1279 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1280
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1281 char resource_id_str[32];
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1282 snprintf(resource_id_str, 32, "%" PRId64, proppatch->resource_id);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1283 params[0] = resource_id_str;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1284
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1285 PGresult *result = PQexecParams(
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1286 pgdav->connection,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1287 sql->space,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1288 nparam, // number of parameters
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1289 NULL,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1290 ( const char *const *)params, // parameter value
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1291 NULL,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1292 NULL,
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1293 0); // 0: result in text format
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1294
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1295 cxBufferDestroy(sql);
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1296
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1297 int ret = 1;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1298 if(PQresultStatus(result) == PGRES_COMMAND_OK) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1299 // command ok, check if any row was updated
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1300 char *nrows_affected = PQcmdTuples(result);
378
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1301 if(nrows_affected[0] == '1') {
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1302 ret = 0;
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1303 } else if(nrows_affected[0] == '0') {
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1304 // no rows affected, that means we have to insert a new row
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1305 // in the extension table for this resource
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1306
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1307 // TODO: cleanup params
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1308
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1309 ret = ext_row_insert(request, ext, table);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1310 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1311 } else {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1312 log_ereport(LOG_FAILURE, "pg: extension row update failed: %s", PQresultErrorMessage(result));
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1313 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1314
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1315
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1316 PQclear(result);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1317
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1318 return ret;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1319 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1320
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1321 static int pg_dav_update_extension_tables(WebdavProppatchRequest *request) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1322 PgWebdavBackend *pgdav = request->dav->instance;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1323 PgProppatch *proppatch = request->userdata;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1324
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1325 for(int i=0;i<proppatch->numext;i++) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1326 if(proppatch->ext[i].isused) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1327 if(ext_row_update(request, &proppatch->ext[i], &pgdav->repository->tables[i])) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1328 // extension proppatch failed
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1329 return 1;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1330 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1331 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1332 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1333
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1334 return 0;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1335 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1336
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1337 int pg_dav_proppatch_do(
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1338 WebdavProppatchRequest *request,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1339 WebdavResource *response,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1340 VFSFile *file,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1341 WebdavPList **out_set,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1342 WebdavPList **out_remove)
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1343 {
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1344 PgWebdavBackend *pgdav = request->dav->instance;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1345 pool_handle_t *pool = request->sn->pool;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1346 char *path = pblock_findkeyval(pb_key_path, request->rq->vars);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1347
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1348 PgProppatch proppatch;
378
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1349 proppatch.extensions_used = FALSE;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1350 if(pgdav->repository->ntables == 0) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1351 proppatch.ext = NULL;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1352 proppatch.numext = 0;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1353 } else {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1354 // some properties are stored in additional tables
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1355 // for each table we create a PgProppatchExt record
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1356 // which stores data about, which tables are used
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1357 // and which properties (columns) should be updated
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1358 //
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1359 // proppatch.ext[i] should contain the data for repository->tables[i]
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1360 proppatch.numext = pgdav->repository->ntables;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1361 proppatch.ext = pool_calloc(request->sn->pool, proppatch.numext, sizeof(PgProppatchExt));
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1362 if(!proppatch.ext) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1363 return 1; // OOM
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1364 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1365 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1366 request->userdata = &proppatch;
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1367
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1368 // check if the resource exists, we also need the resource_id
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1369 int64_t parent_id;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1370 int64_t resource_id;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1371 const char *resourcename;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1372 WSBool iscollection;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1373 int res_errno = 0;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1374 int err = pg_resolve_path(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1375 pgdav->connection,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1376 path,
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
1377 pgdav->root_resource_id_str,
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1378 &parent_id,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1379 &resource_id,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1380 NULL, // OID
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1381 &resourcename,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1382 &iscollection,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1383 NULL, // stat
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1384 NULL, // etag
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1385 &res_errno);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1386
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1387 if(err) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1388 return 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1389 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1390
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1391 proppatch.resource_id = resource_id;
378
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1392
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1393 // because proppatch must be atomic and we have multiple sql
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1394 // queries and other backends that do stuff that could fail
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1395 // we need the possibility to reverse all changes
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1396 // we use a transaction savepoint for this
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1397 PGresult *result = PQexec(pgdav->connection, "savepoint proppatch;");
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1398 ExecStatusType execStatus = PQresultStatus(result);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1399 PQclear(result);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1400 if(execStatus != PGRES_COMMAND_OK) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1401 return 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1402 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1403
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1404 char resource_id_str[32];
378
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1405 snprintf(resource_id_str, 32, "%" PRId64, resource_id);
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1406 // store the resource_id in rq->vars, because it could be useful later
0344108db255 make original proppatch property list available to all backends
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
1407 pblock_nvinsert("resource_id", resource_id_str, request->rq->vars);
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1408
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1409 int ret = 0;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1410 PgProppatchOpResult set_res = pg_proppatch_op(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1411 pgdav,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1412 request,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1413 response,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1414 out_set,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1415 PG_DAV_PROPPATCH_NOT_ALLOWED,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1416 pg_dav_set_property,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1417 resource_id_str);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1418 if(set_res.error) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1419 return 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1420 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1421 PgProppatchOpResult rm_res = pg_proppatch_op(
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1422 pgdav,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1423 request,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1424 response,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1425 out_remove,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1426 PG_DAV_CREATIONDATE, // creationdate can't be removed
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1427 pg_dav_remove_property,
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1428 resource_id_str);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1429 if(rm_res.error) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1430 return 1;
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1431 }
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1432
377
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1433 // if extensions are in use and pg_proppatch_op found any
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1434 // properties, that should be stored in extension tables
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1435 // we do the update/insert now
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1436 if(proppatch.extensions_used) {
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1437 ret = pg_dav_update_extension_tables(request);
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1438 }
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1439
c011bc2b3143 Add support for extended properties in pg proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 376
diff changeset
1440
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1441 return ret;
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1442 }
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1443
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1444 int pg_dav_proppatch_finish(
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1445 WebdavProppatchRequest *request,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1446 WebdavResource *response,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1447 VFSFile *file,
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1448 WSBool commit)
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1449 {
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1450 PgWebdavBackend *pgdav = request->dav->instance;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1451 int ret = 0;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1452 if(!commit) {
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
1453 log_ereport(LOG_VERBOSE, "proppatch: rollback");
318
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1454 PGresult *result = PQexec(pgdav->connection, "rollback to savepoint proppatch;");
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1455 if(PQresultStatus(result) != PGRES_COMMAND_OK) {
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1456 log_ereport(LOG_FAILURE, "pg_dav_proppatch_finish: rollback failed: %s", PQerrorMessage(pgdav->connection));
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1457 ret = 1;
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1458 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1459 PQclear(result);
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1460 }
60870dbac94f add basic pg proppatch implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 317
diff changeset
1461 return ret;
299
f927ef81a12b add empty pg webdav funcs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1462 }

mercurial