1251881Speter/* wc-queries.sql -- queries used to interact with the wc-metadata
2251881Speter *                   SQLite database
3251881Speter *     This is intended for use with SQLite 3
4251881Speter *
5251881Speter * ====================================================================
6251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
7251881Speter *    or more contributor license agreements.  See the NOTICE file
8251881Speter *    distributed with this work for additional information
9251881Speter *    regarding copyright ownership.  The ASF licenses this file
10251881Speter *    to you under the Apache License, Version 2.0 (the
11251881Speter *    "License"); you may not use this file except in compliance
12251881Speter *    with the License.  You may obtain a copy of the License at
13251881Speter *
14251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
15251881Speter *
16251881Speter *    Unless required by applicable law or agreed to in writing,
17251881Speter *    software distributed under the License is distributed on an
18251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19251881Speter *    KIND, either express or implied.  See the License for the
20251881Speter *    specific language governing permissions and limitations
21251881Speter *    under the License.
22251881Speter * ====================================================================
23251881Speter */
24251881Speter
25251881Speter/* ------------------------------------------------------------------------- */
26251881Speter
27251881Speter/* these are used in wc_db.c  */
28251881Speter
29251881Speter-- STMT_SELECT_NODE_INFO
30251881SpeterSELECT op_depth, repos_id, repos_path, presence, kind, revision, checksum,
31251881Speter  translated_size, changed_revision, changed_date, changed_author, depth,
32251881Speter  symlink_target, last_mod_time, properties, moved_here, inherited_props,
33251881Speter  moved_to
34251881SpeterFROM nodes
35251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
36251881SpeterORDER BY op_depth DESC
37251881Speter
38251881Speter-- STMT_SELECT_NODE_INFO_WITH_LOCK
39251881SpeterSELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
40251881Speter  checksum, translated_size, changed_revision, changed_date, changed_author,
41251881Speter  depth, symlink_target, last_mod_time, properties, moved_here,
42251881Speter  inherited_props,
43251881Speter  /* All the columns until now must match those returned by
44251881Speter     STMT_SELECT_NODE_INFO. The implementation of svn_wc__db_read_info()
45251881Speter     assumes that these columns are followed by the lock information) */
46251881Speter  lock_token, lock_owner, lock_comment, lock_date
47251881SpeterFROM nodes
48251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
49251881Speter  AND nodes.repos_path = lock.repos_relpath
50251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
51251881SpeterORDER BY op_depth DESC
52251881Speter
53251881Speter-- STMT_SELECT_BASE_NODE
54251881SpeterSELECT repos_id, repos_path, presence, kind, revision, checksum,
55251881Speter  translated_size, changed_revision, changed_date, changed_author, depth,
56251881Speter  symlink_target, last_mod_time, properties, file_external
57251881SpeterFROM nodes
58251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
59251881Speter
60251881Speter-- STMT_SELECT_BASE_NODE_WITH_LOCK
61251881SpeterSELECT nodes.repos_id, nodes.repos_path, presence, kind, revision,
62251881Speter  checksum, translated_size, changed_revision, changed_date, changed_author,
63251881Speter  depth, symlink_target, last_mod_time, properties, file_external,
64251881Speter  /* All the columns until now must match those returned by
65251881Speter     STMT_SELECT_BASE_NODE. The implementation of svn_wc__db_base_get_info()
66251881Speter     assumes that these columns are followed by the lock information) */
67251881Speter  lock_token, lock_owner, lock_comment, lock_date
68251881SpeterFROM nodes
69251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
70251881Speter  AND nodes.repos_path = lock.repos_relpath
71251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
72251881Speter
73251881Speter-- STMT_SELECT_BASE_CHILDREN_INFO
74251881SpeterSELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
75251881Speter  revision, depth, file_external,
76251881Speter  lock_token, lock_owner, lock_comment, lock_date
77251881SpeterFROM nodes
78251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
79251881Speter  AND nodes.repos_path = lock.repos_relpath
80251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
81251881Speter
82251881Speter-- STMT_SELECT_WORKING_NODE
83251881SpeterSELECT op_depth, presence, kind, checksum, translated_size,
84251881Speter  changed_revision, changed_date, changed_author, depth, symlink_target,
85251881Speter  repos_id, repos_path, revision,
86251881Speter  moved_here, moved_to, last_mod_time, properties
87251881SpeterFROM nodes
88251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0
89251881SpeterORDER BY op_depth DESC
90251881SpeterLIMIT 1
91251881Speter
92251881Speter-- STMT_SELECT_DEPTH_NODE
93251881SpeterSELECT repos_id, repos_path, presence, kind, revision, checksum,
94251881Speter  translated_size, changed_revision, changed_date, changed_author, depth,
95251881Speter  symlink_target, last_mod_time, properties
96251881SpeterFROM nodes
97251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
98251881Speter
99251881Speter-- STMT_SELECT_LOWEST_WORKING_NODE
100251881SpeterSELECT op_depth, presence, kind, moved_to
101251881SpeterFROM nodes
102251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
103251881SpeterORDER BY op_depth
104251881SpeterLIMIT 1
105251881Speter
106251881Speter-- STMT_SELECT_HIGHEST_WORKING_NODE
107251881SpeterSELECT op_depth
108251881SpeterFROM nodes
109251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3
110251881SpeterORDER BY op_depth DESC
111251881SpeterLIMIT 1
112251881Speter
113251881Speter-- STMT_SELECT_ACTUAL_NODE
114251881SpeterSELECT changelist, properties, conflict_data
115251881SpeterFROM actual_node
116251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
117251881Speter
118251881Speter-- STMT_SELECT_NODE_CHILDREN_INFO
119251881Speter/* Getting rows in an advantageous order using
120251881Speter     ORDER BY local_relpath, op_depth DESC
121251881Speter   turns out to be slower than getting rows in a random order and making the
122251881Speter   C code handle it. */
123251881SpeterSELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
124251881Speter  checksum, translated_size, changed_revision, changed_date, changed_author,
125251881Speter  depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
126251881Speter  lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external
127251881SpeterFROM nodes
128251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
129251881Speter  AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
130251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
131251881Speter
132251881Speter-- STMT_SELECT_NODE_CHILDREN_WALKER_INFO
133251881SpeterSELECT local_relpath, op_depth, presence, kind
134251881SpeterFROM nodes_current
135251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
136251881Speter
137251881Speter-- STMT_SELECT_ACTUAL_CHILDREN_INFO
138251881SpeterSELECT local_relpath, changelist, properties, conflict_data
139251881SpeterFROM actual_node
140251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
141251881Speter
142251881Speter-- STMT_SELECT_REPOSITORY_BY_ID
143251881SpeterSELECT root, uuid FROM repository WHERE id = ?1
144251881Speter
145251881Speter-- STMT_SELECT_WCROOT_NULL
146251881SpeterSELECT id FROM wcroot WHERE local_abspath IS NULL
147251881Speter
148251881Speter-- STMT_SELECT_REPOSITORY
149251881SpeterSELECT id FROM repository WHERE root = ?1
150251881Speter
151251881Speter-- STMT_INSERT_REPOSITORY
152251881SpeterINSERT INTO repository (root, uuid) VALUES (?1, ?2)
153251881Speter
154251881Speter-- STMT_INSERT_NODE
155251881SpeterINSERT OR REPLACE INTO nodes (
156251881Speter  wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
157251881Speter  revision, presence, depth, kind, changed_revision, changed_date,
158251881Speter  changed_author, checksum, properties, translated_size, last_mod_time,
159251881Speter  dav_cache, symlink_target, file_external, moved_to, moved_here,
160251881Speter  inherited_props)
161251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14,
162251881Speter        ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23)
163251881Speter
164251881Speter-- STMT_SELECT_BASE_PRESENT
165251881SpeterSELECT local_relpath, kind FROM nodes n
166251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
167251881Speter  AND op_depth = 0
168251881Speter  AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
169251881Speter  AND NOT EXISTS(SELECT 1 FROM NODES w
170251881Speter                 WHERE w.wc_id = ?1 AND w.local_relpath = n.local_relpath
171251881Speter                   AND op_depth > 0)
172251881SpeterORDER BY local_relpath DESC
173251881Speter
174251881Speter-- STMT_SELECT_WORKING_PRESENT
175251881SpeterSELECT local_relpath, kind, checksum, translated_size, last_mod_time
176251881SpeterFROM nodes n
177251881SpeterWHERE wc_id = ?1
178251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
179251881Speter  AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
180251881Speter  AND op_depth = (SELECT MAX(op_depth)
181251881Speter                  FROM NODES w
182251881Speter                  WHERE w.wc_id = ?1
183251881Speter                    AND w.local_relpath = n.local_relpath)
184251881SpeterORDER BY local_relpath DESC
185251881Speter
186251881Speter-- STMT_DELETE_NODE_RECURSIVE
187251881SpeterDELETE FROM NODES
188251881SpeterWHERE wc_id = ?1
189251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
190251881Speter
191251881Speter-- STMT_DELETE_NODE
192251881SpeterDELETE
193251881SpeterFROM NODES
194251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
195251881Speter
196251881Speter-- STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE
197251881Speter/* The ACTUAL_NODE applies to BASE, unless there is in at least one op_depth
198251881Speter   a WORKING node that could have a conflict */
199251881SpeterDELETE FROM actual_node
200251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
201251881Speter  AND EXISTS(SELECT 1 FROM NODES b
202251881Speter             WHERE b.wc_id = ?1
203251881Speter               AND b.local_relpath = actual_node.local_relpath
204251881Speter               AND op_depth = 0)
205251881Speter  AND NOT EXISTS(SELECT 1 FROM NODES w
206251881Speter                 WHERE w.wc_id = ?1
207251881Speter                   AND w.local_relpath = actual_node.local_relpath
208251881Speter                   AND op_depth > 0
209251881Speter                   AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT))
210251881Speter
211251881Speter-- STMT_DELETE_WORKING_BASE_DELETE
212251881SpeterDELETE FROM nodes
213251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
214251881Speter  AND presence = MAP_BASE_DELETED
215251881Speter  AND op_depth > 0
216251881Speter  AND op_depth = (SELECT MIN(op_depth) FROM nodes n
217251881Speter                    WHERE n.wc_id = ?1
218251881Speter                      AND n.local_relpath = nodes.local_relpath
219251881Speter                      AND op_depth > 0)
220251881Speter
221251881Speter-- STMT_DELETE_WORKING_RECURSIVE
222251881SpeterDELETE FROM nodes
223251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
224251881Speter  AND op_depth > 0
225251881Speter
226251881Speter-- STMT_DELETE_BASE_RECURSIVE
227251881SpeterDELETE FROM nodes
228251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
229251881Speter  AND op_depth = 0
230251881Speter
231251881Speter-- STMT_DELETE_WORKING_OP_DEPTH
232251881SpeterDELETE FROM nodes
233251881SpeterWHERE wc_id = ?1 
234251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
235251881Speter  AND op_depth = ?3
236251881Speter
237251881Speter-- STMT_DELETE_WORKING_OP_DEPTH_ABOVE
238251881SpeterDELETE FROM nodes
239251881SpeterWHERE wc_id = ?1 
240251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
241251881Speter  AND op_depth > ?3
242251881Speter
243251881Speter-- STMT_SELECT_LOCAL_RELPATH_OP_DEPTH
244251881SpeterSELECT local_relpath
245251881SpeterFROM nodes
246251881SpeterWHERE wc_id = ?1
247251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
248251881Speter  AND op_depth = ?3
249251881Speter
250251881Speter-- STMT_SELECT_CHILDREN_OP_DEPTH
251251881SpeterSELECT local_relpath, kind
252251881SpeterFROM nodes
253251881SpeterWHERE wc_id = ?1
254251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
255251881Speter  AND op_depth = ?3
256251881SpeterORDER BY local_relpath DESC
257251881Speter
258251881Speter-- STMT_COPY_NODE_MOVE
259251881SpeterINSERT OR REPLACE INTO nodes (
260251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
261251881Speter    revision, presence, depth, kind, changed_revision, changed_date,
262251881Speter    changed_author, checksum, properties, translated_size, last_mod_time,
263251881Speter    symlink_target, moved_here, moved_to )
264251881SpeterSELECT
265251881Speter    wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
266251881Speter    repos_id,
267251881Speter    repos_path, revision, presence, depth, kind, changed_revision,
268251881Speter    changed_date, changed_author, checksum, properties, translated_size,
269251881Speter    last_mod_time, symlink_target, 1,
270251881Speter    (SELECT dst.moved_to FROM nodes AS dst
271251881Speter                         WHERE dst.wc_id = ?1
272251881Speter                         AND dst.local_relpath = ?4
273251881Speter                         AND dst.op_depth = ?5)
274251881SpeterFROM nodes
275251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
276251881Speter
277251881Speter-- STMT_SELECT_OP_DEPTH_CHILDREN
278251881SpeterSELECT local_relpath, kind FROM nodes
279251881SpeterWHERE wc_id = ?1 
280251881Speter  AND parent_relpath = ?2
281251881Speter  AND op_depth = ?3
282251881Speter  AND presence != MAP_BASE_DELETED
283251881Speter  AND file_external is NULL
284251881Speter
285251881Speter/* Used by non-recursive revert to detect higher level children, and
286251881Speter   actual-only rows that would be left orphans, if the revert
287251881Speter   proceeded. */
288251881Speter-- STMT_SELECT_GE_OP_DEPTH_CHILDREN
289251881SpeterSELECT 1 FROM nodes
290251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
291251881Speter  AND (op_depth > ?3 OR (op_depth = ?3 AND presence != MAP_BASE_DELETED))
292251881SpeterUNION ALL
293251881SpeterSELECT 1 FROM ACTUAL_NODE a
294251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
295251881Speter  AND NOT EXISTS (SELECT 1 FROM nodes n
296251881Speter                   WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath)
297251881Speter
298251881Speter/* Delete the nodes shadowed by local_relpath. Not valid for the wc-root */
299251881Speter-- STMT_DELETE_SHADOWED_RECURSIVE
300251881SpeterDELETE FROM nodes
301251881SpeterWHERE wc_id = ?1
302251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
303251881Speter  AND (op_depth < ?3
304251881Speter       OR (op_depth = ?3 AND presence = MAP_BASE_DELETED))
305251881Speter
306251881Speter-- STMT_CLEAR_MOVED_TO_FROM_DEST
307251881SpeterUPDATE NODES SET moved_to = NULL
308251881SpeterWHERE wc_id = ?1
309251881Speter  AND moved_to = ?2
310251881Speter
311251881Speter/* Get not-present descendants of a copied node. Not valid for the wc-root */
312251881Speter-- STMT_SELECT_NOT_PRESENT_DESCENDANTS
313251881SpeterSELECT local_relpath FROM nodes
314251881SpeterWHERE wc_id = ?1 AND op_depth = ?3
315251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
316251881Speter  AND presence = MAP_NOT_PRESENT
317251881Speter
318251881Speter-- STMT_COMMIT_DESCENDANTS_TO_BASE
319251881SpeterUPDATE NODES SET op_depth = 0,
320251881Speter                 repos_id = ?4,
321251881Speter                 repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
322251881Speter                 revision = ?6,
323251881Speter                 dav_cache = NULL,
324251881Speter                 moved_here = NULL,
325251881Speter                 presence = CASE presence
326251881Speter                              WHEN MAP_NORMAL THEN MAP_NORMAL
327251881Speter                              WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
328251881Speter                              ELSE MAP_NOT_PRESENT
329251881Speter                            END
330251881SpeterWHERE wc_id = ?1
331251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
332251881Speter  AND op_depth = ?3
333251881Speter
334251881Speter-- STMT_SELECT_NODE_CHILDREN
335251881Speter/* Return all paths that are children of the directory (?1, ?2) in any
336251881Speter   op-depth, including children of any underlying, replaced directories. */
337251881SpeterSELECT local_relpath FROM nodes
338251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
339251881Speter
340251881Speter-- STMT_SELECT_WORKING_CHILDREN
341251881Speter/* Return all paths that are children of the working version of the
342251881Speter   directory (?1, ?2).  A given path is not included just because it is a
343251881Speter   child of an underlying (replaced) directory, it has to be in the
344251881Speter   working version of the directory. */
345251881SpeterSELECT local_relpath FROM nodes
346251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
347251881Speter  AND (op_depth > (SELECT MAX(op_depth) FROM nodes
348251881Speter                   WHERE wc_id = ?1 AND local_relpath = ?2)
349251881Speter       OR
350251881Speter       (op_depth = (SELECT MAX(op_depth) FROM nodes
351251881Speter                    WHERE wc_id = ?1 AND local_relpath = ?2)
352251881Speter        AND presence != MAP_BASE_DELETED))
353251881Speter
354251881Speter-- STMT_SELECT_NODE_PROPS
355251881SpeterSELECT properties, presence FROM nodes
356251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
357251881SpeterORDER BY op_depth DESC
358251881Speter
359251881Speter-- STMT_SELECT_ACTUAL_PROPS
360251881SpeterSELECT properties FROM actual_node
361251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
362251881Speter
363251881Speter-- STMT_UPDATE_ACTUAL_PROPS
364251881SpeterUPDATE actual_node SET properties = ?3
365251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
366251881Speter
367251881Speter-- STMT_INSERT_ACTUAL_PROPS
368251881SpeterINSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties)
369251881SpeterVALUES (?1, ?2, ?3, ?4)
370251881Speter
371251881Speter-- STMT_INSERT_LOCK
372251881SpeterINSERT OR REPLACE INTO lock
373251881Speter(repos_id, repos_relpath, lock_token, lock_owner, lock_comment,
374251881Speter lock_date)
375251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6)
376251881Speter
377251881Speter/* Not valid for the working copy root */
378251881Speter-- STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE
379251881SpeterSELECT nodes.repos_id, nodes.repos_path, lock_token
380251881SpeterFROM nodes
381251881SpeterLEFT JOIN lock ON nodes.repos_id = lock.repos_id
382251881Speter  AND nodes.repos_path = lock.repos_relpath
383251881SpeterWHERE wc_id = ?1 AND op_depth = 0
384251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
385251881Speter
386251881Speter-- STMT_INSERT_WCROOT
387251881SpeterINSERT INTO wcroot (local_abspath)
388251881SpeterVALUES (?1)
389251881Speter
390251881Speter-- STMT_UPDATE_BASE_NODE_DAV_CACHE
391251881SpeterUPDATE nodes SET dav_cache = ?3
392251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
393251881Speter
394251881Speter-- STMT_SELECT_BASE_DAV_CACHE
395251881SpeterSELECT dav_cache FROM nodes
396251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
397251881Speter
398251881Speter-- STMT_SELECT_DELETION_INFO
399251881SpeterSELECT (SELECT b.presence FROM nodes AS b
400251881Speter         WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0),
401251881Speter       work.presence, work.op_depth
402251881SpeterFROM nodes_current AS work
403251881SpeterWHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0
404251881SpeterLIMIT 1
405251881Speter
406251881Speter-- STMT_SELECT_DELETION_INFO_SCAN
407251881Speter/* ### FIXME.  moved.moved_to IS NOT NULL works when there is
408251881Speter only one move but we need something else when there are several. */
409251881SpeterSELECT (SELECT b.presence FROM nodes AS b
410251881Speter         WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0),
411251881Speter       work.presence, work.op_depth, moved.moved_to
412251881SpeterFROM nodes_current AS work
413251881SpeterLEFT OUTER JOIN nodes AS moved 
414251881Speter  ON moved.wc_id = work.wc_id
415251881Speter AND moved.local_relpath = work.local_relpath
416251881Speter AND moved.moved_to IS NOT NULL
417251881SpeterWHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0
418251881SpeterLIMIT 1
419251881Speter
420251881Speter-- STMT_SELECT_OP_DEPTH_MOVED_TO
421251881SpeterSELECT op_depth, moved_to, repos_path, revision
422251881SpeterFROM nodes
423251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
424251881Speter AND op_depth <= (SELECT MIN(op_depth) FROM nodes
425251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
426251881SpeterORDER BY op_depth DESC
427251881Speter
428251881Speter-- STMT_SELECT_MOVED_TO
429251881SpeterSELECT moved_to
430251881SpeterFROM nodes
431251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
432251881Speter
433251881Speter-- STMT_SELECT_MOVED_HERE
434251881SpeterSELECT moved_here, presence, repos_path, revision
435251881SpeterFROM nodes
436251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3
437251881SpeterORDER BY op_depth
438251881Speter
439251881Speter-- STMT_SELECT_MOVED_BACK
440251881SpeterSELECT u.local_relpath,
441251881Speter       u.presence, u.repos_id, u.repos_path, u.revision,
442251881Speter       l.presence, l.repos_id, l.repos_path, l.revision,
443251881Speter       u.moved_here, u.moved_to
444251881SpeterFROM nodes u
445251881SpeterLEFT OUTER JOIN nodes l ON l.wc_id = ?1
446251881Speter                       AND l.local_relpath = u.local_relpath
447251881Speter                       AND l.op_depth = ?3
448251881SpeterWHERE u.wc_id = ?1
449251881Speter  AND u.local_relpath = ?2
450251881Speter  AND u.op_depth = ?4
451251881SpeterUNION ALL
452251881SpeterSELECT u.local_relpath,
453251881Speter       u.presence, u.repos_id, u.repos_path, u.revision,
454251881Speter       l.presence, l.repos_id, l.repos_path, l.revision,
455251881Speter       u.moved_here, NULL
456251881SpeterFROM nodes u
457251881SpeterLEFT OUTER JOIN nodes l ON l.wc_id=?1
458251881Speter                       AND l.local_relpath=u.local_relpath
459251881Speter                       AND l.op_depth=?3
460251881SpeterWHERE u.wc_id = ?1
461251881Speter  AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
462251881Speter  AND u.op_depth = ?4
463251881Speter
464251881Speter-- STMT_DELETE_MOVED_BACK
465251881SpeterDELETE FROM nodes
466251881SpeterWHERE wc_id = ?1
467251881Speter  AND (local_relpath = ?2
468251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
469251881Speter  AND op_depth = ?3
470251881Speter
471251881Speter-- STMT_DELETE_LOCK
472251881SpeterDELETE FROM lock
473251881SpeterWHERE repos_id = ?1 AND repos_relpath = ?2
474251881Speter
475253734Speter-- STMT_DELETE_LOCK_RECURSIVELY
476253734SpeterDELETE FROM lock
477253734SpeterWHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2))
478253734Speter
479251881Speter-- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE
480251881SpeterUPDATE nodes SET dav_cache = NULL
481251881SpeterWHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0
482251881Speter  AND (local_relpath = ?2
483251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
484251881Speter
485251881Speter-- STMT_RECURSIVE_UPDATE_NODE_REPO
486251881SpeterUPDATE nodes SET repos_id = ?4, dav_cache = NULL
487251881Speter/* ### The Sqlite optimizer needs help here ###
488251881Speter * WHERE wc_id = ?1
489251881Speter *   AND repos_id = ?3
490251881Speter *   AND (local_relpath = ?2
491251881Speter *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/
492251881SpeterWHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3)
493251881Speter   OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
494251881Speter       AND repos_id = ?3)
495251881Speter 
496251881Speter
497251881Speter-- STMT_UPDATE_LOCK_REPOS_ID
498251881SpeterUPDATE lock SET repos_id = ?2
499251881SpeterWHERE repos_id = ?1
500251881Speter
501251881Speter-- STMT_UPDATE_NODE_FILEINFO
502251881SpeterUPDATE nodes SET translated_size = ?3, last_mod_time = ?4
503251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
504251881Speter  AND op_depth = (SELECT MAX(op_depth) FROM nodes
505251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2)
506251881Speter
507251881Speter-- STMT_INSERT_ACTUAL_CONFLICT
508251881SpeterINSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
509251881SpeterVALUES (?1, ?2, ?3, ?4)
510251881Speter
511251881Speter-- STMT_UPDATE_ACTUAL_CONFLICT
512251881SpeterUPDATE actual_node SET conflict_data = ?3
513251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
514251881Speter
515251881Speter-- STMT_UPDATE_ACTUAL_CHANGELISTS
516251881SpeterUPDATE actual_node SET changelist = ?3
517251881SpeterWHERE wc_id = ?1
518251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
519251881Speter  AND local_relpath = (SELECT local_relpath FROM targets_list AS t
520251881Speter                       WHERE wc_id = ?1
521251881Speter                         AND t.local_relpath = actual_node.local_relpath
522251881Speter                         AND kind = MAP_FILE)
523251881Speter
524251881Speter-- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST
525251881SpeterUPDATE actual_node SET changelist = NULL
526251881Speter WHERE wc_id = ?1 AND local_relpath = ?2
527251881Speter
528251881Speter-- STMT_MARK_SKIPPED_CHANGELIST_DIRS
529251881Speter/* 7 corresponds to svn_wc_notify_skip */
530251881SpeterINSERT INTO changelist_list (wc_id, local_relpath, notify, changelist)
531251881SpeterSELECT wc_id, local_relpath, 7, ?3
532251881SpeterFROM targets_list
533251881SpeterWHERE wc_id = ?1
534251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
535251881Speter  AND kind = MAP_DIR
536251881Speter
537251881Speter-- STMT_RESET_ACTUAL_WITH_CHANGELIST
538251881SpeterREPLACE INTO actual_node (
539251881Speter  wc_id, local_relpath, parent_relpath, changelist)
540251881SpeterVALUES (?1, ?2, ?3, ?4)
541251881Speter
542251881Speter-- STMT_CREATE_CHANGELIST_LIST
543251881SpeterDROP TABLE IF EXISTS changelist_list;
544251881SpeterCREATE TEMPORARY TABLE changelist_list (
545251881Speter  wc_id  INTEGER NOT NULL,
546251881Speter  local_relpath TEXT NOT NULL,
547251881Speter  notify INTEGER NOT NULL,
548251881Speter  changelist TEXT NOT NULL,
549251881Speter  /* Order NOTIFY descending to make us show clears (27) before adds (26) */
550251881Speter  PRIMARY KEY (wc_id, local_relpath, notify DESC)
551251881Speter)
552251881Speter
553251881Speter/* Create notify items for when a node is removed from a changelist and
554251881Speter   when a node is added to a changelist. Make sure nothing is notified
555251881Speter   if there were no changes.
556251881Speter*/
557251881Speter-- STMT_CREATE_CHANGELIST_TRIGGER
558251881SpeterDROP TRIGGER IF EXISTS   trigger_changelist_list_change;
559251881SpeterCREATE TEMPORARY TRIGGER trigger_changelist_list_change
560251881SpeterBEFORE UPDATE ON actual_node
561251881SpeterWHEN old.changelist IS NOT new.changelist
562251881SpeterBEGIN
563251881Speter  /* 27 corresponds to svn_wc_notify_changelist_clear */
564251881Speter  INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
565251881Speter  SELECT old.wc_id, old.local_relpath, 27, old.changelist
566251881Speter   WHERE old.changelist is NOT NULL;
567251881Speter
568251881Speter  /* 26 corresponds to svn_wc_notify_changelist_set */
569251881Speter  INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
570251881Speter  SELECT new.wc_id, new.local_relpath, 26, new.changelist
571251881Speter   WHERE new.changelist IS NOT NULL;
572251881SpeterEND
573251881Speter
574251881Speter-- STMT_FINALIZE_CHANGELIST
575251881SpeterDROP TRIGGER trigger_changelist_list_change;
576251881SpeterDROP TABLE changelist_list;
577251881SpeterDROP TABLE targets_list
578251881Speter
579251881Speter-- STMT_SELECT_CHANGELIST_LIST
580251881SpeterSELECT wc_id, local_relpath, notify, changelist
581251881SpeterFROM changelist_list
582251881SpeterORDER BY wc_id, local_relpath ASC, notify DESC
583251881Speter
584251881Speter-- STMT_CREATE_TARGETS_LIST
585251881SpeterDROP TABLE IF EXISTS targets_list;
586251881SpeterCREATE TEMPORARY TABLE targets_list (
587251881Speter  wc_id  INTEGER NOT NULL,
588251881Speter  local_relpath TEXT NOT NULL,
589251881Speter  parent_relpath TEXT,
590251881Speter  kind TEXT NOT NULL,
591251881Speter  PRIMARY KEY (wc_id, local_relpath)
592251881Speter  );
593251881Speter/* need more indicies? */
594251881Speter
595251881Speter-- STMT_DROP_TARGETS_LIST
596251881SpeterDROP TABLE targets_list
597251881Speter
598251881Speter-- STMT_INSERT_TARGET
599251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
600251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
601251881SpeterFROM nodes_current
602251881SpeterWHERE wc_id = ?1
603251881Speter  AND local_relpath = ?2
604251881Speter
605251881Speter-- STMT_INSERT_TARGET_DEPTH_FILES
606251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
607251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
608251881SpeterFROM nodes_current
609251881SpeterWHERE wc_id = ?1
610251881Speter  AND parent_relpath = ?2
611251881Speter  AND kind = MAP_FILE
612251881Speter
613251881Speter-- STMT_INSERT_TARGET_DEPTH_IMMEDIATES
614251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
615251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
616251881SpeterFROM nodes_current
617251881SpeterWHERE wc_id = ?1
618251881Speter  AND parent_relpath = ?2
619251881Speter
620251881Speter-- STMT_INSERT_TARGET_DEPTH_INFINITY
621251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
622251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
623251881SpeterFROM nodes_current
624251881SpeterWHERE wc_id = ?1
625251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
626251881Speter
627251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST
628251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
629251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
630251881Speter  FROM actual_node AS A JOIN nodes_current AS N
631251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
632251881Speter WHERE N.wc_id = ?1
633251881Speter   AND N.local_relpath = ?2
634251881Speter   AND A.changelist = ?3
635251881Speter
636251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES
637251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
638251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
639251881Speter  FROM actual_node AS A JOIN nodes_current AS N
640251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
641251881Speter WHERE N.wc_id = ?1
642251881Speter   AND N.parent_relpath = ?2
643251881Speter   AND kind = MAP_FILE
644251881Speter   AND A.changelist = ?3
645251881Speter
646251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES
647251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
648251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
649251881Speter  FROM actual_node AS A JOIN nodes_current AS N
650251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
651251881Speter WHERE N.wc_id = ?1
652251881Speter   AND N.parent_relpath = ?2
653251881Speter  AND A.changelist = ?3
654251881Speter
655251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY
656251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
657251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
658251881Speter  FROM actual_node AS A JOIN nodes_current AS N
659251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
660251881Speter WHERE N.wc_id = ?1
661251881Speter   AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
662251881Speter   AND A.changelist = ?3
663251881Speter
664251881Speter/* Only used by commented dump_targets() in wc_db.c */
665251881Speter/*-- STMT_SELECT_TARGETS
666251881SpeterSELECT local_relpath, parent_relpath from targets_list*/
667251881Speter
668251881Speter-- STMT_INSERT_ACTUAL_EMPTIES
669251881SpeterINSERT OR IGNORE INTO actual_node (
670251881Speter     wc_id, local_relpath, parent_relpath)
671251881SpeterSELECT wc_id, local_relpath, parent_relpath
672251881SpeterFROM targets_list
673251881Speter
674251881Speter-- STMT_DELETE_ACTUAL_EMPTY
675251881SpeterDELETE FROM actual_node
676251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
677251881Speter  AND properties IS NULL
678251881Speter  AND conflict_data IS NULL
679251881Speter  AND changelist IS NULL
680251881Speter  AND text_mod IS NULL
681251881Speter  AND older_checksum IS NULL
682251881Speter  AND right_checksum IS NULL
683251881Speter  AND left_checksum IS NULL
684251881Speter
685251881Speter-- STMT_DELETE_ACTUAL_EMPTIES
686251881SpeterDELETE FROM actual_node
687251881SpeterWHERE wc_id = ?1
688251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
689251881Speter  AND properties IS NULL
690251881Speter  AND conflict_data IS NULL
691251881Speter  AND changelist IS NULL
692251881Speter  AND text_mod IS NULL
693251881Speter  AND older_checksum IS NULL
694251881Speter  AND right_checksum IS NULL
695251881Speter  AND left_checksum IS NULL
696251881Speter
697251881Speter-- STMT_DELETE_BASE_NODE
698251881SpeterDELETE FROM nodes
699251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
700251881Speter
701251881Speter-- STMT_DELETE_WORKING_NODE
702251881SpeterDELETE FROM nodes
703251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
704251881Speter  AND op_depth = (SELECT MAX(op_depth) FROM nodes
705251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0)
706251881Speter
707251881Speter-- STMT_DELETE_LOWEST_WORKING_NODE
708251881SpeterDELETE FROM nodes
709251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
710251881Speter  AND op_depth = (SELECT MIN(op_depth) FROM nodes
711251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
712251881Speter  AND presence = MAP_BASE_DELETED
713251881Speter
714251881Speter-- STMT_DELETE_ALL_LAYERS
715251881SpeterDELETE FROM nodes
716251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
717251881Speter
718251881Speter-- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE
719251881SpeterDELETE FROM nodes
720251881SpeterWHERE wc_id = ?1
721251881Speter  AND (local_relpath = ?2
722251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
723251881Speter  AND op_depth >= ?3
724251881Speter
725251881Speter-- STMT_DELETE_ACTUAL_NODE
726251881SpeterDELETE FROM actual_node
727251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
728251881Speter
729251881Speter/* Will not delete recursive when run on the wcroot */
730251881Speter-- STMT_DELETE_ACTUAL_NODE_RECURSIVE
731251881SpeterDELETE FROM actual_node
732251881SpeterWHERE wc_id = ?1
733251881Speter  AND (local_relpath = ?2
734251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
735251881Speter
736251881Speter-- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST
737251881SpeterDELETE FROM actual_node
738251881SpeterWHERE wc_id = ?1
739251881Speter  AND local_relpath = ?2
740251881Speter  AND (changelist IS NULL
741251881Speter       OR NOT EXISTS (SELECT 1 FROM nodes_current c
742251881Speter                      WHERE c.wc_id = ?1 AND c.local_relpath = ?2
743251881Speter                        AND c.kind = MAP_FILE))
744251881Speter
745251881Speter-- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
746251881SpeterDELETE FROM actual_node
747251881SpeterWHERE wc_id = ?1
748251881Speter  AND (local_relpath = ?2
749251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
750251881Speter  AND (changelist IS NULL
751251881Speter       OR NOT EXISTS (SELECT 1 FROM nodes_current c
752251881Speter                      WHERE c.wc_id = ?1 
753251881Speter                        AND c.local_relpath = actual_node.local_relpath
754251881Speter                        AND c.kind = MAP_FILE))
755251881Speter
756251881Speter-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST
757251881SpeterUPDATE actual_node
758251881SpeterSET properties = NULL,
759251881Speter    text_mod = NULL,
760251881Speter    conflict_data = NULL,
761251881Speter    tree_conflict_data = NULL,
762251881Speter    older_checksum = NULL,
763251881Speter    left_checksum = NULL,
764251881Speter    right_checksum = NULL
765251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
766251881Speter
767251881Speter-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
768251881SpeterUPDATE actual_node
769251881SpeterSET properties = NULL,
770251881Speter    text_mod = NULL,
771251881Speter    conflict_data = NULL,
772251881Speter    tree_conflict_data = NULL,
773251881Speter    older_checksum = NULL,
774251881Speter    left_checksum = NULL,
775251881Speter    right_checksum = NULL
776251881SpeterWHERE wc_id = ?1
777251881Speter  AND (local_relpath = ?2
778251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
779251881Speter
780251881Speter-- STMT_UPDATE_NODE_BASE_DEPTH
781251881SpeterUPDATE nodes SET depth = ?3
782251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
783251881Speter  AND kind=MAP_DIR
784251881Speter
785251881Speter-- STMT_UPDATE_NODE_BASE_PRESENCE
786251881SpeterUPDATE nodes SET presence = ?3
787251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
788251881Speter
789251881Speter-- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH
790251881SpeterUPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5
791251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
792251881Speter
793251881Speter-- STMT_LOOK_FOR_WORK
794251881SpeterSELECT id FROM work_queue LIMIT 1
795251881Speter
796251881Speter-- STMT_INSERT_WORK_ITEM
797251881SpeterINSERT INTO work_queue (work) VALUES (?1)
798251881Speter
799251881Speter-- STMT_SELECT_WORK_ITEM
800251881SpeterSELECT id, work FROM work_queue ORDER BY id LIMIT 1
801251881Speter
802251881Speter-- STMT_DELETE_WORK_ITEM
803251881SpeterDELETE FROM work_queue WHERE id = ?1
804251881Speter
805251881Speter-- STMT_INSERT_OR_IGNORE_PRISTINE
806251881SpeterINSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
807251881SpeterVALUES (?1, ?2, ?3, 0)
808251881Speter
809251881Speter-- STMT_INSERT_PRISTINE
810251881SpeterINSERT INTO pristine (checksum, md5_checksum, size, refcount)
811251881SpeterVALUES (?1, ?2, ?3, 0)
812251881Speter
813251881Speter-- STMT_SELECT_PRISTINE
814251881SpeterSELECT md5_checksum
815251881SpeterFROM pristine
816251881SpeterWHERE checksum = ?1
817251881Speter
818251881Speter-- STMT_SELECT_PRISTINE_SIZE
819251881SpeterSELECT size
820251881SpeterFROM pristine
821251881SpeterWHERE checksum = ?1 LIMIT 1
822251881Speter
823251881Speter-- STMT_SELECT_PRISTINE_BY_MD5
824251881SpeterSELECT checksum
825251881SpeterFROM pristine
826251881SpeterWHERE md5_checksum = ?1
827251881Speter
828251881Speter-- STMT_SELECT_UNREFERENCED_PRISTINES
829251881SpeterSELECT checksum
830251881SpeterFROM pristine
831251881SpeterWHERE refcount = 0
832251881Speter
833251881Speter-- STMT_DELETE_PRISTINE_IF_UNREFERENCED
834251881SpeterDELETE FROM pristine
835251881SpeterWHERE checksum = ?1 AND refcount = 0
836251881Speter
837251881Speter-- STMT_SELECT_COPY_PRISTINES
838251881Speter/* For the root itself */
839251881SpeterSELECT n.checksum, md5_checksum, size
840251881SpeterFROM nodes_current n
841251881SpeterLEFT JOIN pristine p ON n.checksum = p.checksum
842251881SpeterWHERE wc_id = ?1
843251881Speter  AND n.local_relpath = ?2
844251881Speter  AND n.checksum IS NOT NULL
845251881SpeterUNION ALL
846251881Speter/* And all descendants */
847251881SpeterSELECT n.checksum, md5_checksum, size
848251881SpeterFROM nodes n
849251881SpeterLEFT JOIN pristine p ON n.checksum = p.checksum
850251881SpeterWHERE wc_id = ?1
851251881Speter  AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
852251881Speter  AND op_depth >=
853251881Speter      (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
854251881Speter  AND n.checksum IS NOT NULL
855251881Speter
856251881Speter-- STMT_VACUUM
857251881SpeterVACUUM
858251881Speter
859251881Speter-- STMT_SELECT_CONFLICT_VICTIMS
860251881SpeterSELECT local_relpath, conflict_data
861251881SpeterFROM actual_node
862251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND
863251881Speter  NOT (conflict_data IS NULL)
864251881Speter
865251881Speter-- STMT_INSERT_WC_LOCK
866251881SpeterINSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels)
867251881SpeterVALUES (?1, ?2, ?3)
868251881Speter
869251881Speter-- STMT_SELECT_WC_LOCK
870251881SpeterSELECT locked_levels FROM wc_lock
871251881SpeterWHERE wc_id = ?1 AND local_dir_relpath = ?2
872251881Speter
873251881Speter-- STMT_SELECT_ANCESTOR_WCLOCKS
874251881SpeterSELECT local_dir_relpath, locked_levels FROM wc_lock
875251881SpeterWHERE wc_id = ?1
876251881Speter  AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2)
877251881Speter       OR local_dir_relpath = '')
878251881Speter
879251881Speter-- STMT_DELETE_WC_LOCK
880251881SpeterDELETE FROM wc_lock
881251881SpeterWHERE wc_id = ?1 AND local_dir_relpath = ?2
882251881Speter
883251881Speter-- STMT_FIND_WC_LOCK
884251881SpeterSELECT local_dir_relpath FROM wc_lock
885251881SpeterWHERE wc_id = ?1
886251881Speter  AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
887251881Speter
888251881Speter-- STMT_DELETE_WC_LOCK_ORPHAN
889251881SpeterDELETE FROM wc_lock
890251881SpeterWHERE wc_id = ?1 AND local_dir_relpath = ?2
891251881SpeterAND NOT EXISTS (SELECT 1 FROM nodes
892251881Speter                 WHERE nodes.wc_id = ?1
893251881Speter                   AND nodes.local_relpath = wc_lock.local_dir_relpath)
894251881Speter
895251881Speter-- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE
896251881SpeterDELETE FROM wc_lock
897251881SpeterWHERE wc_id = ?1
898251881Speter  AND (local_dir_relpath = ?2
899251881Speter       OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2))
900251881Speter  AND NOT EXISTS (SELECT 1 FROM nodes
901251881Speter                   WHERE nodes.wc_id = ?1
902251881Speter                     AND nodes.local_relpath = wc_lock.local_dir_relpath)
903251881Speter
904251881Speter-- STMT_APPLY_CHANGES_TO_BASE_NODE
905251881Speter/* translated_size and last_mod_time are not mentioned here because they will
906251881Speter   be tweaked after the working-file is installed. When we replace an existing
907251881Speter   BASE node (read: bump), preserve its file_external status. */
908251881SpeterINSERT OR REPLACE INTO nodes (
909251881Speter  wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
910251881Speter  revision, presence, depth, kind, changed_revision, changed_date,
911251881Speter  changed_author, checksum, properties, dav_cache, symlink_target,
912251881Speter  inherited_props, file_external )
913251881SpeterVALUES (?1, ?2, 0,
914251881Speter        ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17,
915251881Speter        (SELECT file_external FROM nodes
916251881Speter          WHERE wc_id = ?1
917251881Speter            AND local_relpath = ?2
918251881Speter            AND op_depth = 0))
919251881Speter
920251881Speter-- STMT_INSTALL_WORKING_NODE_FOR_DELETE
921251881SpeterINSERT OR REPLACE INTO nodes (
922251881Speter    wc_id, local_relpath, op_depth,
923251881Speter    parent_relpath, presence, kind)
924251881SpeterVALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5)
925251881Speter
926251881Speter-- STMT_DELETE_NO_LOWER_LAYER
927251881SpeterDELETE FROM nodes
928251881Speter WHERE wc_id = ?1
929251881Speter   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
930251881Speter   AND op_depth = ?3
931251881Speter   AND NOT EXISTS (SELECT 1 FROM nodes n
932251881Speter                    WHERE n.wc_id = ?1
933251881Speter                    AND n.local_relpath = nodes.local_relpath
934251881Speter                    AND n.op_depth = ?4
935251881Speter                    AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE))
936251881Speter
937251881Speter-- STMT_REPLACE_WITH_BASE_DELETED
938251881SpeterINSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath,
939251881Speter                              kind, moved_to, presence)
940251881SpeterSELECT wc_id, local_relpath, op_depth, parent_relpath,
941251881Speter       kind, moved_to, MAP_BASE_DELETED
942251881Speter  FROM nodes
943251881Speter WHERE wc_id = ?1
944251881Speter   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
945251881Speter   AND op_depth = ?3
946251881Speter
947251881Speter/* If this query is updated, STMT_INSERT_DELETE_LIST should too. */
948251881Speter-- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
949251881SpeterINSERT INTO nodes (
950251881Speter    wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
951251881SpeterSELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
952251881Speter       kind
953251881SpeterFROM nodes
954251881SpeterWHERE wc_id = ?1
955251881Speter  AND (local_relpath = ?2
956251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
957251881Speter  AND op_depth = ?3
958251881Speter  AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
959251881Speter  AND file_external IS NULL
960251881Speter
961251881Speter-- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
962251881SpeterINSERT INTO nodes (
963251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
964251881Speter    revision, presence, depth, kind, changed_revision, changed_date,
965251881Speter    changed_author, checksum, properties, translated_size, last_mod_time,
966251881Speter    symlink_target )
967251881SpeterSELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id,
968251881Speter    repos_path, revision, presence, depth, kind, changed_revision,
969251881Speter    changed_date, changed_author, checksum, properties, translated_size,
970251881Speter    last_mod_time, symlink_target
971251881SpeterFROM nodes
972251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
973251881Speter
974251881Speter-- STMT_INSERT_DELETE_FROM_BASE
975251881SpeterINSERT INTO nodes (
976251881Speter    wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
977251881SpeterSELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath,
978251881Speter    MAP_BASE_DELETED, kind
979251881SpeterFROM nodes
980251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
981251881Speter
982251881Speter/* Not valid on the wc-root */
983251881Speter-- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE
984251881SpeterUPDATE nodes SET op_depth = ?3 + 1
985251881SpeterWHERE wc_id = ?1
986251881Speter AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
987251881Speter AND op_depth = ?3
988251881Speter
989251881Speter-- STMT_UPDATE_OP_DEPTH_RECURSIVE
990251881SpeterUPDATE nodes SET op_depth = ?4, moved_here = NULL
991251881SpeterWHERE wc_id = ?1
992251881Speter AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
993251881Speter AND op_depth = ?3
994251881Speter
995251881Speter-- STMT_DOES_NODE_EXIST
996251881SpeterSELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
997251881SpeterLIMIT 1
998251881Speter
999251881Speter-- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS
1000251881SpeterSELECT local_relpath FROM nodes
1001251881SpeterWHERE wc_id = ?1
1002251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1003251881Speter  AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED
1004251881SpeterLIMIT 1
1005251881Speter
1006251881Speter/* Select all excluded nodes. Not valid on the WC-root */
1007251881Speter-- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS
1008251881SpeterSELECT local_relpath FROM nodes
1009251881SpeterWHERE wc_id = ?1
1010251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1011251881Speter  AND op_depth = 0
1012251881Speter  AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED)
1013251881Speter
1014251881Speter/* Creates a copy from one top level NODE to a different location */
1015251881Speter-- STMT_INSERT_WORKING_NODE_COPY_FROM
1016251881SpeterINSERT OR REPLACE INTO nodes (
1017251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1018251881Speter    repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1019251881Speter    changed_date, changed_author, checksum, properties, translated_size,
1020251881Speter    last_mod_time, symlink_target, moved_to )
1021251881SpeterSELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1022251881Speter    repos_id, repos_path, revision, ?6 /*presence*/, depth,
1023251881Speter    ?7/*moved_here*/, kind, changed_revision, changed_date,
1024251881Speter    changed_author, checksum, properties, translated_size,
1025251881Speter    last_mod_time, symlink_target,
1026251881Speter    (SELECT dst.moved_to FROM nodes AS dst
1027251881Speter                         WHERE dst.wc_id = ?1
1028251881Speter                         AND dst.local_relpath = ?3
1029251881Speter                         AND dst.op_depth = ?4)
1030251881SpeterFROM nodes_current
1031251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1032251881Speter
1033251881Speter-- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH
1034251881SpeterINSERT OR REPLACE INTO nodes (
1035251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1036251881Speter    repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1037251881Speter    changed_date, changed_author, checksum, properties, translated_size,
1038251881Speter    last_mod_time, symlink_target, moved_to )
1039251881SpeterSELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1040251881Speter    repos_id, repos_path, revision, ?6 /*presence*/, depth,
1041251881Speter    ?8 /*moved_here*/, kind, changed_revision, changed_date,
1042251881Speter    changed_author, checksum, properties, translated_size,
1043251881Speter    last_mod_time, symlink_target,
1044251881Speter    (SELECT dst.moved_to FROM nodes AS dst
1045251881Speter                         WHERE dst.wc_id = ?1
1046251881Speter                         AND dst.local_relpath = ?3
1047251881Speter                         AND dst.op_depth = ?4)
1048251881SpeterFROM nodes
1049251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7
1050251881Speter
1051251881Speter-- STMT_UPDATE_BASE_REVISION
1052251881SpeterUPDATE nodes SET revision = ?3
1053251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1054251881Speter
1055251881Speter-- STMT_UPDATE_BASE_REPOS
1056251881SpeterUPDATE nodes SET repos_id = ?3, repos_path = ?4
1057251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1058251881Speter
1059251881Speter-- STMT_ACTUAL_HAS_CHILDREN
1060251881SpeterSELECT 1 FROM actual_node
1061251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
1062251881SpeterLIMIT 1
1063251881Speter
1064251881Speter-- STMT_INSERT_EXTERNAL
1065251881SpeterINSERT OR REPLACE INTO externals (
1066251881Speter    wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath,
1067251881Speter    repos_id, def_repos_relpath, def_operational_revision, def_revision)
1068251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
1069251881Speter
1070251881Speter-- STMT_SELECT_EXTERNAL_INFO
1071251881SpeterSELECT presence, kind, def_local_relpath, repos_id,
1072251881Speter    def_repos_relpath, def_operational_revision, def_revision
1073251881SpeterFROM externals WHERE wc_id = ?1 AND local_relpath = ?2
1074251881SpeterLIMIT 1
1075251881Speter
1076251881Speter-- STMT_DELETE_FILE_EXTERNALS
1077251881SpeterDELETE FROM nodes
1078251881SpeterWHERE wc_id = ?1
1079251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1080251881Speter  AND op_depth = 0
1081251881Speter  AND file_external IS NOT NULL
1082251881Speter
1083251881Speter-- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS
1084251881SpeterDELETE FROM externals
1085251881SpeterWHERE wc_id = ?1
1086251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1087251881Speter  AND kind != MAP_DIR
1088251881Speter
1089251881Speter-- STMT_DELETE_EXTERNAL_REGISTATIONS
1090251881SpeterDELETE FROM externals
1091251881SpeterWHERE wc_id = ?1
1092251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1093251881Speter
1094251881Speter/* Select all committable externals, i.e. only unpegged ones on the same
1095251881Speter * repository as the target path ?2, that are defined by WC ?1 to
1096251881Speter * live below the target path. It does not matter which ancestor has the
1097251881Speter * svn:externals definition, only the local path at which the external is
1098251881Speter * supposed to be checked out is queried.
1099251881Speter * Arguments:
1100251881Speter *  ?1: wc_id.
1101251881Speter *  ?2: the target path, local relpath inside ?1.
1102251881Speter *
1103251881Speter * ### NOTE: This statement deliberately removes file externals that live
1104251881Speter * inside an unversioned dir, because commit still breaks on those.
1105251881Speter * Once that's been fixed, the conditions below "--->8---" become obsolete. */
1106251881Speter-- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW
1107251881SpeterSELECT local_relpath, kind, def_repos_relpath,
1108251881Speter  (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1109251881SpeterFROM externals e
1110251881SpeterWHERE wc_id = ?1
1111251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1112251881Speter  AND def_revision IS NULL
1113251881Speter  AND repos_id = (SELECT repos_id
1114251881Speter                  FROM nodes AS n
1115251881Speter                  WHERE n.wc_id = ?1
1116251881Speter                    AND n.local_relpath = ''
1117251881Speter                    AND n.op_depth = 0)
1118251881Speter  AND ((kind='dir')
1119251881Speter       OR EXISTS (SELECT 1 FROM nodes
1120251881Speter                  WHERE nodes.wc_id = e.wc_id
1121251881Speter                  AND nodes.local_relpath = e.parent_relpath))
1122251881Speter
1123251881Speter-- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW
1124251881SpeterSELECT local_relpath, kind, def_repos_relpath,
1125251881Speter  (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1126251881SpeterFROM externals e
1127251881SpeterWHERE wc_id = ?1
1128251881Speter  AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2)
1129251881Speter  AND parent_relpath = ?2
1130251881Speter  AND def_revision IS NULL
1131251881Speter  AND repos_id = (SELECT repos_id
1132251881Speter                    FROM nodes AS n
1133251881Speter                    WHERE n.wc_id = ?1
1134251881Speter                      AND n.local_relpath = ''
1135251881Speter                      AND n.op_depth = 0)
1136251881Speter  AND ((kind='dir')
1137251881Speter       OR EXISTS (SELECT 1 FROM nodes
1138251881Speter                  WHERE nodes.wc_id = e.wc_id
1139251881Speter                  AND nodes.local_relpath = e.parent_relpath))
1140251881Speter
1141251881Speter-- STMT_SELECT_EXTERNALS_DEFINED
1142251881SpeterSELECT local_relpath, def_local_relpath
1143251881SpeterFROM externals
1144251881Speter/* ### The Sqlite optimizer needs help here ###
1145251881Speter * WHERE wc_id = ?1
1146251881Speter *   AND (def_local_relpath = ?2
1147251881Speter *        OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */
1148251881SpeterWHERE (wc_id = ?1 AND def_local_relpath = ?2)
1149251881Speter   OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2))
1150251881Speter
1151251881Speter-- STMT_DELETE_EXTERNAL
1152251881SpeterDELETE FROM externals
1153251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1154251881Speter
1155251881Speter-- STMT_SELECT_EXTERNAL_PROPERTIES
1156251881Speter/* ### It would be nice if Sqlite would handle
1157251881Speter * SELECT IFNULL((SELECT properties FROM actual_node a
1158251881Speter *                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1159251881Speter *               properties),
1160251881Speter *        local_relpath, depth
1161251881Speter * FROM nodes_current n
1162251881Speter * WHERE wc_id = ?1
1163251881Speter *   AND (local_relpath = ?2
1164251881Speter *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1165251881Speter *   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1166251881Speter * ### But it would take a double table scan execution plan for it.
1167251881Speter * ### Maybe there is something else going on? */
1168251881SpeterSELECT IFNULL((SELECT properties FROM actual_node a
1169251881Speter               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1170251881Speter              properties),
1171251881Speter       local_relpath, depth
1172251881SpeterFROM nodes_current n
1173251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1174251881Speter  AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1175251881SpeterUNION ALL
1176251881SpeterSELECT IFNULL((SELECT properties FROM actual_node a
1177251881Speter               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1178251881Speter              properties),
1179251881Speter       local_relpath, depth
1180251881SpeterFROM nodes_current n
1181251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1182251881Speter  AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1183251881Speter
1184251881Speter-- STMT_SELECT_CURRENT_PROPS_RECURSIVE
1185251881Speter/* ### Ugly OR to make sqlite use the proper optimizations */
1186251881SpeterSELECT IFNULL((SELECT properties FROM actual_node a
1187251881Speter               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1188251881Speter              properties),
1189251881Speter       local_relpath
1190251881SpeterFROM nodes_current n
1191251881SpeterWHERE (wc_id = ?1 AND local_relpath = ?2)
1192251881Speter   OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1193251881Speter
1194251881Speter-- STMT_PRAGMA_LOCKING_MODE
1195251881SpeterPRAGMA locking_mode = exclusive
1196251881Speter
1197251881Speter/* ------------------------------------------------------------------------- */
1198251881Speter
1199251881Speter/* these are used in entries.c  */
1200251881Speter
1201251881Speter-- STMT_INSERT_ACTUAL_NODE
1202251881SpeterINSERT OR REPLACE INTO actual_node (
1203251881Speter  wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data)
1204251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6)
1205251881Speter
1206251881Speter/* ------------------------------------------------------------------------- */
1207251881Speter
1208251881Speter/* these are used in upgrade.c  */
1209251881Speter
1210251881Speter-- STMT_UPDATE_ACTUAL_CONFLICT_DATA
1211251881SpeterUPDATE actual_node SET conflict_data = ?3
1212251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1213251881Speter
1214251881Speter-- STMT_INSERT_ACTUAL_CONFLICT_DATA
1215251881SpeterINSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
1216251881SpeterVALUES (?1, ?2, ?3, ?4)
1217251881Speter
1218251881Speter-- STMT_SELECT_ALL_FILES
1219251881SpeterSELECT local_relpath FROM nodes_current
1220251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
1221251881Speter
1222251881Speter-- STMT_UPDATE_NODE_PROPS
1223251881SpeterUPDATE nodes SET properties = ?4
1224251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1225251881Speter
1226251881Speter-- STMT_PRAGMA_TABLE_INFO_NODES
1227251881SpeterPRAGMA table_info("NODES")
1228251881Speter
1229251881Speter/* --------------------------------------------------------------------------
1230251881Speter * Complex queries for callback walks, caching results in a temporary table.
1231251881Speter *
1232251881Speter * These target table are then used for joins against NODES, or for reporting
1233251881Speter */
1234251881Speter
1235251881Speter-- STMT_CREATE_TARGET_PROP_CACHE
1236251881SpeterDROP TABLE IF EXISTS target_prop_cache;
1237251881SpeterCREATE TEMPORARY TABLE target_prop_cache (
1238251881Speter  local_relpath TEXT NOT NULL PRIMARY KEY,
1239251881Speter  kind TEXT NOT NULL,
1240251881Speter  properties BLOB
1241251881Speter);
1242251881Speter/* ###  Need index?
1243251881SpeterCREATE UNIQUE INDEX temp__node_props_cache_unique
1244251881Speter  ON temp__node_props_cache (local_relpath) */
1245251881Speter
1246251881Speter-- STMT_CACHE_TARGET_PROPS
1247251881SpeterINSERT INTO target_prop_cache(local_relpath, kind, properties)
1248251881Speter SELECT n.local_relpath, n.kind,
1249251881Speter        IFNULL((SELECT properties FROM actual_node AS a
1250251881Speter                 WHERE a.wc_id = n.wc_id
1251251881Speter                   AND a.local_relpath = n.local_relpath),
1252251881Speter               n.properties)
1253251881Speter   FROM targets_list AS t
1254251881Speter   JOIN nodes AS n
1255251881Speter     ON n.wc_id = ?1
1256251881Speter    AND n.local_relpath = t.local_relpath
1257251881Speter    AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1258251881Speter                      WHERE n3.wc_id = ?1
1259251881Speter                        AND n3.local_relpath = t.local_relpath)
1260251881Speter  WHERE t.wc_id = ?1
1261251881Speter    AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1262251881Speter  ORDER BY t.local_relpath
1263251881Speter
1264251881Speter-- STMT_CACHE_TARGET_PRISTINE_PROPS
1265251881SpeterINSERT INTO target_prop_cache(local_relpath, kind, properties)
1266251881Speter SELECT n.local_relpath, n.kind,
1267251881Speter        CASE n.presence
1268251881Speter          WHEN MAP_BASE_DELETED
1269251881Speter          THEN (SELECT properties FROM nodes AS p
1270251881Speter                 WHERE p.wc_id = n.wc_id
1271251881Speter                   AND p.local_relpath = n.local_relpath
1272251881Speter                   AND p.op_depth < n.op_depth
1273251881Speter                 ORDER BY p.op_depth DESC /* LIMIT 1 */)
1274251881Speter          ELSE properties END
1275251881Speter  FROM targets_list AS t
1276251881Speter  JOIN nodes AS n
1277251881Speter    ON n.wc_id = ?1
1278251881Speter   AND n.local_relpath = t.local_relpath
1279251881Speter   AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1280251881Speter                     WHERE n3.wc_id = ?1
1281251881Speter                       AND n3.local_relpath = t.local_relpath)
1282251881Speter  WHERE t.wc_id = ?1
1283251881Speter    AND (presence = MAP_NORMAL
1284251881Speter         OR presence = MAP_INCOMPLETE
1285251881Speter         OR presence = MAP_BASE_DELETED)
1286251881Speter  ORDER BY t.local_relpath
1287251881Speter
1288251881Speter-- STMT_SELECT_ALL_TARGET_PROP_CACHE
1289251881SpeterSELECT local_relpath, properties FROM target_prop_cache
1290251881SpeterORDER BY local_relpath
1291251881Speter
1292251881Speter-- STMT_DROP_TARGET_PROP_CACHE
1293251881SpeterDROP TABLE target_prop_cache;
1294251881Speter
1295251881Speter-- STMT_CREATE_REVERT_LIST
1296251881SpeterDROP TABLE IF EXISTS revert_list;
1297251881SpeterCREATE TEMPORARY TABLE revert_list (
1298251881Speter   /* need wc_id if/when revert spans multiple working copies */
1299251881Speter   local_relpath TEXT NOT NULL,
1300251881Speter   actual INTEGER NOT NULL,         /* 1 if an actual row, 0 if a nodes row */
1301251881Speter   conflict_data BLOB,
1302251881Speter   notify INTEGER,         /* 1 if an actual row had props or tree conflict */
1303251881Speter   op_depth INTEGER,
1304251881Speter   repos_id INTEGER,
1305251881Speter   kind TEXT,
1306251881Speter   PRIMARY KEY (local_relpath, actual)
1307251881Speter   );
1308251881SpeterDROP TRIGGER IF EXISTS   trigger_revert_list_nodes;
1309251881SpeterCREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1310251881SpeterBEFORE DELETE ON nodes
1311251881SpeterBEGIN
1312251881Speter   INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1313251881Speter                                      repos_id, kind)
1314251881Speter   SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
1315251881SpeterEND;
1316251881SpeterDROP TRIGGER IF EXISTS   trigger_revert_list_actual_delete;
1317251881SpeterCREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
1318251881SpeterBEFORE DELETE ON actual_node
1319251881SpeterBEGIN
1320251881Speter   INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1321251881Speter                                      notify)
1322251881Speter   SELECT OLD.local_relpath, 1, OLD.conflict_data,
1323251881Speter          CASE
1324251881Speter            WHEN OLD.properties IS NOT NULL
1325251881Speter            THEN 1
1326251881Speter            WHEN NOT EXISTS(SELECT 1 FROM NODES n
1327251881Speter                            WHERE n.wc_id = OLD.wc_id
1328251881Speter                              AND n.local_relpath = OLD.local_relpath)
1329251881Speter            THEN 1
1330251881Speter            ELSE NULL
1331251881Speter          END;
1332251881SpeterEND;
1333251881SpeterDROP TRIGGER IF EXISTS   trigger_revert_list_actual_update;
1334251881SpeterCREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
1335251881SpeterBEFORE UPDATE ON actual_node
1336251881SpeterBEGIN
1337251881Speter   INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1338251881Speter                                      notify)
1339251881Speter   SELECT OLD.local_relpath, 1, OLD.conflict_data,
1340251881Speter          CASE
1341251881Speter            WHEN OLD.properties IS NOT NULL
1342251881Speter            THEN 1
1343251881Speter            WHEN NOT EXISTS(SELECT 1 FROM NODES n
1344251881Speter                            WHERE n.wc_id = OLD.wc_id
1345251881Speter                              AND n.local_relpath = OLD.local_relpath)
1346251881Speter            THEN 1
1347251881Speter            ELSE NULL
1348251881Speter          END;
1349251881SpeterEND
1350251881Speter
1351251881Speter-- STMT_DROP_REVERT_LIST_TRIGGERS
1352251881SpeterDROP TRIGGER trigger_revert_list_nodes;
1353251881SpeterDROP TRIGGER trigger_revert_list_actual_delete;
1354251881SpeterDROP TRIGGER trigger_revert_list_actual_update
1355251881Speter
1356251881Speter-- STMT_SELECT_REVERT_LIST
1357251881SpeterSELECT actual, notify, kind, op_depth, repos_id, conflict_data
1358251881SpeterFROM revert_list
1359251881SpeterWHERE local_relpath = ?1
1360251881SpeterORDER BY actual DESC
1361251881Speter
1362251881Speter-- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1363251881SpeterSELECT local_relpath, kind
1364251881SpeterFROM revert_list
1365251881SpeterWHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1366251881Speter  AND op_depth >= ?2
1367251881Speter  AND repos_id IS NOT NULL
1368251881SpeterORDER BY local_relpath
1369251881Speter
1370251881Speter-- STMT_DELETE_REVERT_LIST
1371251881SpeterDELETE FROM revert_list WHERE local_relpath = ?1
1372251881Speter
1373251881Speter-- STMT_SELECT_REVERT_LIST_RECURSIVE
1374251881SpeterSELECT DISTINCT local_relpath
1375251881SpeterFROM revert_list
1376251881SpeterWHERE (local_relpath = ?1
1377251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1378251881Speter  AND (notify OR actual = 0)
1379251881SpeterORDER BY local_relpath
1380251881Speter
1381251881Speter-- STMT_DELETE_REVERT_LIST_RECURSIVE
1382251881SpeterDELETE FROM revert_list
1383251881SpeterWHERE (local_relpath = ?1
1384251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1385251881Speter
1386251881Speter-- STMT_DROP_REVERT_LIST
1387251881SpeterDROP TABLE IF EXISTS revert_list
1388251881Speter
1389251881Speter-- STMT_CREATE_DELETE_LIST
1390251881SpeterDROP TABLE IF EXISTS delete_list;
1391251881SpeterCREATE TEMPORARY TABLE delete_list (
1392251881Speter/* ### we should put the wc_id in here in case a delete spans multiple
1393251881Speter   ### working copies. queries, etc will need to be adjusted.  */
1394251881Speter   local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE
1395251881Speter   )
1396251881Speter
1397251881Speter/* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE.
1398251881Speter   A subquery is used instead of nodes_current to avoid a table scan */
1399251881Speter-- STMT_INSERT_DELETE_LIST
1400251881SpeterINSERT INTO delete_list(local_relpath)
1401251881SpeterSELECT local_relpath FROM nodes AS n
1402251881SpeterWHERE wc_id = ?1
1403251881Speter  AND (local_relpath = ?2
1404251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1405251881Speter  AND op_depth >= ?3
1406251881Speter  AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
1407251881Speter                  WHERE s.wc_id = ?1
1408251881Speter                    AND s.local_relpath = n.local_relpath)
1409251881Speter  AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1410251881Speter  AND file_external IS NULL
1411251881Speter
1412251881Speter-- STMT_SELECT_DELETE_LIST
1413251881SpeterSELECT local_relpath FROM delete_list
1414251881SpeterORDER BY local_relpath
1415251881Speter
1416251881Speter-- STMT_FINALIZE_DELETE
1417251881SpeterDROP TABLE IF EXISTS delete_list
1418251881Speter
1419251881Speter-- STMT_CREATE_UPDATE_MOVE_LIST
1420251881SpeterDROP TABLE IF EXISTS update_move_list;
1421251881SpeterCREATE TEMPORARY TABLE update_move_list (
1422251881Speter/* ### we should put the wc_id in here in case a move update spans multiple
1423251881Speter   ### working copies. queries, etc will need to be adjusted.  */
1424251881Speter  local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
1425251881Speter  action INTEGER NOT NULL,
1426251881Speter  kind  INTEGER NOT NULL,
1427251881Speter  content_state INTEGER NOT NULL,
1428251881Speter  prop_state  INTEGER NOT NULL
1429251881Speter  )
1430251881Speter
1431251881Speter-- STMT_INSERT_UPDATE_MOVE_LIST
1432251881SpeterINSERT INTO update_move_list(local_relpath, action, kind, content_state,
1433251881Speter  prop_state)
1434251881SpeterVALUES (?1, ?2, ?3, ?4, ?5)
1435251881Speter
1436251881Speter-- STMT_SELECT_UPDATE_MOVE_LIST
1437251881SpeterSELECT local_relpath, action, kind, content_state, prop_state
1438251881SpeterFROM update_move_list
1439251881SpeterORDER BY local_relpath
1440251881Speter
1441251881Speter-- STMT_FINALIZE_UPDATE_MOVE
1442251881SpeterDROP TABLE IF EXISTS update_move_list
1443251881Speter
1444251881Speter/* ------------------------------------------------------------------------- */
1445251881Speter
1446251881Speter/* Queries for revision status. */
1447251881Speter
1448251881Speter-- STMT_SELECT_MIN_MAX_REVISIONS
1449251881SpeterSELECT MIN(revision), MAX(revision),
1450251881Speter       MIN(changed_revision), MAX(changed_revision) FROM nodes
1451251881Speter  WHERE wc_id = ?1
1452251881Speter    AND (local_relpath = ?2
1453251881Speter         OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1454251881Speter    AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1455251881Speter    AND file_external IS NULL
1456251881Speter    AND op_depth = 0
1457251881Speter
1458251881Speter-- STMT_HAS_SPARSE_NODES
1459251881SpeterSELECT 1 FROM nodes
1460251881SpeterWHERE wc_id = ?1
1461251881Speter  AND (local_relpath = ?2
1462251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1463251881Speter  AND op_depth = 0
1464251881Speter  AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED)
1465251881Speter        OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN))
1466251881Speter  AND file_external IS NULL
1467251881SpeterLIMIT 1
1468251881Speter
1469251881Speter-- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1470251881SpeterSELECT 1 FROM nodes
1471251881SpeterWHERE wc_id = ?1
1472251881Speter  AND (local_relpath = ?2
1473251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1474251881Speter  AND op_depth > 0
1475251881SpeterLIMIT 1
1476251881Speter
1477251881Speter-- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1478251881SpeterSELECT 1 FROM actual_node
1479251881SpeterWHERE wc_id = ?1
1480251881Speter  AND (local_relpath = ?2
1481251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1482251881Speter  AND properties IS NOT NULL
1483251881SpeterLIMIT 1
1484251881Speter
1485251881Speter-- STMT_HAS_SWITCHED
1486251881SpeterSELECT 1
1487251881SpeterFROM nodes
1488251881SpeterWHERE wc_id = ?1
1489251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1490251881Speter  AND op_depth = 0
1491251881Speter  AND file_external IS NULL
1492251881Speter  AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1493251881Speter  AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
1494251881SpeterLIMIT 1
1495251881Speter
1496251881Speter-- STMT_SELECT_BASE_FILES_RECURSIVE
1497251881SpeterSELECT local_relpath, translated_size, last_mod_time FROM nodes AS n
1498251881SpeterWHERE wc_id = ?1
1499251881Speter  AND (local_relpath = ?2
1500251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1501251881Speter  AND op_depth = 0
1502251881Speter  AND kind=MAP_FILE
1503251881Speter  AND presence=MAP_NORMAL
1504251881Speter  AND file_external IS NULL
1505251881Speter
1506251881Speter/* ### FIXME: op-depth?  What about multiple moves? */
1507251881Speter-- STMT_SELECT_MOVED_FROM_RELPATH
1508251881SpeterSELECT local_relpath, op_depth FROM nodes
1509251881SpeterWHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1510251881Speter
1511251881Speter-- STMT_UPDATE_MOVED_TO_RELPATH
1512251881SpeterUPDATE nodes SET moved_to = ?4
1513251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1514251881Speter
1515251881Speter-- STMT_CLEAR_MOVED_TO_RELPATH
1516251881SpeterUPDATE nodes SET moved_to = NULL
1517251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1518251881Speter
1519251881Speter-- STMT_CLEAR_MOVED_HERE_RECURSIVE
1520251881SpeterUPDATE nodes SET moved_here = NULL
1521251881SpeterWHERE wc_id = ?1
1522251881Speter AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1523251881Speter AND op_depth = ?3
1524251881Speter
1525251881Speter/* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1.
1526251881Speter * Each row returns a moved-here path (always a child of ?2) in the first
1527251881Speter * column, and its matching moved-away (deleted) path in the second column. */
1528251881Speter-- STMT_SELECT_MOVED_HERE_CHILDREN
1529251881SpeterSELECT moved_to, local_relpath FROM nodes
1530251881SpeterWHERE wc_id = ?1 AND op_depth > 0
1531251881Speter  AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1532251881Speter
1533251881Speter-- STMT_SELECT_MOVED_FOR_DELETE
1534251881SpeterSELECT local_relpath, moved_to, op_depth FROM nodes
1535251881SpeterWHERE wc_id = ?1
1536251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1537251881Speter  AND moved_to IS NOT NULL
1538251881Speter  AND op_depth >= (SELECT MAX(op_depth) FROM nodes o
1539251881Speter                    WHERE o.wc_id = ?1
1540251881Speter                      AND o.local_relpath = ?2)
1541251881Speter
1542251881Speter-- STMT_UPDATE_MOVED_TO_DESCENDANTS
1543251881SpeterUPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1544251881Speter WHERE wc_id = ?1
1545251881Speter   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1546251881Speter
1547251881Speter-- STMT_CLEAR_MOVED_TO_DESCENDANTS
1548251881SpeterUPDATE nodes SET moved_to = NULL
1549251881Speter WHERE wc_id = ?1
1550251881Speter   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1551251881Speter
1552251881Speter
1553251881Speter/* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1,
1554251881Speter * where the source of the move is within the subtree rooted at path ?2, and
1555251881Speter * the destination of the move is outside the subtree rooted at path ?2. */
1556251881Speter-- STMT_SELECT_MOVED_PAIR2
1557251881SpeterSELECT local_relpath, moved_to, op_depth FROM nodes
1558251881SpeterWHERE wc_id = ?1
1559251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1560251881Speter  AND moved_to IS NOT NULL
1561251881Speter  AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1562251881Speter  AND op_depth >= (SELECT MAX(op_depth) FROM nodes o
1563251881Speter                    WHERE o.wc_id = ?1
1564251881Speter                      AND o.local_relpath = ?2)
1565251881Speter
1566251881Speter-- STMT_SELECT_MOVED_PAIR3
1567251881SpeterSELECT local_relpath, moved_to, op_depth, kind FROM nodes
1568251881SpeterWHERE wc_id = ?1
1569251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1570251881Speter  AND op_depth > ?3
1571251881Speter  AND moved_to IS NOT NULL
1572251881Speter
1573251881Speter-- STMT_SELECT_MOVED_OUTSIDE
1574251881SpeterSELECT local_relpath, moved_to FROM nodes
1575251881SpeterWHERE wc_id = ?1
1576251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1577251881Speter  AND op_depth >= ?3
1578251881Speter  AND moved_to IS NOT NULL
1579251881Speter  AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1580251881Speter
1581251881Speter-- STMT_SELECT_OP_DEPTH_MOVED_PAIR
1582251881SpeterSELECT n.local_relpath, n.moved_to,
1583251881Speter       (SELECT o.repos_path FROM nodes AS o
1584251881Speter        WHERE o.wc_id = n.wc_id
1585251881Speter          AND o.local_relpath = n.local_relpath
1586251881Speter          AND o.op_depth < ?3 ORDER BY o.op_depth DESC LIMIT 1)
1587251881SpeterFROM nodes AS n
1588251881SpeterWHERE n.wc_id = ?1
1589251881Speter  AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1590251881Speter  AND n.op_depth = ?3
1591251881Speter  AND n.moved_to IS NOT NULL
1592251881Speter
1593251881Speter-- STMT_SELECT_MOVED_DESCENDANTS
1594251881SpeterSELECT n.local_relpath, h.moved_to
1595251881SpeterFROM nodes n, nodes h
1596251881SpeterWHERE n.wc_id = ?1
1597251881Speter  AND h.wc_id = ?1
1598251881Speter  AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1599251881Speter  AND h.local_relpath = n.local_relpath
1600251881Speter  AND n.op_depth = ?3
1601251881Speter  AND h.op_depth = (SELECT MIN(o.op_depth)
1602251881Speter                    FROM nodes o
1603251881Speter                    WHERE o.wc_id = ?1
1604251881Speter                      AND o.local_relpath = n.local_relpath
1605251881Speter                      AND o.op_depth > ?3)
1606251881Speter  AND h.moved_to IS NOT NULL
1607251881Speter
1608251881Speter-- STMT_COMMIT_UPDATE_ORIGIN
1609251881Speter/* Note that the only reason this SUBSTR() trick is valid is that you
1610251881Speter   can move neither the working copy nor the repository root.
1611251881Speter
1612251881Speter   SUBSTR(local_relpath, LENGTH(?2)+1) includes the '/' of the path */
1613251881SpeterUPDATE nodes SET repos_id = ?4,
1614251881Speter                 repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
1615251881Speter                 revision = ?6
1616251881SpeterWHERE wc_id = ?1
1617251881Speter  AND (local_relpath = ?2
1618251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1619251881Speter  AND op_depth = ?3
1620251881Speter
1621251881Speter-- STMT_HAS_LAYER_BETWEEN
1622251881SpeterSELECT 1 FROM NODES
1623251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1624251881Speter
1625251881Speter-- STMT_SELECT_REPOS_PATH_REVISION
1626251881SpeterSELECT local_relpath, repos_path, revision FROM nodes
1627251881SpeterWHERE wc_id = ?1
1628251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1629251881Speter  AND op_depth = 0
1630251881SpeterORDER BY local_relpath
1631251881Speter
1632251881Speter-- STMT_SELECT_HAS_NON_FILE_CHILDREN
1633251881SpeterSELECT 1 FROM nodes
1634251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != MAP_FILE
1635251881Speter
1636251881Speter-- STMT_SELECT_HAS_GRANDCHILDREN
1637251881SpeterSELECT 1 FROM nodes
1638251881SpeterWHERE wc_id = ?1
1639251881Speter  AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1640251881Speter  AND op_depth = 0
1641251881Speter  AND file_external IS NULL
1642251881Speter
1643251881Speter/* ------------------------------------------------------------------------- */
1644251881Speter
1645251881Speter/* Queries for verification. */
1646251881Speter
1647251881Speter-- STMT_SELECT_ALL_NODES
1648251881SpeterSELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1649251881SpeterWHERE wc_id = ?1
1650251881Speter
1651251881Speter/* ------------------------------------------------------------------------- */
1652251881Speter
1653251881Speter/* Queries for cached inherited properties. */
1654251881Speter
1655251881Speter/* Select the inherited properties of a single base node. */
1656251881Speter-- STMT_SELECT_IPROPS
1657251881SpeterSELECT inherited_props FROM nodes
1658251881SpeterWHERE wc_id = ?1
1659251881Speter  AND local_relpath = ?2
1660251881Speter  AND op_depth = 0
1661251881Speter
1662251881Speter/* Update the inherited properties of a single base node. */
1663251881Speter-- STMT_UPDATE_IPROP
1664251881SpeterUPDATE nodes
1665251881SpeterSET inherited_props = ?3
1666251881SpeterWHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
1667251881Speter
1668251881Speter/* Select a single path if its base node has cached inherited properties. */
1669251881Speter-- STMT_SELECT_IPROPS_NODE
1670251881SpeterSELECT local_relpath, repos_path FROM nodes
1671251881SpeterWHERE wc_id = ?1
1672251881Speter  AND local_relpath = ?2
1673251881Speter  AND op_depth = 0
1674251881Speter  AND (inherited_props not null)
1675251881Speter
1676251881Speter/* Select all paths whose base nodes are below a given path, which
1677251881Speter   have cached inherited properties. */
1678251881Speter-- STMT_SELECT_IPROPS_RECURSIVE
1679251881SpeterSELECT local_relpath, repos_path FROM nodes
1680251881SpeterWHERE wc_id = ?1
1681251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1682251881Speter  AND op_depth = 0
1683251881Speter  AND (inherited_props not null)
1684251881Speter
1685251881Speter-- STMT_SELECT_IPROPS_CHILDREN
1686251881SpeterSELECT local_relpath, repos_path FROM nodes
1687251881SpeterWHERE wc_id = ?1
1688251881Speter  AND parent_relpath = ?2
1689251881Speter  AND op_depth = 0
1690251881Speter  AND (inherited_props not null)
1691251881Speter
1692251881Speter/* ------------------------------------------------------------------------- */
1693251881Speter
1694251881Speter/* Grab all the statements related to the schema.  */
1695251881Speter
1696251881Speter-- include: wc-metadata
1697251881Speter-- include: wc-checks
1698