1 /* sqlite.c
2  *
3  * ====================================================================
4  *    Licensed to the Apache Software Foundation (ASF) under one
5  *    or more contributor license agreements.  See the NOTICE file
6  *    distributed with this work for additional information
7  *    regarding copyright ownership.  The ASF licenses this file
8  *    to you under the Apache License, Version 2.0 (the
9  *    "License"); you may not use this file except in compliance
10  *    with the License.  You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  *    Unless required by applicable law or agreed to in writing,
15  *    software distributed under the License is distributed on an
16  *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  *    KIND, either express or implied.  See the License for the
18  *    specific language governing permissions and limitations
19  *    under the License.
20  * ====================================================================
21  */
22 
23 #include <apr_pools.h>
24 
25 #include "svn_types.h"
26 #include "svn_error.h"
27 #include "svn_pools.h"
28 #include "svn_io.h"
29 #include "svn_dirent_uri.h"
30 #include "svn_checksum.h"
31 
32 #include "internal_statements.h"
33 
34 #include "private/svn_sqlite.h"
35 #include "svn_private_config.h"
36 #include "private/svn_dep_compat.h"
37 #include "private/svn_atomic.h"
38 #include "private/svn_skel.h"
39 #include "private/svn_token.h"
40 #ifdef WIN32
41 #include "private/svn_io_private.h"
42 #include "private/svn_utf_private.h"
43 #endif
44 
45 #ifdef SVN_UNICODE_NORMALIZATION_FIXES
46 #include "private/svn_utf_private.h"
47 #include "private/svn_string_private.h"
48 #endif /* SVN_UNICODE_NORMALIZATION_FIXES */
49 
50 #ifdef SQLITE3_DEBUG
51 #include "private/svn_debug.h"
52 #endif
53 
54 #ifdef SVN_SQLITE_INLINE
55 /* Import the sqlite3 API vtable from sqlite3wrapper.c */
56 #  define SQLITE_OMIT_DEPRECATED
57 #  include <sqlite3ext.h>
58 extern const sqlite3_api_routines *const svn_sqlite3__api_funcs;
59 extern int (*const svn_sqlite3__api_initialize)(void);
60 extern int (*const svn_sqlite3__api_config)(int, ...);
61 #  define sqlite3_api svn_sqlite3__api_funcs
62 #  define sqlite3_initialize svn_sqlite3__api_initialize
63 #  define sqlite3_config svn_sqlite3__api_config
64 #else
65 #  include <sqlite3.h>
66 #endif
67 
68 #if !SQLITE_VERSION_AT_LEAST(3,8,2)
69 #error SQLite is too old -- version 3.8.2 is the minimum required version
70 #endif
71 
72 #ifndef SQLITE_DETERMINISTIC
73 #define SQLITE_DETERMINISTIC 0
74 #endif
75 
76 #ifdef SVN_UNICODE_NORMALIZATION_FIXES
77 /* Limit the length of a GLOB or LIKE pattern. */
78 #ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
79 # define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
80 #endif
81 #endif /* SVN_UNICODE_NORMALIZATION_FIXES */
82 
83 const char *
svn_sqlite__compiled_version(void)84 svn_sqlite__compiled_version(void)
85 {
86   static const char sqlite_version[] = SQLITE_VERSION;
87   return sqlite_version;
88 }
89 
90 const char *
svn_sqlite__runtime_version(void)91 svn_sqlite__runtime_version(void)
92 {
93   return sqlite3_libversion();
94 }
95 
96 
97 INTERNAL_STATEMENTS_SQL_DECLARE_STATEMENTS(internal_statements);
98 
99 
100 #ifdef SQLITE3_DEBUG
101 /* An sqlite query execution callback. */
102 static void
sqlite_tracer(void * data,const char * sql)103 sqlite_tracer(void *data, const char *sql)
104 {
105   /*  sqlite3 *db3 = data; */
106   SVN_DBG(("sql=\"%s\"\n", sql));
107 }
108 #endif
109 
110 #ifdef SQLITE3_PROFILE
111 /* An sqlite execution timing callback. */
112 static void
sqlite_profiler(void * data,const char * sql,sqlite3_uint64 duration)113 sqlite_profiler(void *data, const char *sql, sqlite3_uint64 duration)
114 {
115   /*  sqlite3 *db3 = data; */
116   SVN_DBG(("[%.3f] sql=\"%s\"\n", 1e-9 * duration, sql));
117 }
118 #endif
119 
120 #if defined(SVN_DEBUG) && defined(SQLITE_CONFIG_LOG)
121 static void
sqlite_error_log(void * baton,int err,const char * msg)122 sqlite_error_log(void* baton, int err, const char* msg)
123 {
124   fprintf(SVN_DBG_OUTPUT, "DBG: sqlite[S%d]: %s\n", err, msg);
125 }
126 #endif
127 
128 void
svn_sqlite__dbg_enable_errorlog(void)129 svn_sqlite__dbg_enable_errorlog(void)
130 {
131 #if defined(SVN_DEBUG) && defined(SQLITE_CONFIG_LOG)
132   sqlite3_config(SQLITE_CONFIG_LOG, sqlite_error_log, (void*)NULL /* baton */);
133 #endif
134 }
135 
136 
137 struct svn_sqlite__db_t
138 {
139   sqlite3 *db3;
140   const char * const *statement_strings;
141   int nbr_statements;
142   svn_sqlite__stmt_t **prepared_stmts;
143   apr_pool_t *state_pool;
144 
145 #ifdef SVN_UNICODE_NORMALIZATION_FIXES
146   /* Buffers for SQLite extensoins. */
147   svn_membuf_t sqlext_buf1;
148   svn_membuf_t sqlext_buf2;
149   svn_membuf_t sqlext_buf3;
150 #endif /* SVN_UNICODE_NORMALIZATION_FIXES */
151 };
152 
153 struct svn_sqlite__stmt_t
154 {
155   sqlite3_stmt *s3stmt;
156   svn_sqlite__db_t *db;
157   svn_boolean_t needs_reset;
158 };
159 
160 struct svn_sqlite__context_t
161 {
162   sqlite3_context *context;
163 };
164 
165 struct svn_sqlite__value_t
166 {
167   sqlite3_value *value;
168 };
169 
170 
171 /* Convert SQLite error codes to SVN. Evaluates X multiple times */
172 #define SQLITE_ERROR_CODE(x) ((x) == SQLITE_READONLY            \
173                               ? SVN_ERR_SQLITE_READONLY         \
174                               : ((x) == SQLITE_BUSY             \
175                                  ? SVN_ERR_SQLITE_BUSY          \
176                                  : ((x) == SQLITE_CONSTRAINT    \
177                                     ? SVN_ERR_SQLITE_CONSTRAINT \
178                                     : SVN_ERR_SQLITE_ERROR)))
179 
180 
181 /* SQLITE->SVN quick error wrap, much like SVN_ERR. */
182 #define SQLITE_ERR(x, db) do                                     \
183 {                                                                \
184   int sqlite_err__temp = (x);                                    \
185   if (sqlite_err__temp != SQLITE_OK)                             \
186     return svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
187                              NULL, "sqlite[S%d]: %s",             \
188                              sqlite_err__temp,                    \
189                              sqlite3_errmsg((db)->db3));          \
190 } while (0)
191 
192 #define SQLITE_ERR_CLOSE(x, db, pool) do                          \
193 {                                                                 \
194   int sqlite_err__temp = (x);                                     \
195   if (sqlite_err__temp != SQLITE_OK)                              \
196     {                                                             \
197       const char *sqlite_err__msg                                 \
198         = apr_pstrdup(pool, sqlite3_errmsg((db)->db3));           \
199       return svn_error_compose_create(                            \
200            svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
201                              NULL, "sqlite[S%d]: %s",             \
202                              sqlite_err__temp, sqlite_err__msg),  \
203            svn_sqlite__close(db));                                \
204     }                                                             \
205 } while (0)
206 
207 #define SQLITE_ERR_MSG(x, msg) do                                \
208 {                                                                \
209   int sqlite_err__temp = (x);                                    \
210   if (sqlite_err__temp != SQLITE_OK)                             \
211     return svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
212                              NULL, "sqlite[S%d]: %s",            \
213                              sqlite_err__temp, msg);             \
214 } while (0)
215 
216 
217 /* Time (in milliseconds) to wait for sqlite locks before giving up. */
218 #define BUSY_TIMEOUT 10000
219 
220 
221 /* Convenience wrapper around exec_sql2(). */
222 #define exec_sql(db, sql) exec_sql2((db), (sql), SQLITE_OK)
223 
224 /* Run the statement SQL on DB, ignoring SQLITE_OK and IGNORED_ERR.
225    (Note: the IGNORED_ERR parameter itself is not ignored.) */
226 static svn_error_t *
exec_sql2(svn_sqlite__db_t * db,const char * sql,int ignored_err)227 exec_sql2(svn_sqlite__db_t *db, const char *sql, int ignored_err)
228 {
229   char *err_msg;
230   int sqlite_err = sqlite3_exec(db->db3, sql, NULL, NULL, &err_msg);
231 
232   if (sqlite_err != SQLITE_OK && sqlite_err != ignored_err)
233     {
234       svn_error_t *err = svn_error_createf(SQLITE_ERROR_CODE(sqlite_err), NULL,
235                                            _("sqlite[S%d]: %s,"
236                                              " executing statement '%s'"),
237                                            sqlite_err, err_msg, sql);
238       sqlite3_free(err_msg);
239       return err;
240     }
241 
242   return SVN_NO_ERROR;
243 }
244 
245 
246 static svn_error_t *
prepare_statement(svn_sqlite__stmt_t ** stmt,svn_sqlite__db_t * db,const char * text,apr_pool_t * result_pool)247 prepare_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
248                   const char *text, apr_pool_t *result_pool)
249 {
250   *stmt = apr_palloc(result_pool, sizeof(**stmt));
251   (*stmt)->db = db;
252   (*stmt)->needs_reset = FALSE;
253 
254   SQLITE_ERR(sqlite3_prepare_v2(db->db3, text, -1, &(*stmt)->s3stmt, NULL), db);
255 
256   return SVN_NO_ERROR;
257 }
258 
259 
260 svn_error_t *
svn_sqlite__exec_statements(svn_sqlite__db_t * db,int stmt_idx)261 svn_sqlite__exec_statements(svn_sqlite__db_t *db, int stmt_idx)
262 {
263   SVN_ERR_ASSERT(stmt_idx < db->nbr_statements);
264 
265   return svn_error_trace(exec_sql(db, db->statement_strings[stmt_idx]));
266 }
267 
268 
269 svn_error_t *
svn_sqlite__get_statement(svn_sqlite__stmt_t ** stmt,svn_sqlite__db_t * db,int stmt_idx)270 svn_sqlite__get_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
271                           int stmt_idx)
272 {
273   SVN_ERR_ASSERT(stmt_idx < db->nbr_statements);
274 
275   if (db->prepared_stmts[stmt_idx] == NULL)
276     SVN_ERR(prepare_statement(&db->prepared_stmts[stmt_idx], db,
277                               db->statement_strings[stmt_idx],
278                               db->state_pool));
279 
280   *stmt = db->prepared_stmts[stmt_idx];
281 
282   if ((*stmt)->needs_reset)
283     return svn_error_trace(svn_sqlite__reset(*stmt));
284 
285   return SVN_NO_ERROR;
286 }
287 
288 /* Like svn_sqlite__get_statement but gets an internal statement.
289 
290    All internal statements that use this api are executed with step_done(),
291    so we don't need the fallback reset handling here or in the pool cleanup */
292 static svn_error_t *
get_internal_statement(svn_sqlite__stmt_t ** stmt,svn_sqlite__db_t * db,int stmt_idx)293 get_internal_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
294                        int stmt_idx)
295 {
296   /* The internal statements are stored after the registered statements */
297   int prep_idx = db->nbr_statements + stmt_idx;
298   SVN_ERR_ASSERT(stmt_idx < STMT_INTERNAL_LAST);
299 
300   if (db->prepared_stmts[prep_idx] == NULL)
301     SVN_ERR(prepare_statement(&db->prepared_stmts[prep_idx], db,
302                               internal_statements[stmt_idx],
303                               db->state_pool));
304 
305   *stmt = db->prepared_stmts[prep_idx];
306 
307   return SVN_NO_ERROR;
308 }
309 
310 
311 static svn_error_t *
step_with_expectation(svn_sqlite__stmt_t * stmt,svn_boolean_t expecting_row)312 step_with_expectation(svn_sqlite__stmt_t* stmt,
313                       svn_boolean_t expecting_row)
314 {
315   svn_boolean_t got_row;
316 
317   SVN_ERR(svn_sqlite__step(&got_row, stmt));
318   if ((got_row && !expecting_row)
319       ||
320       (!got_row && expecting_row))
321     return svn_error_create(SVN_ERR_SQLITE_ERROR,
322                             svn_sqlite__reset(stmt),
323                             expecting_row
324                               ? _("sqlite: Expected database row missing")
325                               : _("sqlite: Extra database row found"));
326 
327   return SVN_NO_ERROR;
328 }
329 
330 svn_error_t *
svn_sqlite__step_done(svn_sqlite__stmt_t * stmt)331 svn_sqlite__step_done(svn_sqlite__stmt_t *stmt)
332 {
333   SVN_ERR(step_with_expectation(stmt, FALSE));
334   return svn_error_trace(svn_sqlite__reset(stmt));
335 }
336 
337 svn_error_t *
svn_sqlite__step_row(svn_sqlite__stmt_t * stmt)338 svn_sqlite__step_row(svn_sqlite__stmt_t *stmt)
339 {
340   return svn_error_trace(step_with_expectation(stmt, TRUE));
341 }
342 
343 
344 svn_error_t *
svn_sqlite__step(svn_boolean_t * got_row,svn_sqlite__stmt_t * stmt)345 svn_sqlite__step(svn_boolean_t *got_row, svn_sqlite__stmt_t *stmt)
346 {
347   int sqlite_result = sqlite3_step(stmt->s3stmt);
348 
349   if (sqlite_result != SQLITE_DONE && sqlite_result != SQLITE_ROW)
350     {
351       svn_error_t *err1, *err2;
352 
353       err1 = svn_error_createf(SQLITE_ERROR_CODE(sqlite_result), NULL,
354                                "sqlite[S%d]: %s",
355                                sqlite_result, sqlite3_errmsg(stmt->db->db3));
356       err2 = svn_sqlite__reset(stmt);
357       return svn_error_compose_create(err1, err2);
358     }
359 
360   *got_row = (sqlite_result == SQLITE_ROW);
361   stmt->needs_reset = TRUE;
362 
363   return SVN_NO_ERROR;
364 }
365 
366 svn_error_t *
svn_sqlite__insert(apr_int64_t * row_id,svn_sqlite__stmt_t * stmt)367 svn_sqlite__insert(apr_int64_t *row_id, svn_sqlite__stmt_t *stmt)
368 {
369   svn_boolean_t got_row;
370 
371   SVN_ERR(svn_sqlite__step(&got_row, stmt));
372   if (row_id)
373     *row_id = sqlite3_last_insert_rowid(stmt->db->db3);
374 
375   return svn_error_trace(svn_sqlite__reset(stmt));
376 }
377 
378 svn_error_t *
svn_sqlite__update(int * affected_rows,svn_sqlite__stmt_t * stmt)379 svn_sqlite__update(int *affected_rows, svn_sqlite__stmt_t *stmt)
380 {
381   SVN_ERR(step_with_expectation(stmt, FALSE));
382 
383   if (affected_rows)
384     *affected_rows = sqlite3_changes(stmt->db->db3);
385 
386   return svn_error_trace(svn_sqlite__reset(stmt));
387 }
388 
389 
390 static svn_error_t *
vbindf(svn_sqlite__stmt_t * stmt,const char * fmt,va_list ap)391 vbindf(svn_sqlite__stmt_t *stmt, const char *fmt, va_list ap)
392 {
393   int count;
394 
395   for (count = 1; *fmt; fmt++, count++)
396     {
397       const void *blob;
398       apr_size_t blob_size;
399       const svn_token_map_t *map;
400 
401       switch (*fmt)
402         {
403           case 's':
404             SVN_ERR(svn_sqlite__bind_text(stmt, count,
405                                           va_arg(ap, const char *)));
406             break;
407 
408           case 'd':
409             SVN_ERR(svn_sqlite__bind_int(stmt, count,
410                                          va_arg(ap, int)));
411             break;
412 
413           case 'i':
414           case 'L':
415             SVN_ERR(svn_sqlite__bind_int64(stmt, count,
416                                            va_arg(ap, apr_int64_t)));
417             break;
418 
419           case 'b':
420             blob = va_arg(ap, const void *);
421             blob_size = va_arg(ap, apr_size_t);
422             SVN_ERR(svn_sqlite__bind_blob(stmt, count, blob, blob_size));
423             break;
424 
425           case 'r':
426             SVN_ERR(svn_sqlite__bind_revnum(stmt, count,
427                                             va_arg(ap, svn_revnum_t)));
428             break;
429 
430           case 't':
431             map = va_arg(ap, const svn_token_map_t *);
432             SVN_ERR(svn_sqlite__bind_token(stmt, count, map, va_arg(ap, int)));
433             break;
434 
435           case 'n':
436             /* Skip this column: no binding */
437             break;
438 
439           default:
440             SVN_ERR_MALFUNCTION();
441         }
442     }
443 
444   return SVN_NO_ERROR;
445 }
446 
447 svn_error_t *
svn_sqlite__bindf(svn_sqlite__stmt_t * stmt,const char * fmt,...)448 svn_sqlite__bindf(svn_sqlite__stmt_t *stmt, const char *fmt, ...)
449 {
450   svn_error_t *err;
451   va_list ap;
452 
453   va_start(ap, fmt);
454   err = vbindf(stmt, fmt, ap);
455   va_end(ap);
456   return svn_error_trace(err);
457 }
458 
459 svn_error_t *
svn_sqlite__bind_int(svn_sqlite__stmt_t * stmt,int slot,int val)460 svn_sqlite__bind_int(svn_sqlite__stmt_t *stmt,
461                      int slot,
462                      int val)
463 {
464   SQLITE_ERR(sqlite3_bind_int(stmt->s3stmt, slot, val), stmt->db);
465   return SVN_NO_ERROR;
466 }
467 
468 svn_error_t *
svn_sqlite__bind_int64(svn_sqlite__stmt_t * stmt,int slot,apr_int64_t val)469 svn_sqlite__bind_int64(svn_sqlite__stmt_t *stmt,
470                        int slot,
471                        apr_int64_t val)
472 {
473   SQLITE_ERR(sqlite3_bind_int64(stmt->s3stmt, slot, val), stmt->db);
474   return SVN_NO_ERROR;
475 }
476 
477 svn_error_t *
svn_sqlite__bind_text(svn_sqlite__stmt_t * stmt,int slot,const char * val)478 svn_sqlite__bind_text(svn_sqlite__stmt_t *stmt,
479                       int slot,
480                       const char *val)
481 {
482   SQLITE_ERR(sqlite3_bind_text(stmt->s3stmt, slot, val, -1, SQLITE_TRANSIENT),
483              stmt->db);
484   return SVN_NO_ERROR;
485 }
486 
487 svn_error_t *
svn_sqlite__bind_blob(svn_sqlite__stmt_t * stmt,int slot,const void * val,apr_size_t len)488 svn_sqlite__bind_blob(svn_sqlite__stmt_t *stmt,
489                       int slot,
490                       const void *val,
491                       apr_size_t len)
492 {
493   SQLITE_ERR(sqlite3_bind_blob(stmt->s3stmt, slot, val, (int) len,
494                                SQLITE_TRANSIENT),
495              stmt->db);
496   return SVN_NO_ERROR;
497 }
498 
499 svn_error_t *
svn_sqlite__bind_token(svn_sqlite__stmt_t * stmt,int slot,const svn_token_map_t * map,int value)500 svn_sqlite__bind_token(svn_sqlite__stmt_t *stmt,
501                        int slot,
502                        const svn_token_map_t *map,
503                        int value)
504 {
505   const char *word = svn_token__to_word(map, value);
506 
507   SQLITE_ERR(sqlite3_bind_text(stmt->s3stmt, slot, word, -1, SQLITE_STATIC),
508              stmt->db);
509   return SVN_NO_ERROR;
510 }
511 
512 svn_error_t *
svn_sqlite__bind_revnum(svn_sqlite__stmt_t * stmt,int slot,svn_revnum_t value)513 svn_sqlite__bind_revnum(svn_sqlite__stmt_t *stmt,
514                         int slot,
515                         svn_revnum_t value)
516 {
517   if (SVN_IS_VALID_REVNUM(value))
518     SQLITE_ERR(sqlite3_bind_int64(stmt->s3stmt, slot,
519                                   (sqlite_int64)value), stmt->db);
520   else
521     SQLITE_ERR(sqlite3_bind_null(stmt->s3stmt, slot), stmt->db);
522 
523   return SVN_NO_ERROR;
524 }
525 
526 svn_error_t *
svn_sqlite__bind_properties(svn_sqlite__stmt_t * stmt,int slot,const apr_hash_t * props,apr_pool_t * scratch_pool)527 svn_sqlite__bind_properties(svn_sqlite__stmt_t *stmt,
528                             int slot,
529                             const apr_hash_t *props,
530                             apr_pool_t *scratch_pool)
531 {
532   svn_skel_t *skel;
533   svn_stringbuf_t *properties;
534 
535   if (props == NULL)
536     return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, NULL, 0));
537 
538   SVN_ERR(svn_skel__unparse_proplist(&skel, props, scratch_pool));
539   properties = svn_skel__unparse(skel, scratch_pool);
540   return svn_error_trace(svn_sqlite__bind_blob(stmt,
541                                                slot,
542                                                properties->data,
543                                                properties->len));
544 }
545 
546 svn_error_t *
svn_sqlite__bind_iprops(svn_sqlite__stmt_t * stmt,int slot,const apr_array_header_t * inherited_props,apr_pool_t * scratch_pool)547 svn_sqlite__bind_iprops(svn_sqlite__stmt_t *stmt,
548                         int slot,
549                         const apr_array_header_t *inherited_props,
550                         apr_pool_t *scratch_pool)
551 {
552   svn_skel_t *skel;
553   svn_stringbuf_t *properties;
554 
555   if (inherited_props == NULL)
556     return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, NULL, 0));
557 
558   SVN_ERR(svn_skel__unparse_iproplist(&skel, inherited_props,
559                                       scratch_pool, scratch_pool));
560   properties = svn_skel__unparse(skel, scratch_pool);
561   return svn_error_trace(svn_sqlite__bind_blob(stmt,
562                                                slot,
563                                                properties->data,
564                                                properties->len));
565 }
566 
567 svn_error_t *
svn_sqlite__bind_checksum(svn_sqlite__stmt_t * stmt,int slot,const svn_checksum_t * checksum,apr_pool_t * scratch_pool)568 svn_sqlite__bind_checksum(svn_sqlite__stmt_t *stmt,
569                           int slot,
570                           const svn_checksum_t *checksum,
571                           apr_pool_t *scratch_pool)
572 {
573   const char *csum_str;
574 
575   if (checksum == NULL)
576     csum_str = NULL;
577   else
578     csum_str = svn_checksum_serialize(checksum, scratch_pool, scratch_pool);
579 
580   return svn_error_trace(svn_sqlite__bind_text(stmt, slot, csum_str));
581 }
582 
583 
584 const void *
svn_sqlite__column_blob(svn_sqlite__stmt_t * stmt,int column,apr_size_t * len,apr_pool_t * result_pool)585 svn_sqlite__column_blob(svn_sqlite__stmt_t *stmt, int column,
586                         apr_size_t *len, apr_pool_t *result_pool)
587 {
588   const void *val = sqlite3_column_blob(stmt->s3stmt, column);
589   *len = sqlite3_column_bytes(stmt->s3stmt, column);
590 
591   if (result_pool && val != NULL)
592     val = apr_pmemdup(result_pool, val, *len);
593 
594   return val;
595 }
596 
597 const char *
svn_sqlite__column_text(svn_sqlite__stmt_t * stmt,int column,apr_pool_t * result_pool)598 svn_sqlite__column_text(svn_sqlite__stmt_t *stmt, int column,
599                         apr_pool_t *result_pool)
600 {
601   /* cast from 'unsigned char' to regular 'char'  */
602   const char *result = (const char *)sqlite3_column_text(stmt->s3stmt, column);
603 
604   if (result_pool && result != NULL)
605     result = apr_pstrdup(result_pool, result);
606 
607   return result;
608 }
609 
610 svn_revnum_t
svn_sqlite__column_revnum(svn_sqlite__stmt_t * stmt,int column)611 svn_sqlite__column_revnum(svn_sqlite__stmt_t *stmt, int column)
612 {
613   if (svn_sqlite__column_is_null(stmt, column))
614     return SVN_INVALID_REVNUM;
615   return (svn_revnum_t) sqlite3_column_int64(stmt->s3stmt, column);
616 }
617 
618 svn_boolean_t
svn_sqlite__column_boolean(svn_sqlite__stmt_t * stmt,int column)619 svn_sqlite__column_boolean(svn_sqlite__stmt_t *stmt, int column)
620 {
621   return sqlite3_column_int64(stmt->s3stmt, column) != 0;
622 }
623 
624 int
svn_sqlite__column_int(svn_sqlite__stmt_t * stmt,int column)625 svn_sqlite__column_int(svn_sqlite__stmt_t *stmt, int column)
626 {
627   return sqlite3_column_int(stmt->s3stmt, column);
628 }
629 
630 apr_int64_t
svn_sqlite__column_int64(svn_sqlite__stmt_t * stmt,int column)631 svn_sqlite__column_int64(svn_sqlite__stmt_t *stmt, int column)
632 {
633   return sqlite3_column_int64(stmt->s3stmt, column);
634 }
635 
636 int
svn_sqlite__column_token(svn_sqlite__stmt_t * stmt,int column,const svn_token_map_t * map)637 svn_sqlite__column_token(svn_sqlite__stmt_t *stmt,
638                          int column,
639                          const svn_token_map_t *map)
640 {
641   /* cast from 'unsigned char' to regular 'char'  */
642   const char *word = (const char *)sqlite3_column_text(stmt->s3stmt, column);
643 
644   return svn_token__from_word_strict(map, word);
645 }
646 
647 int
svn_sqlite__column_token_null(svn_sqlite__stmt_t * stmt,int column,const svn_token_map_t * map,int null_val)648 svn_sqlite__column_token_null(svn_sqlite__stmt_t *stmt,
649                               int column,
650                               const svn_token_map_t *map,
651                               int null_val)
652 {
653   /* cast from 'unsigned char' to regular 'char'  */
654   const char *word = (const char *)sqlite3_column_text(stmt->s3stmt, column);
655 
656   if (!word)
657     return null_val;
658 
659   return svn_token__from_word_strict(map, word);
660 }
661 
662 svn_error_t *
svn_sqlite__column_properties(apr_hash_t ** props,svn_sqlite__stmt_t * stmt,int column,apr_pool_t * result_pool,apr_pool_t * scratch_pool)663 svn_sqlite__column_properties(apr_hash_t **props,
664                               svn_sqlite__stmt_t *stmt,
665                               int column,
666                               apr_pool_t *result_pool,
667                               apr_pool_t *scratch_pool)
668 {
669   apr_size_t len;
670   const void *val;
671 
672   /* svn_skel__parse_proplist copies everything needed to result_pool */
673   val = svn_sqlite__column_blob(stmt, column, &len, NULL);
674   if (val == NULL)
675     {
676       *props = NULL;
677       return SVN_NO_ERROR;
678     }
679 
680   SVN_ERR(svn_skel__parse_proplist(props,
681                                    svn_skel__parse(val, len, scratch_pool),
682                                    result_pool));
683 
684   return SVN_NO_ERROR;
685 }
686 
687 svn_error_t *
svn_sqlite__column_iprops(apr_array_header_t ** iprops,svn_sqlite__stmt_t * stmt,int column,apr_pool_t * result_pool,apr_pool_t * scratch_pool)688 svn_sqlite__column_iprops(apr_array_header_t **iprops,
689                           svn_sqlite__stmt_t *stmt,
690                           int column,
691                           apr_pool_t *result_pool,
692                           apr_pool_t *scratch_pool)
693 {
694   apr_size_t len;
695   const void *val;
696 
697   /* svn_skel__parse_iprops copies everything needed to result_pool */
698   val = svn_sqlite__column_blob(stmt, column, &len, NULL);
699   if (val == NULL)
700     {
701       *iprops = NULL;
702       return SVN_NO_ERROR;
703     }
704 
705   SVN_ERR(svn_skel__parse_iprops(iprops,
706                                  svn_skel__parse(val, len, scratch_pool),
707                                  result_pool));
708 
709   return SVN_NO_ERROR;
710 }
711 
712 svn_error_t *
svn_sqlite__column_checksum(const svn_checksum_t ** checksum,svn_sqlite__stmt_t * stmt,int column,apr_pool_t * result_pool)713 svn_sqlite__column_checksum(const svn_checksum_t **checksum,
714                             svn_sqlite__stmt_t *stmt, int column,
715                             apr_pool_t *result_pool)
716 {
717   const char *digest = svn_sqlite__column_text(stmt, column, NULL);
718 
719   if (digest == NULL)
720     *checksum = NULL;
721   else
722     SVN_ERR(svn_checksum_deserialize(checksum, digest,
723                                      result_pool, result_pool));
724 
725   return SVN_NO_ERROR;
726 }
727 
728 svn_boolean_t
svn_sqlite__column_is_null(svn_sqlite__stmt_t * stmt,int column)729 svn_sqlite__column_is_null(svn_sqlite__stmt_t *stmt, int column)
730 {
731   return sqlite3_column_type(stmt->s3stmt, column) == SQLITE_NULL;
732 }
733 
734 int
svn_sqlite__column_bytes(svn_sqlite__stmt_t * stmt,int column)735 svn_sqlite__column_bytes(svn_sqlite__stmt_t *stmt, int column)
736 {
737   return sqlite3_column_bytes(stmt->s3stmt, column);
738 }
739 
740 svn_error_t *
svn_sqlite__finalize(svn_sqlite__stmt_t * stmt)741 svn_sqlite__finalize(svn_sqlite__stmt_t *stmt)
742 {
743   SQLITE_ERR(sqlite3_finalize(stmt->s3stmt), stmt->db);
744   return SVN_NO_ERROR;
745 }
746 
747 svn_error_t *
svn_sqlite__reset(svn_sqlite__stmt_t * stmt)748 svn_sqlite__reset(svn_sqlite__stmt_t *stmt)
749 {
750   /* No need to reset again after a first attempt */
751   stmt->needs_reset = FALSE;
752 
753   /* Clear bindings first, as there are no documented reasons
754      why this would ever fail, but keeping variable bindings
755      when reset is not what we expect. */
756   SQLITE_ERR(sqlite3_clear_bindings(stmt->s3stmt), stmt->db);
757 
758   /* Reset last, as this *will* fail if the statement failed since
759      the last time it was reset, while reporting just the same failure.
760      (In this case the statement is also properly reset).
761 
762      See the sqlite3_reset() documentation for more details. */
763   SQLITE_ERR(sqlite3_reset(stmt->s3stmt), stmt->db);
764   return SVN_NO_ERROR;
765 }
766 
767 
768 svn_error_t *
svn_sqlite__read_schema_version(int * version,svn_sqlite__db_t * db,apr_pool_t * scratch_pool)769 svn_sqlite__read_schema_version(int *version,
770                                 svn_sqlite__db_t *db,
771                                 apr_pool_t *scratch_pool)
772 {
773   svn_sqlite__stmt_t *stmt;
774 
775   SVN_ERR(prepare_statement(&stmt, db, "PRAGMA user_version;", scratch_pool));
776   SVN_ERR(svn_sqlite__step_row(stmt));
777 
778   *version = svn_sqlite__column_int(stmt, 0);
779 
780   return svn_error_trace(svn_sqlite__finalize(stmt));
781 }
782 
783 
784 static volatile svn_atomic_t sqlite_init_state = 0;
785 
786 /* If possible, verify that SQLite was compiled in a thread-safe
787    manner. */
788 /* Don't call this function directly!  Use svn_atomic__init_once(). */
789 static svn_error_t *
init_sqlite(void * baton,apr_pool_t * pool)790 init_sqlite(void *baton, apr_pool_t *pool)
791 {
792   if (sqlite3_libversion_number() < SVN_SQLITE_MIN_VERSION_NUMBER)
793     {
794       return svn_error_createf(
795                     SVN_ERR_SQLITE_ERROR, NULL,
796                     _("SQLite compiled for %s, but running with %s"),
797                     SVN_SQLITE_MIN_VERSION, sqlite3_libversion());
798     }
799 
800 #if APR_HAS_THREADS
801 
802   /* SQLite 3.5 allows verification of its thread-safety at runtime.
803      Older versions are simply expected to have been configured with
804      --enable-threadsafe, which compiles with -DSQLITE_THREADSAFE=1
805      (or -DTHREADSAFE, for older versions). */
806   if (! sqlite3_threadsafe())
807     return svn_error_create(SVN_ERR_SQLITE_ERROR, NULL,
808                             _("SQLite is required to be compiled and run in "
809                               "thread-safe mode"));
810 
811   /* If SQLite has been already initialized, sqlite3_config() returns
812      SQLITE_MISUSE. */
813   {
814     int err = sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
815     if (err != SQLITE_OK && err != SQLITE_MISUSE)
816       return svn_error_createf(SQLITE_ERROR_CODE(err), NULL,
817                                _("Could not configure SQLite [S%d]"), err);
818   }
819   SQLITE_ERR_MSG(sqlite3_initialize(), _("Could not initialize SQLite"));
820 
821 #endif /* APR_HAS_THRADS */
822 
823   return SVN_NO_ERROR;
824 }
825 
826 static svn_error_t *
internal_open(svn_sqlite__db_t * db,const char * path,svn_sqlite__mode_t mode,apr_int32_t timeout,apr_pool_t * scratch_pool)827 internal_open(svn_sqlite__db_t *db, const char *path, svn_sqlite__mode_t mode,
828               apr_int32_t timeout, apr_pool_t *scratch_pool)
829 {
830   {
831     int flags;
832 
833     if (mode == svn_sqlite__mode_readonly)
834       flags = SQLITE_OPEN_READONLY;
835     else if (mode == svn_sqlite__mode_readwrite)
836       flags = SQLITE_OPEN_READWRITE;
837     else if (mode == svn_sqlite__mode_rwcreate)
838       flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
839     else
840       SVN_ERR_MALFUNCTION();
841 
842     /* Turn off SQLite's mutexes. All svn objects are single-threaded,
843        so we can already guarantee that our use of the SQLite handle
844        will be serialized properly.
845 
846        Note: in 3.6.x, we've already config'd SQLite into MULTITHREAD mode,
847        so this is probably redundant, but if we are running in a process where
848        somebody initialized SQLite before us it is needed anyway.  */
849     flags |= SQLITE_OPEN_NOMUTEX;
850 
851 #if !defined(WIN32) && !defined(SVN_SQLITE_INLINE)
852     if (mode == svn_sqlite__mode_rwcreate)
853       {
854         svn_node_kind_t kind;
855 
856         /* Create the file before SQLite to avoid any permissions
857            problems with an SQLite build that uses the default
858            SQLITE_DEFAULT_FILE_PERMISSIONS of 644 modified by umask.
859            We simply want umask permissions. */
860         SVN_ERR(svn_io_check_path(path, &kind, scratch_pool));
861         if (kind == svn_node_none)
862           {
863             /* Another thread may have created the file, that's OK. */
864             svn_error_t *err = svn_io_file_create_empty(path, scratch_pool);
865             if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
866               return svn_error_trace(err);
867             svn_error_clear(err);
868           }
869       }
870 #endif
871 
872     /* Open the database. Note that a handle is returned, even when an error
873        occurs (except for out-of-memory); thus, we can safely use it to
874        extract an error message and construct an svn_error_t.  SQLite always
875        requires sqlite3_close() after sqlite3_open_v2() while Subversion
876        typically does not require close() after an open() that returns an
877        error.  So we must ensure we close the handle if this function, or
878        the caller svn_sqlite__open, returns an error to the application. */
879     {
880       const char *vFs = NULL;
881 
882 #if defined(WIN32) && SQLITE_VERSION_AT_LEAST(3, 8, 1)
883       if (strlen(path) > 248)
884         {
885           WCHAR *win_path;
886           vFs = "win32-longpath"; /* Enable long paths in sqlite */
887 
888           /* Long paths must be absolute */
889           if (!svn_dirent_is_absolute(path))
890             SVN_ERR(svn_dirent_get_absolute(&path, path, scratch_pool));
891 
892           /* Convert the path to a properly canonicalized \\?\C:\long\path */
893           SVN_ERR(svn_io__utf8_to_unicode_longpath(&win_path, path,
894                                                    scratch_pool));
895 
896           /* And convert it back to UTF-8 because there is no
897               sqlite3_open16_v2() yet */
898           SVN_ERR(svn_utf__win32_utf16_to_utf8(&path, win_path, NULL,
899                                                scratch_pool));
900         }
901 #endif
902 
903       /* ### SQLITE_CANTOPEN */
904       SQLITE_ERR_CLOSE(sqlite3_open_v2(path, &db->db3, flags, vFs),
905                        db, scratch_pool);
906     }
907   }
908 
909   if (timeout <= 0)
910     timeout = BUSY_TIMEOUT;
911 
912   /* Retry until timeout when database is busy. */
913   SQLITE_ERR_CLOSE(sqlite3_busy_timeout(db->db3, timeout),
914                    db, scratch_pool);
915 
916   return SVN_NO_ERROR;
917 }
918 
919 
920 /* APR cleanup function used to close the database when its pool is destroyed.
921    DATA should be the svn_sqlite__db_t handle for the database. */
922 static apr_status_t
close_apr(void * data)923 close_apr(void *data)
924 {
925   svn_sqlite__db_t *db = data;
926   svn_error_t *err = SVN_NO_ERROR;
927   apr_status_t result;
928   int i;
929 
930   /* Check to see if we've already closed this database. */
931   if (db->db3 == NULL)
932     return APR_SUCCESS;
933 
934   /* Finalize any prepared statements. */
935   if (db->prepared_stmts)
936     {
937       for (i = 0; i < db->nbr_statements + STMT_INTERNAL_LAST; i++)
938         {
939           if (db->prepared_stmts[i])
940             {
941               if (i < db->nbr_statements
942                   && db->prepared_stmts[i]->needs_reset)
943                 {
944 #ifdef SVN_DEBUG
945                   const char *stmt_text = db->statement_strings[i];
946                   SVN_UNUSED(stmt_text);
947 
948                   SVN_ERR_MALFUNCTION_NO_RETURN();
949 #else
950                   err = svn_error_compose_create(err,
951                             svn_sqlite__reset(db->prepared_stmts[i]));
952 #endif
953                 }
954               err = svn_error_compose_create(
955                         svn_sqlite__finalize(db->prepared_stmts[i]), err);
956             }
957         }
958     }
959 
960   result = sqlite3_close(db->db3);
961 
962   /* If there's a pre-existing error, return it. */
963   if (err)
964     {
965       result = err->apr_err;
966       svn_error_clear(err);
967       return result;
968     }
969 
970   if (result != SQLITE_OK)
971     return SQLITE_ERROR_CODE(result); /* ### lossy */
972 
973   db->db3 = NULL;
974 
975   return APR_SUCCESS;
976 }
977 
978 #ifdef SVN_UNICODE_NORMALIZATION_FIXES
979 /* Unicode normalizing collation for WC paths */
980 static int
collate_ucs_nfd(void * baton,int len1,const void * key1,int len2,const void * key2)981 collate_ucs_nfd(void *baton,
982                 int len1, const void *key1,
983                 int len2, const void *key2)
984 {
985   svn_sqlite__db_t *db = baton;
986   int result;
987 
988   if (svn_utf__normcmp(key1, len1, key2, len2,
989                        &db->sqlext_buf1, &db->sqlext_buf2, &result))
990     {
991       /* There is really nothing we can do here if an error occurs
992          during Unicode normalizetion, and attempting to recover could
993          result in the wc.db index being corrupted. Presumably this
994          can only happen if the index already contains invalid UTF-8
995          strings, which should never happen in any case ... */
996       SVN_ERR_MALFUNCTION_NO_RETURN();
997     }
998 
999   return result;
1000 }
1001 
1002 static void
glob_like_ucs_nfd_common(sqlite3_context * context,int argc,sqlite3_value ** argv,svn_boolean_t sql_like)1003 glob_like_ucs_nfd_common(sqlite3_context *context,
1004                          int argc, sqlite3_value **argv,
1005                          svn_boolean_t sql_like)
1006 {
1007   svn_sqlite__db_t *const db = sqlite3_user_data(context);
1008 
1009   const char *const pattern = (void*)sqlite3_value_text(argv[0]);
1010   const apr_size_t pattern_len = sqlite3_value_bytes(argv[0]);
1011   const char *const string = (void*)sqlite3_value_text(argv[1]);
1012   const apr_size_t string_len = sqlite3_value_bytes(argv[1]);
1013 
1014   const char *escape = NULL;
1015   apr_size_t escape_len = 0;
1016 
1017   svn_boolean_t match;
1018   svn_error_t *err;
1019 
1020   if (pattern_len > SQLITE_MAX_LIKE_PATTERN_LENGTH)
1021     {
1022       sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
1023       return;
1024     }
1025 
1026   if (argc == 3 && sql_like)
1027     {
1028       escape = (void*)sqlite3_value_text(argv[2]);
1029       escape_len = sqlite3_value_bytes(argv[2]);
1030     }
1031 
1032   if (pattern && string)
1033     {
1034       err = svn_utf__glob(pattern, pattern_len, string, string_len,
1035                           escape, escape_len, sql_like,
1036                           &db->sqlext_buf1, &db->sqlext_buf2, &db->sqlext_buf3,
1037                           &match);
1038 
1039       if (err)
1040         {
1041           const char *errmsg;
1042           svn_membuf__ensure(&db->sqlext_buf1, 512);
1043           errmsg = svn_err_best_message(err,
1044                                         db->sqlext_buf1.data,
1045                                         db->sqlext_buf1.size - 1);
1046           svn_error_clear(err);
1047           sqlite3_result_error(context, errmsg, -1);
1048           return;
1049         }
1050 
1051       sqlite3_result_int(context, match);
1052     }
1053 }
1054 
1055 /* Unicode normalizing implementation of GLOB */
1056 static void
glob_ucs_nfd(sqlite3_context * context,int argc,sqlite3_value ** argv)1057 glob_ucs_nfd(sqlite3_context *context,
1058              int argc, sqlite3_value **argv)
1059 {
1060   glob_like_ucs_nfd_common(context, argc, argv, FALSE);
1061 }
1062 
1063 /* Unicode normalizing implementation of LIKE */
1064 static void
like_ucs_nfd(sqlite3_context * context,int argc,sqlite3_value ** argv)1065 like_ucs_nfd(sqlite3_context *context,
1066              int argc, sqlite3_value **argv)
1067 {
1068   glob_like_ucs_nfd_common(context, argc, argv, TRUE);
1069 }
1070 #endif /* SVN_UNICODE_NORMALIZATION_FIXES */
1071 
1072 svn_error_t *
svn_sqlite__open(svn_sqlite__db_t ** db,const char * path,svn_sqlite__mode_t mode,const char * const statements[],int unused1,const char * const * unused2,apr_int32_t timeout,apr_pool_t * result_pool,apr_pool_t * scratch_pool)1073 svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
1074                  svn_sqlite__mode_t mode, const char * const statements[],
1075                  int unused1, const char * const *unused2,
1076                  apr_int32_t timeout,
1077                  apr_pool_t *result_pool, apr_pool_t *scratch_pool)
1078 {
1079   SVN_ERR(svn_atomic__init_once(&sqlite_init_state,
1080                                 init_sqlite, NULL, scratch_pool));
1081 
1082   *db = apr_pcalloc(result_pool, sizeof(**db));
1083 
1084   SVN_ERR(internal_open(*db, path, mode, timeout, scratch_pool));
1085 
1086 #if SQLITE_VERSION_NUMBER >= 3008000 && SQLITE_VERSION_NUMBER < 3009000
1087   /* disable SQLITE_ENABLE_STAT3/4 from 3.8.1 - 3.8.3 (but not 3.8.3.1+)
1088    * to prevent using it when it's buggy.
1089    * See: https://www.sqlite.org/src/info/4c86b126f2 */
1090   if (sqlite3_libversion_number() > 3008000 &&
1091       sqlite3_libversion_number() < 3008004 &&
1092       strcmp(sqlite3_sourceid(),"2014-02-11")<0)
1093     {
1094       sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, (*db)->db3, 0x800);
1095     }
1096 #endif
1097 
1098 #ifdef SVN_UNICODE_NORMALIZATION_FIXES
1099   /* Create extension buffers with space for 200 UCS-4 characters. */
1100   svn_membuf__create(&(*db)->sqlext_buf1, 800, result_pool);
1101   svn_membuf__create(&(*db)->sqlext_buf2, 800, result_pool);
1102   svn_membuf__create(&(*db)->sqlext_buf3, 800, result_pool);
1103 
1104   /* Register collation and LIKE and GLOB operator replacements. */
1105   SQLITE_ERR_CLOSE(sqlite3_create_collation((*db)->db3,
1106                                             "svn-ucs-nfd", SQLITE_UTF8,
1107                                             *db, collate_ucs_nfd),
1108                    db, scratch_pool);
1109   /* ### Is it really necessary to override these functions?
1110          I would assume the default implementation to be collation agnostic?
1111          And otherwise our implementation should be...
1112 
1113          The default implementation is in some cases index backed, while our
1114          implementation can't be. With an index based on the collation it could
1115          be. */
1116   SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "glob", 2,
1117                                            SQLITE_UTF8 | SQLITE_DETERMINISTIC,
1118                                            *db, glob_ucs_nfd, NULL, NULL),
1119                    db, scratch_pool);
1120   SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "like", 2,
1121                                            SQLITE_UTF8 | SQLITE_DETERMINISTIC,
1122                                            *db, like_ucs_nfd, NULL, NULL),
1123                    db, scratch_pool);
1124   SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "like", 3,
1125                                            SQLITE_UTF8 | SQLITE_DETERMINISTIC,
1126                                            *db, like_ucs_nfd, NULL, NULL),
1127                    db, scratch_pool);
1128 #endif /* SVN_UNICODE_NORMALIZATION_FIXES */
1129 
1130 #ifdef SQLITE3_DEBUG
1131   sqlite3_trace((*db)->db3, sqlite_tracer, (*db)->db3);
1132 #endif
1133 #ifdef SQLITE3_PROFILE
1134   sqlite3_profile((*db)->db3, sqlite_profiler, (*db)->db3);
1135 #endif
1136 
1137   SVN_SQLITE__ERR_CLOSE(exec_sql(*db,
1138               /* The default behavior of the LIKE operator is to ignore case
1139                  for ASCII characters. Hence, by default 'a' LIKE 'A' is true.
1140                  The case_sensitive_like pragma installs a new application-
1141                  defined LIKE function that is either case sensitive or
1142                  insensitive depending on the value of the case_sensitive_like
1143                  pragma. */
1144               "PRAGMA case_sensitive_like=1;"
1145               /* Disable synchronization to disable the explicit disk flushes
1146                  that make Sqlite up to 50 times slower; especially on small
1147                  transactions.
1148 
1149                  This removes some stability guarantees on specific hardware
1150                  and power failures, but still guarantees atomic commits on
1151                  application crashes. With our dependency on external data
1152                  like pristine files (Wc) and revision files (repository),
1153                  we can't keep up these additional guarantees anyway.
1154 
1155                  ### Maybe switch to NORMAL(1) when we use larger transaction
1156                      scopes */
1157               "PRAGMA synchronous=OFF;"
1158               /* Enable recursive triggers so that a user trigger will fire
1159                  in the deletion phase of an INSERT OR REPLACE statement.
1160                  Requires SQLite >= 3.6.18  */
1161               "PRAGMA recursive_triggers=ON;"
1162               /* Enforce current Sqlite default behavior. Some distributions
1163                  might change the Sqlite defaults without realizing how this
1164                  affects application(read: Subversion) performance/behavior. */
1165               "PRAGMA foreign_keys=OFF;"      /* SQLITE_DEFAULT_FOREIGN_KEYS*/
1166               "PRAGMA locking_mode = NORMAL;" /* SQLITE_DEFAULT_LOCKING_MODE */
1167               /* Testing shows TRUNCATE is faster than DELETE on Windows. */
1168               "PRAGMA journal_mode = TRUNCATE;"
1169               ),
1170                 *db);
1171 
1172 #if defined(SVN_DEBUG)
1173   /* When running in debug mode, enable the checking of foreign key
1174      constraints.  This has possible performance implications, so we don't
1175      bother to do it for production...for now. */
1176   SVN_SQLITE__ERR_CLOSE(exec_sql(*db, "PRAGMA foreign_keys=ON;"),
1177                         *db);
1178 #endif
1179 
1180 #ifdef SVN_SQLITE_REVERSE_UNORDERED_SELECTS
1181   /* When enabled, this PRAGMA causes SELECT statements without an ORDER BY
1182      clause to emit their results in the reverse order of what they normally
1183      would.  This can help detecting invalid assumptions about the result
1184      order.*/
1185   SVN_SQLITE__ERR_CLOSE(exec_sql(*db, "PRAGMA reverse_unordered_selects=ON;"),
1186                         *db);
1187 #endif
1188 
1189   /* Store temporary tables in RAM instead of in temporary files, but don't
1190      fail on this if this option is disabled in the sqlite compilation by
1191      setting SQLITE_TEMP_STORE to 0 (always to disk) */
1192   svn_error_clear(exec_sql(*db, "PRAGMA temp_store = MEMORY;"));
1193 
1194   /* Store the provided statements. */
1195   if (statements)
1196     {
1197       (*db)->statement_strings = statements;
1198       (*db)->nbr_statements = 0;
1199       while (*statements != NULL)
1200         {
1201           statements++;
1202           (*db)->nbr_statements++;
1203         }
1204 
1205       (*db)->prepared_stmts = apr_pcalloc(
1206                                   result_pool,
1207                                   ((*db)->nbr_statements + STMT_INTERNAL_LAST)
1208                                                 * sizeof(svn_sqlite__stmt_t *));
1209     }
1210   else
1211     {
1212       (*db)->nbr_statements = 0;
1213       (*db)->prepared_stmts = apr_pcalloc(result_pool,
1214                                           (0 + STMT_INTERNAL_LAST)
1215                                                 * sizeof(svn_sqlite__stmt_t *));
1216     }
1217 
1218   (*db)->state_pool = result_pool;
1219   apr_pool_cleanup_register(result_pool, *db, close_apr, apr_pool_cleanup_null);
1220 
1221   return SVN_NO_ERROR;
1222 }
1223 
1224 svn_error_t *
svn_sqlite__close(svn_sqlite__db_t * db)1225 svn_sqlite__close(svn_sqlite__db_t *db)
1226 {
1227   apr_status_t result = apr_pool_cleanup_run(db->state_pool, db, close_apr);
1228 
1229   if (result == APR_SUCCESS)
1230     return SVN_NO_ERROR;
1231 
1232   return svn_error_wrap_apr(result, NULL);
1233 }
1234 
1235 static svn_error_t *
reset_all_statements(svn_sqlite__db_t * db,svn_error_t * error_to_wrap)1236 reset_all_statements(svn_sqlite__db_t *db,
1237                      svn_error_t *error_to_wrap)
1238 {
1239   int i;
1240   svn_error_t *err;
1241 
1242   /* ### Should we reorder the errors in this specific case
1243      ### to avoid returning the normal error as top level error? */
1244 
1245   err = svn_error_compose_create(error_to_wrap,
1246                    svn_error_create(SVN_ERR_SQLITE_RESETTING_FOR_ROLLBACK,
1247                                     NULL, NULL));
1248 
1249   for (i = 0; i < db->nbr_statements; i++)
1250     if (db->prepared_stmts[i] && db->prepared_stmts[i]->needs_reset)
1251       err = svn_error_compose_create(err,
1252                                 svn_sqlite__reset(db->prepared_stmts[i]));
1253 
1254   return err;
1255 }
1256 
1257 static svn_error_t *
rollback_transaction(svn_sqlite__db_t * db,svn_error_t * error_to_wrap)1258 rollback_transaction(svn_sqlite__db_t *db,
1259                      svn_error_t *error_to_wrap)
1260 {
1261   svn_sqlite__stmt_t *stmt;
1262   svn_error_t *err;
1263 
1264   err = get_internal_statement(&stmt, db, STMT_INTERNAL_ROLLBACK_TRANSACTION);
1265   if (!err)
1266     {
1267       err = svn_error_trace(svn_sqlite__step_done(stmt));
1268 
1269       if (err && err->apr_err == SVN_ERR_SQLITE_BUSY)
1270         {
1271           /* ### Houston, we have a problem!
1272 
1273              We are trying to rollback but we can't because some
1274              statements are still busy. This leaves the database
1275              unusable for future transactions as the current transaction
1276              is still open.
1277 
1278              As we are returning the actual error as the most relevant
1279              error in the chain, our caller might assume that it can
1280              retry/compensate on this error (e.g. SVN_WC_LOCKED), while
1281              in fact the SQLite database is unusable until the statements
1282              started within this transaction are reset and the transaction
1283              aborted.
1284 
1285              We try to compensate by resetting all prepared but unreset
1286              statements; but we leave the busy error in the chain anyway to
1287              help diagnosing the original error and help in finding where
1288              a reset statement is missing. */
1289           err = svn_error_trace(reset_all_statements(db, err));
1290           err = svn_error_compose_create(
1291                       svn_error_trace(svn_sqlite__step_done(stmt)),
1292                       err);
1293         }
1294     }
1295 
1296   if (err)
1297     {
1298       /* Rollback failed, use a specific error code. */
1299       err = svn_error_create(SVN_ERR_SQLITE_ROLLBACK_FAILED, err, NULL);
1300     }
1301 
1302   return svn_error_compose_create(error_to_wrap, err);
1303 }
1304 
1305 svn_error_t *
svn_sqlite__begin_transaction(svn_sqlite__db_t * db)1306 svn_sqlite__begin_transaction(svn_sqlite__db_t *db)
1307 {
1308   svn_sqlite__stmt_t *stmt;
1309 
1310   SVN_ERR(get_internal_statement(&stmt, db,
1311                                  STMT_INTERNAL_BEGIN_TRANSACTION));
1312   SVN_ERR(svn_sqlite__step_done(stmt));
1313   return SVN_NO_ERROR;
1314 }
1315 
1316 svn_error_t *
svn_sqlite__begin_immediate_transaction(svn_sqlite__db_t * db)1317 svn_sqlite__begin_immediate_transaction(svn_sqlite__db_t *db)
1318 {
1319   svn_sqlite__stmt_t *stmt;
1320 
1321   SVN_ERR(get_internal_statement(&stmt, db,
1322                                  STMT_INTERNAL_BEGIN_IMMEDIATE_TRANSACTION));
1323   SVN_ERR(svn_sqlite__step_done(stmt));
1324   return SVN_NO_ERROR;
1325 }
1326 
1327 svn_error_t *
svn_sqlite__begin_savepoint(svn_sqlite__db_t * db)1328 svn_sqlite__begin_savepoint(svn_sqlite__db_t *db)
1329 {
1330   svn_sqlite__stmt_t *stmt;
1331 
1332   SVN_ERR(get_internal_statement(&stmt, db,
1333                                  STMT_INTERNAL_SAVEPOINT_SVN));
1334   SVN_ERR(svn_sqlite__step_done(stmt));
1335   return SVN_NO_ERROR;
1336 }
1337 
1338 svn_error_t *
svn_sqlite__finish_transaction(svn_sqlite__db_t * db,svn_error_t * err)1339 svn_sqlite__finish_transaction(svn_sqlite__db_t *db,
1340                                svn_error_t *err)
1341 {
1342   svn_sqlite__stmt_t *stmt;
1343 
1344   /* Commit or rollback the sqlite transaction. */
1345   if (err)
1346     {
1347       return svn_error_trace(rollback_transaction(db, err));
1348     }
1349   else
1350     {
1351       err = get_internal_statement(&stmt, db,
1352                                    STMT_INTERNAL_COMMIT_TRANSACTION);
1353       if (!err)
1354         err = svn_error_trace(svn_sqlite__step_done(stmt));
1355 
1356       /* Need to rollback if the commit fails as well, because otherwise the
1357          db connection will be left in an unusable state.
1358 
1359          One important case to keep in mind is trying to COMMIT with concurrent
1360          readers. In case the commit fails, because someone else is holding a
1361          shared lock, sqlite keeps the transaction, and *also* keeps the file
1362          locks on the database. While the first part only prevents from using
1363          this connection, the second part prevents everyone else from accessing
1364          the database while the connection is open.
1365 
1366          See https://www.sqlite.org/lang_transaction.html
1367 
1368          COMMIT might also result in an SQLITE_BUSY return code if an another
1369          thread or process has a shared lock on the database that prevented
1370          the database from being updated. When COMMIT fails in this way, the
1371          transaction remains active and the COMMIT can be retried later after
1372          the reader has had a chance to clear. */
1373       if (err)
1374         return svn_error_trace(rollback_transaction(db, err));
1375     }
1376 
1377   return SVN_NO_ERROR;
1378 }
1379 
1380 svn_error_t *
svn_sqlite__finish_savepoint(svn_sqlite__db_t * db,svn_error_t * err)1381 svn_sqlite__finish_savepoint(svn_sqlite__db_t *db,
1382                              svn_error_t *err)
1383 {
1384   svn_sqlite__stmt_t *stmt;
1385 
1386   if (err)
1387     {
1388       svn_error_t *err2;
1389 
1390       err2 = get_internal_statement(&stmt, db,
1391                                     STMT_INTERNAL_ROLLBACK_TO_SAVEPOINT_SVN);
1392 
1393       if (!err2)
1394         {
1395           err2 = svn_error_trace(svn_sqlite__step_done(stmt));
1396 
1397           if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
1398             {
1399               /* Ok, we have a major problem. Some statement is still open,
1400                  which makes it impossible to release this savepoint.
1401 
1402                  ### See huge comment in rollback_transaction() for
1403                      further details */
1404 
1405               err2 = svn_error_trace(reset_all_statements(db, err2));
1406               err2 = svn_error_compose_create(
1407                           svn_error_trace(svn_sqlite__step_done(stmt)),
1408                           err2);
1409             }
1410         }
1411 
1412       err = svn_error_compose_create(err, err2);
1413       err2 = get_internal_statement(&stmt, db,
1414                                     STMT_INTERNAL_RELEASE_SAVEPOINT_SVN);
1415 
1416       if (!err2)
1417         err2 = svn_error_trace(svn_sqlite__step_done(stmt));
1418 
1419       return svn_error_compose_create(err, err2);
1420     }
1421 
1422   SVN_ERR(get_internal_statement(&stmt, db,
1423                                  STMT_INTERNAL_RELEASE_SAVEPOINT_SVN));
1424 
1425   /* ### Releasing a savepoint can fail and leave the db connection
1426          unusable; see svn_sqlite__finish_transaction(). */
1427   return svn_error_trace(svn_sqlite__step_done(stmt));
1428 }
1429 
1430 svn_error_t *
svn_sqlite__with_transaction(svn_sqlite__db_t * db,svn_sqlite__transaction_callback_t cb_func,void * cb_baton,apr_pool_t * scratch_pool)1431 svn_sqlite__with_transaction(svn_sqlite__db_t *db,
1432                              svn_sqlite__transaction_callback_t cb_func,
1433                              void *cb_baton,
1434                              apr_pool_t *scratch_pool /* NULL allowed */)
1435 {
1436   SVN_SQLITE__WITH_TXN(cb_func(cb_baton, db, scratch_pool), db);
1437   return SVN_NO_ERROR;
1438 }
1439 
1440 svn_error_t *
svn_sqlite__with_immediate_transaction(svn_sqlite__db_t * db,svn_sqlite__transaction_callback_t cb_func,void * cb_baton,apr_pool_t * scratch_pool)1441 svn_sqlite__with_immediate_transaction(
1442   svn_sqlite__db_t *db,
1443   svn_sqlite__transaction_callback_t cb_func,
1444   void *cb_baton,
1445   apr_pool_t *scratch_pool /* NULL allowed */)
1446 {
1447   SVN_SQLITE__WITH_IMMEDIATE_TXN(cb_func(cb_baton, db, scratch_pool), db);
1448   return SVN_NO_ERROR;
1449 }
1450 
1451 svn_error_t *
svn_sqlite__with_lock(svn_sqlite__db_t * db,svn_sqlite__transaction_callback_t cb_func,void * cb_baton,apr_pool_t * scratch_pool)1452 svn_sqlite__with_lock(svn_sqlite__db_t *db,
1453                       svn_sqlite__transaction_callback_t cb_func,
1454                       void *cb_baton,
1455                       apr_pool_t *scratch_pool /* NULL allowed */)
1456 {
1457   SVN_SQLITE__WITH_LOCK(cb_func(cb_baton, db, scratch_pool), db);
1458   return SVN_NO_ERROR;
1459 }
1460 
1461 svn_error_t *
svn_sqlite__hotcopy(const char * src_path,const char * dst_path,apr_pool_t * scratch_pool)1462 svn_sqlite__hotcopy(const char *src_path,
1463                     const char *dst_path,
1464                     apr_pool_t *scratch_pool)
1465 {
1466   svn_sqlite__db_t *src_db;
1467 
1468   SVN_ERR(svn_sqlite__open(&src_db, src_path, svn_sqlite__mode_readonly,
1469                            NULL, 0, NULL, 0,
1470                            scratch_pool, scratch_pool));
1471 
1472   {
1473     svn_sqlite__db_t *dst_db;
1474     sqlite3_backup *backup;
1475     int rc1, rc2;
1476 
1477     SVN_ERR(svn_sqlite__open(&dst_db, dst_path, svn_sqlite__mode_rwcreate,
1478                              NULL, 0, NULL, 0, scratch_pool, scratch_pool));
1479     backup = sqlite3_backup_init(dst_db->db3, "main", src_db->db3, "main");
1480     if (!backup)
1481       return svn_error_createf(SVN_ERR_SQLITE_ERROR, NULL,
1482                                _("SQLite hotcopy failed for %s"), src_path);
1483     do
1484       {
1485         /* Pages are usually 1024 byte (SQLite docs). On my laptop
1486            copying gets faster as the number of pages is increased up
1487            to about 64, beyond that speed levels off.  Lets put the
1488            number of pages an order of magnitude higher, this is still
1489            likely to be a fraction of large databases. */
1490         rc1 = sqlite3_backup_step(backup, 1024);
1491 
1492         /* Should we sleep on SQLITE_OK?  That would make copying a
1493            large database take much longer.  When we do sleep how,
1494            long should we sleep?  Should the sleep get longer if we
1495            keep getting BUSY/LOCKED?  I have no real reason for
1496            choosing 25. */
1497         if (rc1 == SQLITE_BUSY || rc1 == SQLITE_LOCKED)
1498           sqlite3_sleep(25);
1499       }
1500     while (rc1 == SQLITE_OK || rc1 == SQLITE_BUSY || rc1 == SQLITE_LOCKED);
1501     rc2 = sqlite3_backup_finish(backup);
1502     if (rc1 != SQLITE_DONE)
1503       SQLITE_ERR(rc1, dst_db);
1504     SQLITE_ERR(rc2, dst_db);
1505     SVN_ERR(svn_sqlite__close(dst_db));
1506   }
1507 
1508   SVN_ERR(svn_sqlite__close(src_db));
1509 
1510   SVN_ERR(svn_io_copy_perms(src_path, dst_path, scratch_pool));
1511 
1512   return SVN_NO_ERROR;
1513 }
1514 
1515 struct function_wrapper_baton_t
1516 {
1517   svn_sqlite__func_t func;
1518   void *baton;
1519 };
1520 
1521 static void
wrapped_func(sqlite3_context * context,int argc,sqlite3_value * values[])1522 wrapped_func(sqlite3_context *context,
1523              int argc,
1524              sqlite3_value *values[])
1525 {
1526   struct function_wrapper_baton_t *fwb = sqlite3_user_data(context);
1527   svn_sqlite__context_t sctx;
1528   svn_error_t *err;
1529   void *void_values = values;
1530 
1531   sctx.context = context;
1532 
1533   err = fwb->func(&sctx, argc, void_values, fwb->baton);
1534 
1535   if (err)
1536     {
1537       char buf[256];
1538       sqlite3_result_error(context,
1539                            svn_err_best_message(err, buf, sizeof(buf)),
1540                            -1);
1541       svn_error_clear(err);
1542     }
1543 }
1544 
1545 
1546 svn_error_t *
svn_sqlite__create_scalar_function(svn_sqlite__db_t * db,const char * func_name,int argc,svn_boolean_t deterministic,svn_sqlite__func_t func,void * baton)1547 svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
1548                                    const char *func_name,
1549                                    int argc,
1550                                    svn_boolean_t deterministic,
1551                                    svn_sqlite__func_t func,
1552                                    void *baton)
1553 {
1554   int eTextRep;
1555   struct function_wrapper_baton_t *fwb = apr_pcalloc(db->state_pool,
1556                                                      sizeof(*fwb));
1557 
1558   fwb->func = func;
1559   fwb->baton = baton;
1560 
1561   eTextRep = SQLITE_ANY;
1562   if (deterministic)
1563     eTextRep |= SQLITE_DETERMINISTIC;
1564 
1565   SQLITE_ERR(sqlite3_create_function(db->db3, func_name, argc, eTextRep,
1566                                      fwb, wrapped_func, NULL, NULL),
1567              db);
1568 
1569   return SVN_NO_ERROR;
1570 }
1571 
1572 int
svn_sqlite__value_type(svn_sqlite__value_t * val)1573 svn_sqlite__value_type(svn_sqlite__value_t *val)
1574 {
1575   void *v = val;
1576   return sqlite3_value_type(v);
1577 }
1578 
1579 const char *
svn_sqlite__value_text(svn_sqlite__value_t * val)1580 svn_sqlite__value_text(svn_sqlite__value_t *val)
1581 {
1582   void *v = val;
1583   return (const char *) sqlite3_value_text(v);
1584 }
1585 
1586 void
svn_sqlite__result_null(svn_sqlite__context_t * sctx)1587 svn_sqlite__result_null(svn_sqlite__context_t *sctx)
1588 {
1589   sqlite3_result_null(sctx->context);
1590 }
1591 
1592 void
svn_sqlite__result_int64(svn_sqlite__context_t * sctx,apr_int64_t val)1593 svn_sqlite__result_int64(svn_sqlite__context_t *sctx, apr_int64_t val)
1594 {
1595   sqlite3_result_int64(sctx->context, val);
1596 }
1597 
1598 void
svn_sqlite__result_error(svn_sqlite__context_t * sctx,const char * msg,int num)1599 svn_sqlite__result_error(svn_sqlite__context_t *sctx, const char *msg, int num)
1600 {
1601   sqlite3_result_error(sctx->context, msg, num);
1602 }
1603