Windows fixes

Always set the filesize when opening for writes. Otherwise
can't use backups from mdb_copy.
robust
Howard Chu 11 years ago
parent f3573a7383
commit bda6a60ad4
  1. 17
      libraries/liblmdb/mdb.c

@ -3635,7 +3635,7 @@ mdb_env_create(MDB_env **env)
} }
static int ESECT static int ESECT
mdb_env_map(MDB_env *env, void *addr, int newsize) mdb_env_map(MDB_env *env, void *addr)
{ {
MDB_page *p; MDB_page *p;
unsigned int flags = env->me_flags; unsigned int flags = env->me_flags;
@ -3646,6 +3646,7 @@ mdb_env_map(MDB_env *env, void *addr, int newsize)
size_t msize; size_t msize;
if (flags & MDB_RDONLY) { if (flags & MDB_RDONLY) {
/* Don't set explicit map size, use whatever exists */
msize = 0; msize = 0;
sizelo = 0; sizelo = 0;
sizehi = 0; sizehi = 0;
@ -3653,17 +3654,17 @@ mdb_env_map(MDB_env *env, void *addr, int newsize)
msize = env->me_mapsize; msize = env->me_mapsize;
sizelo = msize & 0xffffffff; sizelo = msize & 0xffffffff;
sizehi = msize >> 16 >> 16; /* only needed on Win64 */ sizehi = msize >> 16 >> 16; /* only needed on Win64 */
}
/* Windows won't create mappings for zero length files. /* Windows won't create mappings for zero length files.
* Just allocate the maxsize right now. * and won't map more than the file size.
*/ * Just set the maxsize right now.
if (newsize) { */
if (SetFilePointer(env->me_fd, sizelo, &sizehi, 0) != (DWORD)sizelo if (SetFilePointer(env->me_fd, sizelo, &sizehi, 0) != (DWORD)sizelo
|| !SetEndOfFile(env->me_fd) || !SetEndOfFile(env->me_fd)
|| SetFilePointer(env->me_fd, 0, NULL, 0) != 0) || SetFilePointer(env->me_fd, 0, NULL, 0) != 0)
return ErrCode(); return ErrCode();
} }
mh = CreateFileMapping(env->me_fd, NULL, flags & MDB_WRITEMAP ? mh = CreateFileMapping(env->me_fd, NULL, flags & MDB_WRITEMAP ?
PAGE_READWRITE : PAGE_READONLY, PAGE_READWRITE : PAGE_READONLY,
sizehi, sizelo, NULL); sizehi, sizelo, NULL);
@ -3747,7 +3748,7 @@ mdb_env_set_mapsize(MDB_env *env, size_t size)
munmap(env->me_map, env->me_mapsize); munmap(env->me_map, env->me_mapsize);
env->me_mapsize = size; env->me_mapsize = size;
old = (env->me_flags & MDB_FIXEDMAP) ? env->me_map : NULL; old = (env->me_flags & MDB_FIXEDMAP) ? env->me_map : NULL;
rc = mdb_env_map(env, old, 1); rc = mdb_env_map(env, old);
if (rc) if (rc)
return rc; return rc;
if (change) if (change)
@ -3837,7 +3838,7 @@ mdb_env_open2(MDB_env *env)
env->me_flags |= MDB_RESIZING; env->me_flags |= MDB_RESIZING;
} }
rc = mdb_env_map(env, meta.mm_address, newenv || env->me_mapsize != meta.mm_mapsize); rc = mdb_env_map(env, meta.mm_address);
if (rc) if (rc)
return rc; return rc;

Loading…
Cancel
Save