#include "db_config.h"
#include "db_int.h"
#include "dbinc/db_page.h"
#include "dbinc/fop.h"
#include "dbinc/log.h"
#include "dbinc/mp.h"
#include "dbinc/txn.h"
#include "dbinc/db_am.h"
int
__fop_create(dbenv, txn, fhpp, name, appname, mode, flags)
DB_ENV *dbenv;
DB_TXN *txn;
DB_FH **fhpp;
const char *name;
APPNAME appname;
int mode;
u_int32_t flags;
{
DB_FH *fhp;
DB_LSN lsn;
DBT data;
int ret;
char *real_name;
real_name = NULL;
fhp = NULL;
if ((ret =
__db_appname(dbenv, appname, name, 0, NULL, &real_name)) != 0)
return (ret);
if (mode == 0)
mode = __db_omode(OWNER_RW);
if (DBENV_LOGGING(dbenv)
#if !defined(DEBUG_WOP)
&& txn != NULL
#endif
) {
DB_INIT_DBT(data, name, strlen(name) + 1);
if ((ret = __fop_create_log(dbenv, txn, &lsn,
flags | DB_FLUSH,
&data, (u_int32_t)appname, (u_int32_t)mode)) != 0)
goto err;
}
DB_ENV_TEST_RECOVERY(dbenv, DB_TEST_POSTLOG, ret, name);
if (fhpp == NULL)
fhpp = &fhp;
ret = __os_open(
dbenv, real_name, 0, DB_OSO_CREATE | DB_OSO_EXCL, mode, fhpp);
err:
DB_TEST_RECOVERY_LABEL
if (fhpp == &fhp && fhp != NULL)
(void)__os_closehandle(dbenv, fhp);
if (real_name != NULL)
__os_free(dbenv, real_name);
return (ret);
}
int
__fop_remove(dbenv, txn, fileid, name, appname, flags)
DB_ENV *dbenv;
DB_TXN *txn;
u_int8_t *fileid;
const char *name;
APPNAME appname;
u_int32_t flags;
{
DB_LSN lsn;
DBT fdbt, ndbt;
char *real_name;
int ret;
real_name = NULL;
if ((ret =
__db_appname(dbenv, appname, name, 0, NULL, &real_name)) != 0)
goto err;
if (!IS_REAL_TXN(txn)) {
if (fileid != NULL && (ret = __memp_nameop(
dbenv, fileid, NULL, real_name, NULL, 0)) != 0)
goto err;
} else {
if (DBENV_LOGGING(dbenv)
#if !defined(DEBUG_WOP)
&& txn != NULL
#endif
) {
memset(&fdbt, 0, sizeof(ndbt));
fdbt.data = fileid;
fdbt.size = fileid == NULL ? 0 : DB_FILE_ID_LEN;
DB_INIT_DBT(ndbt, name, strlen(name) + 1);
if ((ret = __fop_remove_log(dbenv, txn, &lsn,
flags, &ndbt, &fdbt, (u_int32_t)appname)) != 0)
goto err;
}
ret = __txn_remevent(dbenv, txn, real_name, fileid, 0);
}
err: if (real_name != NULL)
__os_free(dbenv, real_name);
return (ret);
}
int
__fop_write(dbenv,
txn, name, appname, fhp, pgsize, pageno, off, buf, size, istmp, flags)
DB_ENV *dbenv;
DB_TXN *txn;
const char *name;
APPNAME appname;
DB_FH *fhp;
u_int32_t pgsize;
db_pgno_t pageno;
u_int32_t off;
void *buf;
u_int32_t size, istmp, flags;
{
DB_LSN lsn;
DBT data, namedbt;
size_t nbytes;
int local_open, ret, t_ret;
char *real_name;
DB_ASSERT(dbenv, istmp != 0);
ret = local_open = 0;
real_name = NULL;
if ((ret =
__db_appname(dbenv, appname, name, 0, NULL, &real_name)) != 0)
return (ret);
if (DBENV_LOGGING(dbenv)
#if !defined(DEBUG_WOP)
&& txn != NULL
#endif
) {
memset(&data, 0, sizeof(data));
data.data = buf;
data.size = size;
DB_INIT_DBT(namedbt, name, strlen(name) + 1);
if ((ret = __fop_write_log(dbenv, txn,
&lsn, flags, &namedbt, (u_int32_t)appname,
pgsize, pageno, off, &data, istmp)) != 0)
goto err;
}
if (fhp == NULL) {
if ((ret = __os_open(dbenv, real_name, 0, 0, 0, &fhp)) != 0)
goto err;
local_open = 1;
}
if ((ret = __os_seek(dbenv, fhp, pageno, pgsize, off)) != 0)
goto err;
if ((ret = __os_write(dbenv, fhp, buf, size, &nbytes)) != 0)
goto err;
err: if (local_open &&
(t_ret = __os_closehandle(dbenv, fhp)) != 0 && ret == 0)
ret = t_ret;
if (real_name != NULL)
__os_free(dbenv, real_name);
return (ret);
}
int
__fop_rename(dbenv, txn, oldname, newname, fid, appname, with_undo, flags)
DB_ENV *dbenv;
DB_TXN *txn;
const char *oldname;
const char *newname;
u_int8_t *fid;
APPNAME appname;
int with_undo;
u_int32_t flags;
{
DB_LSN lsn;
DBT fiddbt, new, old;
int ret;
char *n, *o;
o = n = NULL;
if ((ret = __db_appname(dbenv, appname, oldname, 0, NULL, &o)) != 0)
goto err;
if ((ret = __db_appname(dbenv, appname, newname, 0, NULL, &n)) != 0)
goto err;
if (DBENV_LOGGING(dbenv)
#if !defined(DEBUG_WOP)
&& txn != NULL
#endif
) {
DB_INIT_DBT(old, oldname, strlen(oldname) + 1);
DB_INIT_DBT(new, newname, strlen(newname) + 1);
memset(&fiddbt, 0, sizeof(fiddbt));
fiddbt.data = fid;
fiddbt.size = DB_FILE_ID_LEN;
if (with_undo)
ret = __fop_rename_log(dbenv,
txn, &lsn, flags | DB_FLUSH,
&old, &new, &fiddbt, (u_int32_t)appname);
else
ret = __fop_rename_noundo_log(dbenv,
txn, &lsn, flags | DB_FLUSH,
&old, &new, &fiddbt, (u_int32_t)appname);
if (ret != 0)
goto err;
}
ret = __memp_nameop(dbenv, fid, newname, o, n, 0);
err: if (o != NULL)
__os_free(dbenv, o);
if (n != NULL)
__os_free(dbenv, n);
return (ret);
}