int svn_fs_bdb__open_checksum_reps_table(DB **checksum_reps_p, DB_ENV *env, svn_boolean_t create) { const u_int32_t open_flags = (create ? (DB_CREATE | DB_EXCL) : 0); DB *checksum_reps; int error; BDB_ERR(svn_fs_bdb__check_version()); BDB_ERR(db_create(&checksum_reps, env, 0)); error = (checksum_reps->open)(SVN_BDB_OPEN_PARAMS(checksum_reps, NULL), "checksum-reps", 0, DB_BTREE, open_flags, 0666); /* Create the checksum-reps table if it doesn't exist. */ if (error == ENOENT && (! create)) { BDB_ERR(checksum_reps->close(checksum_reps, 0)); return svn_fs_bdb__open_checksum_reps_table(checksum_reps_p, env, TRUE); } /* Create the initial `next-key' table entry. */ if (create) { DBT key, value; BDB_ERR(checksum_reps->put(checksum_reps, 0, svn_fs_base__str_to_dbt(&key, NEXT_KEY_KEY), svn_fs_base__str_to_dbt(&value, "0"), 0)); } BDB_ERR(error); *checksum_reps_p = checksum_reps; return 0; }
/* Depending on CREATE, create or open the environment and databases for filesystem FS in PATH. Use POOL for temporary allocations. */ static svn_error_t * open_databases(svn_fs_t *fs, svn_boolean_t create, int format, const char *path, apr_pool_t *pool) { base_fs_data_t *bfd; SVN_ERR(svn_fs__check_fs(fs, FALSE)); bfd = apr_pcalloc(fs->pool, sizeof(*bfd)); fs->vtable = &fs_vtable; fs->fsap_data = bfd; /* Initialize the fs's path. */ fs->path = apr_pstrdup(fs->pool, path); if (create) SVN_ERR(bdb_write_config(fs)); /* Create the Berkeley DB environment. */ { svn_error_t *err = svn_fs_bdb__open(&(bfd->bdb), path, SVN_BDB_STANDARD_ENV_FLAGS, 0666, fs->pool); if (err) { if (create) return svn_error_createf (err->apr_err, err, _("Berkeley DB error for filesystem '%s'" " while creating environment:\n"), fs->path); else return svn_error_createf (err->apr_err, err, _("Berkeley DB error for filesystem '%s'" " while opening environment:\n"), fs->path); } } /* We must register the FS cleanup function *after* opening the environment, so that it's run before the environment baton cleanup. */ apr_pool_cleanup_register(fs->pool, fs, cleanup_fs_apr, apr_pool_cleanup_null); /* Create the databases in the environment. */ SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'nodes' table") : N_("opening 'nodes' table")), svn_fs_bdb__open_nodes_table(&bfd->nodes, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'revisions' table") : N_("opening 'revisions' table")), svn_fs_bdb__open_revisions_table(&bfd->revisions, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'transactions' table") : N_("opening 'transactions' table")), svn_fs_bdb__open_transactions_table(&bfd->transactions, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'copies' table") : N_("opening 'copies' table")), svn_fs_bdb__open_copies_table(&bfd->copies, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'changes' table") : N_("opening 'changes' table")), svn_fs_bdb__open_changes_table(&bfd->changes, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'representations' table") : N_("opening 'representations' table")), svn_fs_bdb__open_reps_table(&bfd->representations, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'strings' table") : N_("opening 'strings' table")), svn_fs_bdb__open_strings_table(&bfd->strings, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'uuids' table") : N_("opening 'uuids' table")), svn_fs_bdb__open_uuids_table(&bfd->uuids, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'locks' table") : N_("opening 'locks' table")), svn_fs_bdb__open_locks_table(&bfd->locks, bfd->bdb->env, create))); SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'lock-tokens' table") : N_("opening 'lock-tokens' table")), svn_fs_bdb__open_lock_tokens_table(&bfd->lock_tokens, bfd->bdb->env, create))); if (format >= SVN_FS_BASE__MIN_NODE_ORIGINS_FORMAT) { SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'node-origins' table") : N_("opening 'node-origins' table")), svn_fs_bdb__open_node_origins_table(&bfd->node_origins, bfd->bdb->env, create))); } if (format >= SVN_FS_BASE__MIN_MISCELLANY_FORMAT) { SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'miscellaneous' table") : N_("opening 'miscellaneous' table")), svn_fs_bdb__open_miscellaneous_table(&bfd->miscellaneous, bfd->bdb->env, create))); } if (format >= SVN_FS_BASE__MIN_REP_SHARING_FORMAT) { SVN_ERR(BDB_WRAP(fs, (create ? N_("creating 'checksum-reps' table") : N_("opening 'checksum-reps' table")), svn_fs_bdb__open_checksum_reps_table(&bfd->checksum_reps, bfd->bdb->env, create))); } return SVN_NO_ERROR; }