|
|
@ -1584,6 +1584,8 @@ struct MDB_env { |
|
|
|
#define MDB_ENV_TXKEY 0x10000000U |
|
|
|
#define MDB_ENV_TXKEY 0x10000000U |
|
|
|
/** fdatasync is unreliable */ |
|
|
|
/** fdatasync is unreliable */ |
|
|
|
#define MDB_FSYNCONLY 0x08000000U |
|
|
|
#define MDB_FSYNCONLY 0x08000000U |
|
|
|
|
|
|
|
/** using a raw block device */ |
|
|
|
|
|
|
|
#define MDB_RAWPART 0x04000000U |
|
|
|
uint32_t me_flags; /**< @ref mdb_env */ |
|
|
|
uint32_t me_flags; /**< @ref mdb_env */ |
|
|
|
unsigned int me_psize; /**< DB page size, inited from me_os_psize */ |
|
|
|
unsigned int me_psize; /**< DB page size, inited from me_os_psize */ |
|
|
|
unsigned int me_os_psize; /**< OS page size, from #GET_PAGESIZE */ |
|
|
|
unsigned int me_os_psize; /**< OS page size, from #GET_PAGESIZE */ |
|
|
@ -4456,6 +4458,8 @@ mdb_env_read_header(MDB_env *env, int prev, MDB_meta *meta) |
|
|
|
p = (MDB_page *)&pbuf; |
|
|
|
p = (MDB_page *)&pbuf; |
|
|
|
|
|
|
|
|
|
|
|
if (!F_ISSET(p->mp_flags, P_META)) { |
|
|
|
if (!F_ISSET(p->mp_flags, P_META)) { |
|
|
|
|
|
|
|
if (env->me_flags & MDB_RAWPART) |
|
|
|
|
|
|
|
return ENOENT; |
|
|
|
DPRINTF(("page %"Yu" not a meta page", p->mp_pgno)); |
|
|
|
DPRINTF(("page %"Yu" not a meta page", p->mp_pgno)); |
|
|
|
return MDB_INVALID; |
|
|
|
return MDB_INVALID; |
|
|
|
} |
|
|
|
} |
|
|
@ -4812,7 +4816,7 @@ mdb_env_map(MDB_env *env, void *addr) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (flags & MDB_WRITEMAP) { |
|
|
|
if (flags & MDB_WRITEMAP) { |
|
|
|
prot |= PROT_WRITE; |
|
|
|
prot |= PROT_WRITE; |
|
|
|
if (ftruncate(env->me_fd, env->me_mapsize) < 0) |
|
|
|
if (!(flags & MDB_RAWPART) && ftruncate(env->me_fd, env->me_mapsize) < 0) |
|
|
|
return ErrCode(); |
|
|
|
return ErrCode(); |
|
|
|
} |
|
|
|
} |
|
|
|
env->me_map = mmap(addr, env->me_mapsize, prot, mmap_flags, |
|
|
|
env->me_map = mmap(addr, env->me_mapsize, prot, mmap_flags, |
|
|
@ -5945,6 +5949,17 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode |
|
|
|
goto leave; |
|
|
|
goto leave; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef _WIN32 |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
struct stat st; |
|
|
|
|
|
|
|
rc = stat(path, &st); |
|
|
|
|
|
|
|
if (rc) |
|
|
|
|
|
|
|
return ErrCode(); |
|
|
|
|
|
|
|
flags &= ~MDB_RAWPART; |
|
|
|
|
|
|
|
if (S_ISBLK(st.st_mode)) |
|
|
|
|
|
|
|
flags |= MDB_RAWPART | MDB_NOSUBDIR; |
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
flags |= MDB_ENV_ACTIVE; /* tell mdb_env_close_active() to clean up */ |
|
|
|
flags |= MDB_ENV_ACTIVE; /* tell mdb_env_close_active() to clean up */ |
|
|
|
|
|
|
|
|
|
|
|