1251881Speter/* 2251881Speter * context.c: routines for managing a working copy context 3251881Speter * 4251881Speter * ==================================================================== 5251881Speter * Licensed to the Apache Software Foundation (ASF) under one 6251881Speter * or more contributor license agreements. See the NOTICE file 7251881Speter * distributed with this work for additional information 8251881Speter * regarding copyright ownership. The ASF licenses this file 9251881Speter * to you under the Apache License, Version 2.0 (the 10251881Speter * "License"); you may not use this file except in compliance 11251881Speter * with the License. You may obtain a copy of the License at 12251881Speter * 13251881Speter * http://www.apache.org/licenses/LICENSE-2.0 14251881Speter * 15251881Speter * Unless required by applicable law or agreed to in writing, 16251881Speter * software distributed under the License is distributed on an 17251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18251881Speter * KIND, either express or implied. See the License for the 19251881Speter * specific language governing permissions and limitations 20251881Speter * under the License. 21251881Speter * ==================================================================== 22251881Speter */ 23251881Speter 24251881Speter#include <apr_pools.h> 25251881Speter 26251881Speter#include "svn_types.h" 27251881Speter#include "svn_pools.h" 28251881Speter#include "svn_dirent_uri.h" 29251881Speter#include "svn_path.h" 30251881Speter 31251881Speter#include "wc.h" 32251881Speter#include "wc_db.h" 33251881Speter 34251881Speter#include "svn_private_config.h" 35251881Speter 36251881Speter 37251881Speter 38251881Speter/* APR cleanup function used to explicitly close any of our dependent 39251881Speter data structures before we disappear ourselves. */ 40251881Speterstatic apr_status_t 41251881Speterclose_ctx_apr(void *data) 42251881Speter{ 43251881Speter svn_wc_context_t *ctx = data; 44251881Speter 45251881Speter if (ctx->close_db_on_destroy) 46251881Speter { 47251881Speter svn_error_t *err = svn_wc__db_close(ctx->db); 48251881Speter if (err) 49251881Speter { 50251881Speter int result = err->apr_err; 51251881Speter svn_error_clear(err); 52251881Speter return result; 53251881Speter } 54251881Speter } 55251881Speter 56251881Speter return APR_SUCCESS; 57251881Speter} 58251881Speter 59251881Speter 60251881Spetersvn_error_t * 61251881Spetersvn_wc_context_create(svn_wc_context_t **wc_ctx, 62251881Speter const svn_config_t *config, 63251881Speter apr_pool_t *result_pool, 64251881Speter apr_pool_t *scratch_pool) 65251881Speter{ 66251881Speter svn_wc_context_t *ctx = apr_pcalloc(result_pool, sizeof(*ctx)); 67251881Speter 68251881Speter /* Create the state_pool, and open up a wc_db in it. 69251881Speter * Since config contains a private mutable member but C doesn't support 70251881Speter * we need to make it writable */ 71251881Speter ctx->state_pool = result_pool; 72251881Speter SVN_ERR(svn_wc__db_open(&ctx->db, (svn_config_t *)config, 73251881Speter FALSE, TRUE, ctx->state_pool, scratch_pool)); 74251881Speter ctx->close_db_on_destroy = TRUE; 75251881Speter 76251881Speter apr_pool_cleanup_register(result_pool, ctx, close_ctx_apr, 77251881Speter apr_pool_cleanup_null); 78251881Speter 79251881Speter *wc_ctx = ctx; 80251881Speter 81251881Speter return SVN_NO_ERROR; 82251881Speter} 83251881Speter 84251881Speter 85251881Spetersvn_error_t * 86251881Spetersvn_wc__context_create_with_db(svn_wc_context_t **wc_ctx, 87251881Speter svn_config_t *config, 88251881Speter svn_wc__db_t *db, 89251881Speter apr_pool_t *result_pool) 90251881Speter{ 91251881Speter svn_wc_context_t *ctx = apr_pcalloc(result_pool, sizeof(*ctx)); 92251881Speter 93251881Speter /* Create the state pool. We don't put the wc_db in it, because it's 94251881Speter already open in a separate pool somewhere. We also won't close the 95251881Speter wc_db when we destroy the context, since it's not ours to close. */ 96251881Speter ctx->state_pool = result_pool; 97251881Speter ctx->db = db; 98251881Speter ctx->close_db_on_destroy = FALSE; 99251881Speter 100251881Speter apr_pool_cleanup_register(result_pool, ctx, close_ctx_apr, 101251881Speter apr_pool_cleanup_null); 102251881Speter 103251881Speter *wc_ctx = ctx; 104251881Speter 105251881Speter return SVN_NO_ERROR; 106251881Speter} 107251881Speter 108251881Speter 109251881Spetersvn_error_t * 110251881Spetersvn_wc_context_destroy(svn_wc_context_t *wc_ctx) 111251881Speter{ 112251881Speter /* We added a cleanup when creating; just run it now to close the context. */ 113251881Speter apr_pool_cleanup_run(wc_ctx->state_pool, wc_ctx, close_ctx_apr); 114251881Speter 115251881Speter return SVN_NO_ERROR; 116251881Speter} 117