src/server/plugins/postgresql/vfs.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 387
f5caf41b4db6
child 464
0a29110b94ec
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

275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2022 Olaf Wintermann. All rights reserved.
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
535004faa1a5 add empty postgresql VFS functions
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
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "vfs.h"
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 353
diff changeset
30 #include "config.h"
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
32 #include <inttypes.h>
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
33
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
34 #include "../../util/util.h"
379
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
35 #include "../../util/pblock.h"
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
36
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 static VFS pg_vfs_class = {
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 pg_vfs_open,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 pg_vfs_stat,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 pg_vfs_fstat,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 pg_vfs_opendir,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 pg_vfs_fdopendir,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 pg_vfs_mkdir,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 pg_vfs_unlink,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 pg_vfs_rmdir
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 };
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 static VFS_IO pg_vfs_io_class = {
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 pg_vfs_io_read,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 pg_vfs_io_write,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 pg_vfs_io_pread,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 pg_vfs_io_pwrite,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 pg_vfs_io_seek,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 pg_vfs_io_close,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 NULL, // no pg aio implementation yet
345
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 344
diff changeset
56 NULL,
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 344
diff changeset
57 pg_vfs_io_getetag
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 };
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 static VFS_DIRIO pg_vfs_dirio_class = {
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 pg_vfs_dirio_readdir,
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 pg_vfs_dirio_close
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 };
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
65
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
66 /*
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
67 * SQL Queries
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
68 */
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
69
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
70 // Resolves a path into resource_id and parent_id
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
71 // params: $1: path string
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
72 static const char *sql_resolve_path =
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
73 "with recursive resolvepath as (\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
74 select\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
75 resource_id,\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
76 parent_id,\n\
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
77 '' as fullpath,\n\
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
78 resoid,\n\
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
79 iscollection,\n\
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
80 lastmodified,\n\
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
81 creationdate,\n\
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
82 contentlength,\n\
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
83 etag,\n\
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
84 regexp_split_to_array($1, '/') as pathelm,\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
85 1 as pathdepth\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
86 from Resource\n\
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
87 where resource_id = $2\n\
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
88 union\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
89 select\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
90 r.resource_id,\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
91 r.parent_id,\n\
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
92 p.fullpath || '/' || r.nodename,\n\
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
93 r.resoid,\n\
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
94 r.iscollection,\n\
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
95 r.lastmodified,\n\
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
96 r.creationdate,\n\
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
97 r.contentlength,\n\
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
98 r.etag,\n\
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
99 p.pathelm,\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
100 p.pathdepth + 1\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
101 from Resource r\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
102 inner join resolvepath p on r.parent_id = p.resource_id\n\
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
103 where p.pathelm[p.pathdepth+1] = r.nodename\n\
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
104 )\n\
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
105 select resource_id, parent_id, fullpath, resoid, iscollection, lastmodified, creationdate, contentlength, etag from resolvepath\n\
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
106 where fullpath = $1 ;";
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
107
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
108 // Same as sql_resolve_path, but it returns the root collection
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
109 // params: $1: path string (should be '/')
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
110 static const char *sql_get_root = "select resource_id, parent_id, $1 as fullpath, resoid, true as iscollection, lastmodified, creationdate, contentlength, etag from Resource where resource_id = $2;";
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
111
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
112 // Get all children of a specific collection
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
113 // params: $1: parent resource_id
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
114 static const char *sql_get_children = "select resource_id, nodename, iscollection, lastmodified, creationdate, contentlength, etag from Resource where parent_id = $1;";
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
115
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
116 // Get resource
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
117 // params: $1: resource_id
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
118 static const char *sql_get_resource = "select resource_id, nodename, iscollection, lastmodified, creationdate, contentlength, etag from Resource where resource_id = $1;";
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
119
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
120 // Create resource
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
121 // params: $1: parent_id
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
122 // $2: node name
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
123 static const char *sql_create_resource =
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
124 "insert into Resource (parent_id, nodename, iscollection, lastmodified, creationdate, contentlength, resoid) values\n\
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
125 ($1, $2, false, now(), now(), 0, lo_creat(-1))\n\
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
126 returning resource_id, resoid, lastmodified, creationdate;";
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
127
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
128 // Create collection
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
129 // params: $1: parent_id
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
130 // $2: node name
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
131 static const char *sql_create_collection =
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
132 "insert into Resource (parent_id, nodename, iscollection, lastmodified, creationdate, contentlength) values\n\
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
133 ($1, $2, true, now(), now(), 0)\n\
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
134 returning resource_id, lastmodified, creationdate;";
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
135
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
136 // Update resource metadata
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
137 // params: $1: resource_id
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
138 // $2: contentlength
347
b6d71e504294 update etag when a postgresql file is updated
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 346
diff changeset
139 static const char *sql_update_resource = "update Resource set contentlength = $2, lastmodified = now(), etag = gen_random_uuid() where resource_id = $1;";
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
140
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
141 // Delete a resource
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
142 // params: $1: resource_id
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
143 static const char *sql_delete_res = "delete from Resource where parent_id is not null and resource_id = $1;";
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
144
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 353
diff changeset
145
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 353
diff changeset
146 void* pg_vfs_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
147 return pg_init_repo(cfg, pool, config);
366
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 353
diff changeset
148 }
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 353
diff changeset
149
47bc686fafe4 add new dav config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 353
diff changeset
150 VFS* pg_vfs_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
151 PgRepository *repo = initData;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
152
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
153 char *resource_pool;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
154 if(repo) {
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
155 resource_pool = repo->resourcepool.ptr;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
156 } else {
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
157 // resourcepool is required
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
158 resource_pool = pblock_findval("resourcepool", pb);
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
159 if(!resource_pool) {
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
160 log_ereport(LOG_MISCONFIG, "pg_vfs_create: missing resourcepool parameter");
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
161 return NULL;
d6d8c86c95c3 adjust pg plugin to new dav initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
162 }
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
163 }
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
164
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
165 // get the resource first (most likely to fail due to misconfig)
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
166 ResourceData *resdata = resourcepool_lookup(sn, rq, resource_pool, 0);
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
167 if(!resdata) {
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
168 log_ereport(LOG_MISCONFIG, "postgresql vfs: resource pool %s not found", resource_pool);
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
169 return NULL;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
170 }
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
171 // resdata will be freed automatically when the request is finished
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
172
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
173 return pg_vfs_create_from_resourcedata(sn, rq, repo, resdata);
289
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
174 }
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
175
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
176 VFS* pg_vfs_create_from_resourcedata(Session *sn, Request *rq, PgRepository *repo, ResourceData *resdata) {
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
177 // Create a new VFS object and a separate instance object
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
178 // VFS contains fptrs that can be copied from pg_vfs_class
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
179 // instance contains request specific data (PGconn)
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
180 VFS *vfs = pool_malloc(sn->pool, sizeof(VFS));
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
181 if(!vfs) {
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
182 return NULL;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
183 }
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
184
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
185 PgVFS *vfs_priv = pool_malloc(sn->pool, sizeof(PgVFS));
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
186 if(!vfs_priv) {
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
187 pool_free(sn->pool, vfs);
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
188 return NULL;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
189 }
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
190 vfs_priv->connection = resdata->data;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
191 vfs_priv->pg_resource = resdata;
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
192 vfs_priv->root_resource_id = 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
193 snprintf(vfs_priv->root_resource_id_str, 32, "%" PRId64, repo->root_resource_id);
276
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
194
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
195 memcpy(vfs, &pg_vfs_class, sizeof(VFS));
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
196 vfs->flags = 0;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
197 vfs->instance = vfs_priv;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
198
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
199 return vfs;
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
200 }
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
201
0cb4eda146c4 add function to create a postgresql-based VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 275
diff changeset
202
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
203 int pg_resolve_path(
305
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
204 PGconn *connection,
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
205 const char *path,
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
206 const char *root_id,
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
207 int64_t *parent_id,
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
208 int64_t *resource_id,
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
209 Oid *oid,
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
210 const char **resource_name,
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
211 WSBool *iscollection,
305
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
212 struct stat *s,
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
213 char *etag,
305
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
214 int *res_errno)
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
215 {
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
216 // basic path validation
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
217 if(!path) return 1;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
218 size_t pathlen = strlen(path);
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
219 if(pathlen == 0) return 1;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
220 if(path[0] != '/') {
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
221 return 1;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
222 }
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
223
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
224 char *pathf = NULL;
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
225 if(pathlen > 1 && path[pathlen-1] == '/') {
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
226 pathf = malloc(pathlen);
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
227 memcpy(pathf, path, pathlen);
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
228 pathf[pathlen-1] = 0; // remove trailing '/'
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
229 path = pathf;
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
230 }
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
231
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
232 // get last node of path
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
233 *resource_name = util_resource_name(path);
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
234
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
235 const char *sql = pathlen == 1 ? sql_get_root : sql_resolve_path;
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
236 const char* params[2] = { path, root_id };
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
237 PGresult *result = PQexecParams(
305
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
238 connection,
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
239 sql,
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
240 2, // number of parameters
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
241 NULL,
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
242 params, // parameter value
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
243 NULL,
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
244 NULL,
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
245 0); // 0: result in text format
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
246
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
247 if(pathf) {
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
248 free(pathf);
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
249 }
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
250
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
251 if(!result) return 1;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
252
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
253 int ret = 1;
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
254 //int nfields = PQnfields(result);
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
255 int nrows = PQntuples(result);
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
256 if(nrows == 1) {
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
257 char *resource_id_str = PQgetvalue(result, 0, 0);
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
258 char *parent_id_str = PQgetvalue(result, 0, 1);
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
259 char *iscol = PQgetvalue(result, 0, 4);
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
260 char *lastmodified = PQgetvalue(result, 0, 5);
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
261 char *creationdate = PQgetvalue(result, 0, 6);
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
262 char *contentlength = PQgetvalue(result, 0, 7);
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
263 char *res_etag = PQgetvalue(result, 0, 8);
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
264 if(resource_id_str && parent_id_str) {
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
265 if(util_strtoint(resource_id_str, resource_id)) {
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
266 ret = 0; // success
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
267 }
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
268 // optionally get parent_id
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
269 util_strtoint(parent_id_str, parent_id);
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
270 }
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
271
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
272 if(oid) {
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
273 char *resoid = PQgetvalue(result, 0, 3);
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
274 int64_t roid;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
275 if(resoid && util_strtoint(resoid, &roid)) {
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
276 *oid = roid;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
277 }
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
278 }
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
279
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
280 if(iscollection && iscol) {
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
281 *iscollection = iscol[0] == 't' ? TRUE : FALSE;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
282 }
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
283
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
284 if(s) {
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
285 pg_set_stat(s, iscol, lastmodified, creationdate, contentlength);
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
286 }
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
287
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
288 if(etag) {
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
289 size_t etag_len = strlen(res_etag);
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
290 if(etag_len < PG_ETAG_MAXLEN)
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
291 memcpy(etag, res_etag, etag_len+1);
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
292 }
305
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
293 } else if(res_errno) {
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
294 *res_errno = ENOENT;
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
295 }
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
296
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
297 PQclear(result);
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
298
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
299 return ret;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
300 }
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
301
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
302
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
303 void pg_set_stat(
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
304 struct stat *s,
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
305 const char *iscollection,
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
306 const char *lastmodified,
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
307 const char *creationdate,
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
308 const char *contentlength)
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
309 {
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
310 memset(s, 0, sizeof(struct stat));
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
311 if(iscollection) {
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
312 WSBool iscol = iscollection[0] == 't' ? TRUE : FALSE;
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
313 if(iscol) {
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
314 s->st_mode |= 0x4000;
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
315 }
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
316 }
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
317 s->st_mtime = pg_convert_timestamp(lastmodified);
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
318
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
319 if(contentlength) {
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
320 int64_t len;
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
321 if(util_strtoint(contentlength, &len)) {
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
322 s->st_size = len;
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
323 }
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
324 }
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
325 }
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
326
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
327 static int pg_create_res(
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
328 PgVFS *pg,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
329 const char *resparentid_str,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
330 const char *nodename,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
331 int64_t *new_resource_id,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
332 Oid *oid,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
333 const char **resource_name,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
334 struct stat *s)
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
335 {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
336 const char* params[2] = { resparentid_str, nodename };
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
337 PGresult *result = PQexecParams(
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
338 pg->connection,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
339 sql_create_resource,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
340 2, // number of parameters
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
341 NULL,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
342 params, // parameter value
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
343 NULL,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
344 NULL,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
345 0); // 0: result in text format
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
346
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
347 if(!result) return 1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
348
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
349 int ret = 1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
350 if(PQntuples(result) == 1) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
351 // sql insert succesful
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
352 ret = 0;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
353
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
354 char *id_str = PQgetvalue(result, 0, 0);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
355 char *oid_str = PQgetvalue(result, 0, 1);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
356 char *lastmodified = PQgetvalue(result, 0, 2);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
357 char *creationdate = PQgetvalue(result, 0, 3);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
358
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
359 if(new_resource_id) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
360 if(!id_str || !util_strtoint(id_str, new_resource_id)) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
361 ret = 1; // shouldn't happen
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
362 log_ereport(LOG_FAILURE, "Postgresql VFS: sql_create_resource: Could not convert resource_id to int");
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
363 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
364 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
365 if(oid) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
366 int64_t i;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
367 if(!oid_str || !util_strtoint(oid_str, &i)) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
368 ret = 1; // shouldn't happen
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
369 log_ereport(LOG_FAILURE, "Postgresql VFS: sql_create_resource: Could not convert oid to int");
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
370 } else {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
371 *oid = i;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
372 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
373 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
374 if(resource_name) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
375 *resource_name = nodename;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
376 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
377 if(s) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
378 pg_set_stat(s, 0, lastmodified, creationdate, NULL);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
379 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
380 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
381
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
382 PQclear(result);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
383
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
384 return ret;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
385 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
386
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
387
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
388 static int pg_create_col(
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
389 PgVFS *pg,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
390 const char *resparentid_str,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
391 const char *nodename,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
392 int64_t *new_resource_id,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
393 const char **resource_name,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
394 struct stat *s)
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
395 {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
396 const char* params[2] = { resparentid_str, nodename };
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
397 PGresult *result = PQexecParams(
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
398 pg->connection,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
399 sql_create_collection,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
400 2, // number of parameters
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
401 NULL,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
402 params, // parameter value
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
403 NULL,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
404 NULL,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
405 0); // 0: result in text format
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
406
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
407 if(!result) return 1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
408
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
409 int ret = 1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
410 if(PQntuples(result) == 1) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
411 // sql insert succesful
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
412 ret = 0;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
413
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
414 char *id_str = PQgetvalue(result, 0, 0);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
415 char *lastmodified = PQgetvalue(result, 0, 1);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
416 char *creationdate = PQgetvalue(result, 0, 2);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
417
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
418 if(new_resource_id) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
419 if(!id_str || !util_strtoint(id_str, new_resource_id)) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
420 ret = 1; // shouldn't happen
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
421 log_ereport(LOG_FAILURE, "Postgresql VFS: sql_create_collection: Could not convert resource_id to int");
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
422 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
423 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
424 if(resource_name) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
425 *resource_name = nodename;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
426 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
427 if(s) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
428 pg_set_stat(s, 0, lastmodified, creationdate, NULL);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
429 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
430 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
431
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
432 PQclear(result);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
433
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
434 return ret;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
435 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
436
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
437 int pg_create_file(
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
438 VFSContext *ctx,
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
439 PgVFS *pg,
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
440 const char *path,
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
441 int64_t *new_resource_id,
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
442 int64_t *res_parent_id,
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
443 Oid *oid,
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
444 const char **resource_name,
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
445 struct stat *s,
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
446 WSBool collection)
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
447 {
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
448 char *parent_path = util_parent_path(path);
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
449 if(!parent_path) return 1;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
450
350
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
451 size_t pathlen = strlen(path);
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
452 char *pathf = NULL;
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
453 if(pathlen > 1 && path[pathlen-1] == '/') {
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
454 pathf = malloc(pathlen);
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
455 memcpy(pathf, path, pathlen);
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
456 pathf[pathlen-1] = 0; // remove trailing '/'
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
457 path = pathf;
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
458 }
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
459
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
460 const char *nodename = util_resource_name(path);
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
461
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
462 // resolve the parent path
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
463 // if the parent path can't be resolved, we are done
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
464 const char *resname;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
465 int64_t resource_id, parent_id;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
466 resource_id = -1;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
467 parent_id = -1;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
468 WSBool iscollection;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
469 Oid unused_oid = 0;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
470
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
471 int err = pg_resolve_path(
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
472 pg->connection,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
473 parent_path,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
474 pg->root_resource_id_str,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
475 &parent_id,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
476 &resource_id,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
477 &unused_oid,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
478 &resname,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
479 &iscollection,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
480 NULL,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
481 NULL,
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
482 &ctx->vfs_errno);
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
483 FREE(parent_path);
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
484 if(err) {
344
70a9b945206a fix webdav_mkcol response and add error handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 341
diff changeset
485 ctx->vfs_errno = ENOENT;
350
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
486 if(pathf) free(pathf);
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
487 return 1;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
488 }
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
489
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
490 // parent path exists, check if it is a collection
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
491 if(!iscollection) {
350
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
492 if(pathf) free(pathf);
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
493 return 1;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
494 }
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
495
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
496 // create new Resource
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
497 char resid_str[32];
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
498 snprintf(resid_str, 32, "%" PRId64, resource_id); // convert parent resource_id to string
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
499
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
500 int ret;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
501 if(collection) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
502 ret = pg_create_col(pg, resid_str, nodename, new_resource_id, resource_name, s);
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
503 } else {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
504 ret = pg_create_res(pg, resid_str, nodename, new_resource_id, oid, resource_name, s);
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
505 }
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
506
350
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
507 if(pathf) free(pathf);
abba342112c2 fix that pg mkdir can create directories with trailing path separators in the nodename
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
508
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
509 if(res_parent_id) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
510 // resource_id is still the id of the parent from previous pg_resolve_path call
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
511 *res_parent_id = resource_id;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
512 }
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
513
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
514 return ret;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
515 }
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
516
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
517 int pg_remove_res(
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
518 VFSContext *ctx,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
519 PgVFS *pg,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
520 int64_t resource_id,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
521 Oid oid)
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
522 {
297
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
523 // create transaction savepoint
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
524 PGresult *result = PQexec(pg->connection, "savepoint del_res;");
298
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
525 ExecStatusType execStatus = PQresultStatus(result);
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
526 PQclear(result);
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
527 if(execStatus != PGRES_COMMAND_OK) {
297
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
528 return 1;
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
529 }
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
530
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
531 if(oid > 0) {
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
532 if(lo_unlink(pg->connection, oid) != 1) {
298
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
533 // restore savepoint
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
534 result = PQexec(pg->connection, "rollback to savepoint del_res;");
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
535 PQclear(result);
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
536 return 1; // error
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
537 }
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
538 }
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
539
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
540 char resid_str[32];
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
541 snprintf(resid_str, 32, "%" PRId64, resource_id);
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
542
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
543 const char* params[1] = { resid_str };
297
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
544 result = PQexecParams(
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
545 pg->connection,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
546 sql_delete_res,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
547 1, // number of parameters
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
548 NULL,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
549 params, // parameter value
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
550 NULL,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
551 NULL,
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
552 0); // 0: result in text format
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
553
298
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
554 execStatus = PQresultStatus(result);
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
555 PQclear(result);
297
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
556 int ret = 0;
298
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
557
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
558 if(execStatus != PGRES_COMMAND_OK) {
297
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
559 ret = 1;
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
560 // restore savepoint
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
561 result = PQexec(pg->connection, "rollback to savepoint del_res;");
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
562 PQclear(result);
298
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
563 } else {
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
564 // we don't need the savepoint anymore
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
565 result = PQexec(pg->connection, "release savepoint del_res;");
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
566 PQclear(result);
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
567 }
298
8f5c556120a5 fix error handling in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 297
diff changeset
568
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
569 return ret;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
570 }
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
571
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
572 int pg_update_resource(PgVFS *pg, int64_t resource_id, int64_t contentlength) {
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
573 char resid_str[32];
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
574 char ctlen_str[32];
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
575 snprintf(resid_str, 32, "%" PRId64, resource_id);
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
576 snprintf(ctlen_str, 32, "%" PRId64, contentlength);
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
577
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
578 const char* params[2] = { resid_str, ctlen_str };
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
579 PGresult *result = PQexecParams(
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
580 pg->connection,
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
581 sql_update_resource,
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
582 2, // number of parameters
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
583 NULL,
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
584 params, // parameter value
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
585 NULL,
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
586 NULL,
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
587 0); // 0: result in text format
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
588
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
589 int ret = PQresultStatus(result) == PGRES_COMMAND_OK ? 0 : 1;
297
14cd7137a3a8 handle sql error in pg_remove_res
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
590 PQclear(result);
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
591 return ret;
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
592 }
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
593
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
594 /* -------------------------- VFS functions -------------------------- */
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
595
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
596 SYS_FILE pg_vfs_open(VFSContext *ctx, const char *path, int oflags) {
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
597 VFS *vfs = ctx->vfs;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
598 PgVFS *pg = vfs->instance;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
599
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
600 const char *resname;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
601 int64_t resource_id, parent_id;
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
602 resource_id = -1;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
603 parent_id = -1;
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
604 WSBool iscollection;
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
605 struct stat s;
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
606 char etag[PG_ETAG_MAXLEN];
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
607 Oid oid = 0;
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
608 if(pg_resolve_path(pg->connection, path, pg->root_resource_id_str, &parent_id, &resource_id, &oid, &resname, &iscollection, &s, etag, &ctx->vfs_errno)) {
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
609 if((oflags & O_CREAT) == O_CREAT) {
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
610 if(pg_create_file(ctx, pg, path, &resource_id, &parent_id, &oid, &resname, &s, FALSE)) {
285
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
611 return NULL;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
612 }
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
613 iscollection = 0;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
614 } else {
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
615 return NULL;
96e53bd94958 add support for O_CREAT flag in postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 284
diff changeset
616 }
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
617 }
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
618
379
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
619 // store the resource_id in rq->vars
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
620 if(ctx->rq) {
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
621 char *rq_path = pblock_findkeyval(pb_key_path, ctx->rq->vars);
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
622 if(rq_path && !strcmp(rq_path, path)) {
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
623 char *res_id_str = pblock_findval("resource_id", ctx->rq->vars);
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
624 if(!res_id_str) {
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
625 char resource_id_str[32];
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
626 snprintf(resource_id_str, 32, "%" PRId64, resource_id);
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
627 pblock_nvinsert("resource_id",resource_id_str, ctx->rq->vars);
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
628 }
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
629 }
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
630 }
4e2cb3adc0f2 pg_vfs_open stores the resource_id in rq->vars
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
631
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
632 VFSFile *file = pool_malloc(ctx->pool, sizeof(VFSFile));
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
633 if(!file) {
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
634 return NULL;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
635 }
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
636 PgFile *pgfile = pool_malloc(ctx->pool, sizeof(PgFile));
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
637 if(!pgfile) {
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
638 pool_free(ctx->pool, file);
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
639 return NULL;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
640 }
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
641
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
642 int fd = -1;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
643 if(!iscollection) {
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
644 if (PQstatus(pg->connection) != CONNECTION_OK) {
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
645 fd = -2;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
646 }
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
647
289
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
648 int lo_mode = INV_READ;
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
649 if((oflags & O_RDWR) == O_RDWR) {
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
650 lo_mode = INV_READ|INV_WRITE;
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
651 } else if((oflags & O_WRONLY) == O_WRONLY) {
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
652 lo_mode = INV_WRITE;
285d483db2fb add first pg vfs tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 285
diff changeset
653 }
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
654 fd = lo_open(pg->connection, oid, lo_mode);
341
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
655 int err = 0;
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
656 if(fd < 0) {
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
657 err = 1;
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
658 } else if((oflags & O_TRUNC) == O_TRUNC) {
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
659 if(lo_truncate(pg->connection, fd, 0)) {
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
660 lo_close(pg->connection, fd);
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
661 err = 1;
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
662 }
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
663 }
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
664
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
665 if(err) {
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
666 pool_free(ctx->pool, file);
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
667 pool_free(ctx->pool, pgfile);
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
668 return NULL;
52831b82b3fd add support for O_TRUNC in pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 311
diff changeset
669 }
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
670 }
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
671
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
672 pgfile->iscollection = iscollection;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
673 pgfile->resource_id = resource_id;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
674 pgfile->parent_id = parent_id;
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
675 pgfile->oid = oid;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
676 pgfile->fd = fd;
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
677 pgfile->oflags = oflags;
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
678 pgfile->s = s;
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
679 memcpy(pgfile->etag, etag, PG_ETAG_MAXLEN);
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
680
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
681 file->ctx = ctx;
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
682 file->io = iscollection ? &pg_vfs_io_class : &pg_vfs_io_class;
278
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
683 file->fd = -1;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
684 file->data = pgfile;
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
685
38bf7b42b58c implement pg_vfs_open
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 276
diff changeset
686 return file;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
687 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
688
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
689 int pg_vfs_stat(VFSContext *ctx, const char *path, struct stat *buf) {
305
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
690 VFS *vfs = ctx->vfs;
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
691 PgVFS *pg = vfs->instance;
4db64fe30588 change pg_resolve_path signature to be useable without VFS
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 304
diff changeset
692
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
693 int64_t parent_id, resource_id;
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
694 const char *resname;
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
695 WSBool iscollection;
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
696 return pg_resolve_path(pg->connection, path, pg->root_resource_id_str, &parent_id, &resource_id, NULL, &resname, &iscollection, buf, NULL, &ctx->vfs_errno);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
697 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
698
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
699 int pg_vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf) {
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
700 PgFile *pgfile = fd->data;
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
701 memcpy(buf, &pgfile->s, sizeof(struct stat));
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
702 return 0;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
703 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
704
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
705 VFS_DIR pg_vfs_opendir(VFSContext *ctx, const char *path) {
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
706 VFSFile *file = pg_vfs_open(ctx, path, O_RDONLY);
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
707 if(!file) return NULL;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
708 return pg_vfs_fdopendir(ctx, file);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
709 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
710
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
711 VFS_DIR pg_vfs_fdopendir(VFSContext *ctx, SYS_FILE fd) {
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
712 PgFile *pg = fd->data;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
713 if(!pg->iscollection) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
714 ctx->vfs_errno = ENOTDIR;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
715 return NULL;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
716 }
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
717
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
718 VFSDir *dir = pool_malloc(ctx->pool, sizeof(VFSDir));
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
719 if(!dir) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
720 fd->io->close(fd);
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
721 ctx->vfs_errno = ENOMEM;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
722 return NULL;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
723 }
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
724
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
725 PgDir *pgdir = pool_malloc(ctx->pool, sizeof(PgDir));
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
726 if(!pgdir) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
727 fd->io->close(fd);
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
728 pool_free(ctx->pool, dir);
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
729 ctx->vfs_errno = ENOMEM;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
730 return NULL;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
731 }
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
732 memset(pgdir, 0, sizeof(PgDir));
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
733 pgdir->file = fd;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
734
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
735 dir->ctx = ctx;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
736 dir->io = &pg_vfs_dirio_class;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
737 dir->data = pgdir;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
738 dir->fd = -1;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
739
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
740 return dir;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
741 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
742
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
743 int pg_vfs_mkdir(VFSContext *ctx, const char *path) {
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
744 VFS *vfs = ctx->vfs;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
745 PgVFS *pg = vfs->instance;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
746
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
747 const char *resname;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
748 int64_t resource_id, parent_id;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
749 resource_id = -1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
750 parent_id = -1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
751 WSBool iscollection;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
752 struct stat s;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
753 Oid oid = 0;
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
754 if(!pg_resolve_path(pg->connection, path, pg->root_resource_id_str, &parent_id, &resource_id, &oid, &resname, &iscollection, &s, NULL, &ctx->vfs_errno)) {
290
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
755 ctx->vfs_errno = EEXIST;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
756 return 1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
757 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
758
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
759 if(pg_create_file(ctx, pg, path, NULL, NULL, NULL, NULL, NULL, TRUE)) {
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
760 return 1;
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
761 }
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
762
efc10acf539f implement pg vfs mkdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 289
diff changeset
763 return 0;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
764 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
765
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
766 int pg_vfs_unlink(VFSContext *ctx, const char *path) {
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
767 VFS *vfs = ctx->vfs;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
768 PgVFS *pg = vfs->instance;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
769
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
770 const char *resname;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
771 int64_t resource_id, parent_id;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
772 resource_id = -1;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
773 parent_id = -1;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
774 WSBool iscollection;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
775 Oid oid = 0;
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
776 if(pg_resolve_path(pg->connection, path, pg->root_resource_id_str, &parent_id, &resource_id, &oid, &resname, &iscollection, NULL, NULL, &ctx->vfs_errno)) {
294
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
777 return 1;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
778 }
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
779
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
780 if(iscollection) {
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
781 ctx->vfs_errno = EISDIR;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
782 return 1;
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
783 }
277a5896a2ec implement pg unlink
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
784
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
785 return pg_remove_res(ctx, pg, resource_id, oid);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
786 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
787
295
73a1243fce15 add pg mkdir tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
788 int pg_vfs_rmdir(VFSContext *ctx, const char *path) {
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
789 VFS *vfs = ctx->vfs;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
790 PgVFS *pg = vfs->instance;
295
73a1243fce15 add pg mkdir tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
791
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
792 const char *resname;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
793 int64_t resource_id, parent_id;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
794 resource_id = -1;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
795 parent_id = -1;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
796 WSBool iscollection;
374
77506ec632a4 use configured root node from PgRepository in pg vfs/webdav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 372
diff changeset
797 if(pg_resolve_path(pg->connection, path, pg->root_resource_id_str, &parent_id, &resource_id, NULL, &resname, &iscollection, NULL, NULL, &ctx->vfs_errno)) {
296
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
798 return 1;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
799 }
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
800
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
801 if(!iscollection) {
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
802 ctx->vfs_errno = ENOTDIR;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
803 return 1;
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
804 }
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
805
78e92337fa4e implement pg rmdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
806 return pg_remove_res(ctx, pg, resource_id, 0);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
807 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
808
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
809
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
810 /* -------------------------- VFS_IO functions -------------------------- */
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
811
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
812 ssize_t pg_vfs_io_read(SYS_FILE fd, void *buf, size_t nbyte) {
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
813 PgVFS *pgvfs = fd->ctx->vfs->instance;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
814 PgFile *pg = fd->data;
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
815 if(pg->fd < 0) return-1;
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
816 return lo_read(pgvfs->connection, pg->fd, buf, nbyte);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
817 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
818
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
819 ssize_t pg_vfs_io_write(SYS_FILE fd, const void *buf, size_t nbyte) {
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
820 PgVFS *pgvfs = fd->ctx->vfs->instance;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
821 PgFile *pg = fd->data;
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
822 if(pg->fd < 0) return-1;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
823 return lo_write(pgvfs->connection, pg->fd, buf, nbyte);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
824 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
825
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
826 ssize_t pg_vfs_io_pread(SYS_FILE fd, void *buf, size_t nbyte, off_t offset) {
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
827 PgVFS *pgvfs = fd->ctx->vfs->instance;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
828 PgFile *pg = fd->data;
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
829 if(pg->fd < 0) return-1;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
830 if(lo_lseek64(pgvfs->connection, pg->fd, offset, SEEK_SET) == -1) {
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
831 return -1;
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
832 }
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
833 return lo_read(pgvfs->connection, pg->fd, buf, nbyte);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
834 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
835
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
836 ssize_t pg_vfs_io_pwrite(SYS_FILE fd, const void *buf, size_t nbyte, off_t offset) {
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
837 PgVFS *pgvfs = fd->ctx->vfs->instance;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
838 PgFile *pg = fd->data;
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
839 if(pg->fd < 0) return-1;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
840 if(lo_lseek64(pgvfs->connection, pg->fd, offset, SEEK_SET) == -1) {
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
841 return -1;
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
842 }
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
843 return lo_write(pgvfs->connection, pg->fd, buf, nbyte);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
844 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
845
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
846 off_t pg_vfs_io_seek(SYS_FILE fd, off_t offset, int whence) {
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
847 PgVFS *pgvfs = fd->ctx->vfs->instance;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
848 PgFile *pg = fd->data;
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
849 if(pg->fd < 0) return-1;
284
eab579b8c80d add missing postgresql vfs io functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 283
diff changeset
850 return lo_lseek64(pgvfs->connection, pg->fd, offset, whence);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
851 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
852
291
0f46b645aea4 add pg_vfs_io_tell
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 290
diff changeset
853 off_t pg_vfs_io_tell(SYS_FILE fd) {
0f46b645aea4 add pg_vfs_io_tell
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 290
diff changeset
854 PgVFS *pgvfs = fd->ctx->vfs->instance;
0f46b645aea4 add pg_vfs_io_tell
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 290
diff changeset
855 PgFile *pg = fd->data;
382
9e2289c77b04 disable pg large object IO functions for collections
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
856 if(pg->fd < 0) return-1;
291
0f46b645aea4 add pg_vfs_io_tell
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 290
diff changeset
857 return lo_tell64(pgvfs->connection, pg->fd);
0f46b645aea4 add pg_vfs_io_tell
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 290
diff changeset
858 }
0f46b645aea4 add pg_vfs_io_tell
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 290
diff changeset
859
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
860 void pg_vfs_io_close(SYS_FILE fd) {
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
861 pool_handle_t *pool = fd->ctx->pool;
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
862 PgVFS *pgvfs = fd->ctx->vfs->instance;
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
863 PgFile *pg = fd->data;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
864
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
865 if(pg->fd >= 0) {
292
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
866 if((pg->oflags & (O_WRONLY|O_RDWR)) > 0) {
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
867 // file modified, update length and lastmodified
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
868 off_t len = pg_vfs_io_seek(fd, 0, SEEK_END);
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
869 if(len < 0) len = 0;
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
870
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
871 pg_update_resource(pgvfs, pg->resource_id, len);
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
872 }
7c31bcd5b4be update pg resource metadata on close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 291
diff changeset
873
283
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
874 PgVFS *pgvfs = fd->ctx->vfs->instance;
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
875 lo_close(pgvfs->connection, pg->fd);
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
876 }
25e5b771677d minimal working send_file with postgresql vfs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 282
diff changeset
877
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
878 pool_free(pool, pg);
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
879 pool_free(pool, fd);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
880 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
881
345
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 344
diff changeset
882 const char *pg_vfs_io_getetag(SYS_FILE fd) {
346
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
883 PgFile *pg = fd->data;
784b24381bed extend postgresql vfs to store an etag in the file
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 345
diff changeset
884 return pg->etag;
345
5832e10fc59a add optional getetag function to VFS API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 344
diff changeset
885 }
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
886
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
887 /* -------------------------- VFS_DIRIO functions -------------------------- */
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
888
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
889 static int load_dir(VFSDir *dir, PgDir *pg) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
890 VFS *vfs = dir->ctx->vfs;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
891 PgVFS *pgvfs = vfs->instance;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
892 PgFile *pgfd = pg->file->data;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
893 PgDir *pgdir = dir->data;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
894
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
895 char resid_param[32];
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
896 snprintf(resid_param, 32, "%" PRId64, pgfd->resource_id);
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
897
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
898 const char *param = resid_param;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
899
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
900 PGresult *result = PQexecParams(
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
901 pgvfs->connection,
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
902 sql_get_children,
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
903 1, // number of parameters
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
904 NULL,
281
e9dc53661df4 add pg vfs stat/fstat implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
905 &param, // param: parent resource_id
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
906 NULL,
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
907 NULL,
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
908 0); // 0: result in text format
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
909 if(!result) return 1;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
910
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
911 pgdir->result = result;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
912 pgdir->nrows = PQntuples(result);
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
913 return 0;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
914 }
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
915
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
916 int pg_vfs_dirio_readdir(VFS_DIR dir, VFS_ENTRY *entry, int getstat) {
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
917 PgDir *pg = dir->data;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
918 if(!pg->result) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
919 if(load_dir(dir, pg)) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
920 return 0;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
921 }
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
922 }
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
923
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
924 if(pg->row >= pg->nrows) {
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
925 return 0; // EOF
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
926 }
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
927
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
928 entry->name = PQgetvalue(pg->result, pg->row, 1);
353
382d6c221807 fix pg_vfs_dirio_readdir not initializing some VFS_ENTRY fields
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 350
diff changeset
929 entry->stat_errno = 0;
382d6c221807 fix pg_vfs_dirio_readdir not initializing some VFS_ENTRY fields
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 350
diff changeset
930 entry->stat_extra = NULL;
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
931
282
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
932 if(getstat) {
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
933 memset(&entry->stat, 0, sizeof(struct stat));
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
934
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
935 char *iscollection = PQgetvalue(pg->result, pg->row, 2);
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
936 char *lastmodified = PQgetvalue(pg->result, pg->row, 3);
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
937 char *creationdate = PQgetvalue(pg->result, pg->row, 4);
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
938 char *contentlength = PQgetvalue(pg->result, pg->row, 5);
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
939 pg_set_stat(&entry->stat, iscollection, lastmodified, creationdate, contentlength);
cfb588e27198 add support for getstat parameter in pg readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 281
diff changeset
940 }
279
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
941
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
942 pg->row++;
79029fe26aae add basic postgresql vfs directory functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 278
diff changeset
943 return 1;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
944 }
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
945
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
946 void pg_vfs_dirio_close(VFS_DIR dir) {
280
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
947 pool_handle_t *pool = dir->ctx->pool;
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
948 PgDir *pg = dir->data;
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
949 if(pg->result) {
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
950 PQclear(pg->result);
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
951 }
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
952 PgFile *pgfile = pg->file->data;
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
953
280
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
954 pool_free(pool, pgfile);
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
955 pool_free(pool, pg->file);
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
956 pool_free(pool, pg);
d0d5a970292f implement pg_vfs_dirio_close
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 279
diff changeset
957 pool_free(pool, dir);
275
535004faa1a5 add empty postgresql VFS functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
958 }
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
959
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
960 time_t pg_convert_timestamp(const char *timestamp) {
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
961 struct tm tm;
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
962 if(pg_convert_timestamp_tm(timestamp, &tm)) {
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
963 return 0;
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
964 }
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
965 #ifdef __FreeBSD__
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
966 return timelocal(&tm);
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
967 #else
387
f5caf41b4db6 fix build on non-freebsd systems
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 382
diff changeset
968 return mktime(&tm) - timezone;
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
969 #endif
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
970 }
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
971
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
972 int pg_convert_timestamp_tm(const char *timestamp, struct tm *tm) {
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
973 // TODO: this is a very basic implementation that needs some work
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
974 // format yyyy-mm-dd HH:MM:SS
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
975
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
976 memset(tm, 0, sizeof(struct tm));
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
977 size_t len = timestamp ? strlen(timestamp) : 0;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
978 if(len < 19) {
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
979 return 1;
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
980 } else if(len > 63) {
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
981 return 1;
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
982 }
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
983
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
984 char buf[64];
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
985 memcpy(buf, timestamp, len);
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
986
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
987 char *year_str = buf;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
988 year_str[4] = '\0';
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
989
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
990 char *month_str = buf + 5;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
991 month_str[2] = '\0';
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
992
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
993 char *day_str = buf + 8;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
994 day_str[2] = '\0';
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
995
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
996 char *hour_str = buf + 11;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
997 hour_str[2] = '\0';
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
998
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
999 char *minute_str = buf + 14;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1000 minute_str[2] = '\0';
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1001
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1002 char *second_str = buf + 17;
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1003 second_str[2] = '\0';
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1004
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1005 tm->tm_year = atoi(year_str) - 1900;
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1006 tm->tm_mon = atoi(month_str) - 1;
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1007 tm->tm_mday = atoi(day_str);
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1008 tm->tm_hour = atoi(hour_str);
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1009 tm->tm_min = atoi(minute_str);
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1010 tm->tm_sec = atoi(second_str);
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1011
311
e676ed461b5b implement pg getlastmodified propfind (and prepare creationdate)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 305
diff changeset
1012 return 0;
304
33911d44111d add basic parser for pg timestamps
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1013 }

mercurial