svn_error_t * svn_wc__db_util_open_db(svn_sqlite__db_t **sdb, const char *dir_abspath, const char *sdb_fname, svn_sqlite__mode_t smode, svn_boolean_t exclusive, const char *const *my_statements, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *sdb_abspath = svn_wc__adm_child(dir_abspath, sdb_fname, scratch_pool); if (smode != svn_sqlite__mode_rwcreate) { svn_node_kind_t kind; /* A file stat is much cheaper then a failed database open handled by SQLite. */ SVN_ERR(svn_io_check_path(sdb_abspath, &kind, scratch_pool)); if (kind != svn_node_file) return svn_error_createf(APR_ENOENT, NULL, _("Working copy database '%s' not found"), svn_dirent_local_style(sdb_abspath, scratch_pool)); } #ifndef WIN32 else { apr_file_t *f; /* A standard SQLite build creates a DB with mode 644 ^ !umask which means the file doesn't have group/world write access even when umask allows it. By ensuring the file exists before SQLite gets involved we give it the permissions allowed by umask. */ SVN_ERR(svn_io_file_open(&f, sdb_abspath, (APR_READ | APR_WRITE | APR_CREATE), APR_OS_DEFAULT, scratch_pool)); SVN_ERR(svn_io_file_close(f, scratch_pool)); } #endif SVN_ERR(svn_sqlite__open(sdb, sdb_abspath, smode, my_statements ? my_statements : statements, 0, NULL, result_pool, scratch_pool)); if (exclusive) SVN_ERR(svn_sqlite__exec_statements(*sdb, STMT_PRAGMA_LOCKING_MODE)); SVN_ERR(svn_sqlite__create_scalar_function(*sdb, "relpath_depth", 1, relpath_depth_sqlite, NULL)); return SVN_NO_ERROR; }
svn_error_t * svn_wc__db_util_open_db(svn_sqlite__db_t **sdb, const char *dir_abspath, const char *sdb_fname, svn_sqlite__mode_t smode, svn_boolean_t exclusive, apr_int32_t timeout, const char *const *my_statements, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *sdb_abspath = svn_wc__adm_child(dir_abspath, sdb_fname, scratch_pool); if (smode != svn_sqlite__mode_rwcreate) { svn_node_kind_t kind; /* A file stat is much cheaper than a failed database open handled by SQLite. */ SVN_ERR(svn_io_check_path(sdb_abspath, &kind, scratch_pool)); if (kind != svn_node_file) return svn_error_createf(APR_ENOENT, NULL, _("Working copy database '%s' not found"), svn_dirent_local_style(sdb_abspath, scratch_pool)); } SVN_ERR(svn_sqlite__open(sdb, sdb_abspath, smode, my_statements ? my_statements : statements, 0, NULL, timeout, result_pool, scratch_pool)); if (exclusive) SVN_ERR(svn_sqlite__exec_statements(*sdb, STMT_PRAGMA_LOCKING_MODE)); SVN_ERR(svn_sqlite__create_scalar_function(*sdb, "relpath_depth", 1, TRUE /* deterministic */, relpath_depth_sqlite, NULL)); return SVN_NO_ERROR; }
svn_error_t * svn_wc__db_util_open_db(svn_sqlite__db_t **sdb, const char *dir_abspath, const char *sdb_fname, svn_sqlite__mode_t smode, const char *const *my_statements, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *sdb_abspath = svn_wc__adm_child(dir_abspath, sdb_fname, scratch_pool); if (smode != svn_sqlite__mode_rwcreate) { svn_node_kind_t kind; /* A file stat is much cheaper then a failed database open handled by SQLite. */ SVN_ERR(svn_io_check_path(sdb_abspath, &kind, scratch_pool)); if (kind != svn_node_file) return svn_error_createf(APR_ENOENT, NULL, _("Working copy database '%s' not found"), svn_dirent_local_style(sdb_abspath, scratch_pool)); } SVN_ERR(svn_sqlite__open(sdb, sdb_abspath, smode, my_statements ? my_statements : statements, 0, NULL, result_pool, scratch_pool)); SVN_ERR(svn_sqlite__create_scalar_function(*sdb, "relpath_depth", 1, relpath_depth, NULL)); return SVN_NO_ERROR; }