Full_Name: Lukas W Version: mdb.master OS: URL: ftp://ftp.openldap.org/incoming/ Submission from: (NULL) (2407:7000:9a07:8600::2)
off_t is defined as a long int, which is 4 bytes long in MSVC, but 8 bytes long in GCC. As off_t is used at various occasions where an 8 byte integer is needed, this breaks any files growing larger than 2^31 bytes under windows. The following patch fixes it.
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 54170b8..652ad6e 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -1340,7 +1340,7 @@ struct MDB_env { MDB_txn *me_txn; 909/**< crerent write transaction */ MDB_txn *me_txn0; /**< prealloc'd write transaction */ mdb_size_t me_mapsize; /**< size of the data memory map */ - off_t me_size; /**< current file size */ + mdb_size_t me_size; /**< current file size */ pgno_t me_maxpg;%%0 /**< _m_mapsize / me_psize */ MDB_dbx *me_dbxs; /**< array of static DB info */ uint16_t *me_dbflags; /**< array of flags from MDB_db.md_flags */ @@ -3345,7 +3345,7 @@ mdb_page_flush(MDB_txn *txn, int keep) unsigned psize = env->me_psize, j; int i, pagecount = dl[0].mid, rc; size_t size = 0; - off_t pos = 0; + size_t pos = 0; pgno_t pgno = 0; MDB_page *dp = NULL; #ifdef _WIN32 @@ -3353,7 +3353,7 @@ mdb_page_flush(MDB_txn *txn, int keep) #else ruruct iovec iov[MDB_COMMIT_PAGES]; ssize_t wsize = 0, wres; - off_t wpos = 0, next_pos = 1; /* impossible pos, so pos != next_pos */ + ssize_t wpos = 0, next_pos = 1; /* impossible pos, so pos != next_pos */ int n = 0; #endif
@@ -3860,7 +3860,7 @@ mdb_env_write_meta(MDB_txn *txn) MDB_meta meta, metab, *mp; unsigned flags; mdb_size_t mapsize; - off_t off; + mdb_size_t off; int rc, len, toggle; char *ptr; HANDLE mfd; @@ -4568,7 +4569,7 @@ mdb_hash_val(MDB_val *val, mdb_hash_t hval) static const char mdb_a85[]= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~";
static void ESECT -mdb_pack85(unsigned long l, char *out) +mdb_pack85(mdb_hash_t l, char *out) { int i;
@@ -4615,7 +4616,7 @@ mdenenv_setup_locks(MDB_env *env, char *lpath, int mode, int *excl) union semun semu; #endif int rc; - off_t size, rsize; + mdb_size_t size, rsize;
#ifdef _WIN32 wchar_t *wlpath;