diff options
Diffstat (limited to 'libmu_dbm/berkeley.c')
-rw-r--r-- | libmu_dbm/berkeley.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/libmu_dbm/berkeley.c b/libmu_dbm/berkeley.c index b9aab0c4f..88965f19f 100644 --- a/libmu_dbm/berkeley.c +++ b/libmu_dbm/berkeley.c @@ -1,5 +1,5 @@ /* GNU Mailutils -- a suite of utilities for electronic mail - Copyright (C) 2011-2019 Free Software Foundation, Inc. + Copyright (C) 2011-2024 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -69,8 +69,9 @@ static int do_bdb_open (mu_dbm_file_t mdb, int flags, int mode) { struct bdb_file *bdb_file = mdb->db_descr; - int f, rc, locker_flags; + int f, rc; enum mu_locker_mode locker_mode; + mu_locker_hints_t hints = { .flags = MU_LOCKER_FLAG_RETRY }; int tfd = -1; switch (flags) @@ -96,12 +97,10 @@ do_bdb_open (mu_dbm_file_t mdb, int flags, int mode) #ifdef DB_FCNTL_LOCKING f |= DB_FCNTL_LOCKING; - locker_flags = MU_LOCKER_KERNEL; -#else - locker_flags = 0; + hints.flags |= MU_LOCKER_FLAG_TYPE; + hints.type = MU_LOCKER_TYPE_KERNEL; #endif - rc = mu_locker_create (&bdb_file->locker, mdb->db_name, - locker_flags|MU_LOCKER_RETRY); + rc = mu_locker_create_ext (&bdb_file->locker, mdb->db_name, &hints); if (rc) return rc; @@ -154,9 +153,14 @@ _bdb_close (mu_dbm_file_t db) if (db->db_descr) { struct bdb_file *bdb_file = db->db_descr; + + if (bdb_file->dbc) + bdb_file->dbc->c_close (bdb_file->dbc); + if (bdb_file->db) bdb_file->db->close (bdb_file->db, 0); if (bdb_file->locker) + { mu_locker_unlock (bdb_file->locker); mu_locker_destroy (&bdb_file->locker); @@ -293,8 +297,7 @@ _bdb_firstkey (mu_dbm_file_t db, struct mu_dbm_datum *ret) if (!bdb_file->dbc) { - rc = bdb_file->db->cursor (bdb_file->db, NULL, &bdb_file->dbc - BDB2_CURSOR_LASTARG); + rc = bdb_file->db->cursor (bdb_file->db, NULL, &bdb_file->dbc, 0); if (rc) { db->db_errno.n = rc; @@ -369,6 +372,18 @@ _bdb_nextkey (mu_dbm_file_t db, struct mu_dbm_datum *ret) return rc; } +static int +_bdb_break (mu_dbm_file_t mdb) +{ + struct bdb_file *bdb_file = mdb->db_descr; + if (bdb_file->dbc) + { + bdb_file->dbc->c_close (bdb_file->dbc); + bdb_file->dbc = NULL; + } + return 0; +} + static void _bdb_datum_free (struct mu_dbm_datum *datum) { @@ -393,6 +408,7 @@ struct mu_dbm_impl _mu_dbm_bdb = { _bdb_firstkey, _bdb_nextkey, _bdb_datum_free, - _bdb_strerror + _bdb_strerror, + _bdb_break }; #endif |