Add hdb_set_sync() method

This commit is contained in:
Nicolas Williams
2017-10-10 13:06:21 -05:00
parent e3cc7dfb94
commit 5bcbe2125b
7 changed files with 140 additions and 54 deletions

View File

@@ -54,6 +54,7 @@
typedef struct {
HDB hdb; /* generic members */
int lock_fd; /* DB3-specific */
int do_sync; /* DB3-specific */
} DB3_HDB;
@@ -91,6 +92,32 @@ DB_destroy(krb5_context context, HDB *db)
return ret;
}
static krb5_error_code
DB_set_sync(krb5_context context, HDB *db, int on)
{
DB3_HDB *db3 = (DB3_HDB *)db;
DB *d = (DB*)db->hdb_db;
krb5_error_code ret = 0;
db3->do_sync = on;
if (on) {
ret = (*d->sync)(d, 0);
if (ret) {
if (ret == EACCES || ret == ENOSPC || ret == EINVAL) {
krb5_set_error_message(context, ret,
"Database %s put sync error: %s",
db->hdb_name, strerror(ret));
} else {
ret = HDB_ERR_UK_SERROR;
krb5_set_error_message(context, ret,
"Database %s put sync error: unknown (%d)",
db->hdb_name, ret);
}
}
}
return ret;
}
static krb5_error_code
DB_lock(krb5_context context, HDB *db, int operation)
{
@@ -220,6 +247,7 @@ static krb5_error_code
DB__put(krb5_context context, HDB *db, int replace,
krb5_data key, krb5_data value)
{
DB3_HDB *db3 = (DB3_HDB *)db;
DB *d = (DB*)db->hdb_db;
DBT k, v;
int code;
@@ -261,26 +289,13 @@ DB__put(krb5_context context, HDB *db, int replace,
}
return code;
}
code = (*d->sync)(d, 0);
if (code) {
if (code == EACCES || code == ENOSPC || code == EINVAL) {
krb5_set_error_message(context, code,
"Database %s put sync error: %s",
db->hdb_name, strerror(code));
} else {
code = HDB_ERR_UK_SERROR;
krb5_set_error_message(context, code,
"Database %s put sync error: unknown (%d)",
db->hdb_name, code);
}
return code;
}
return 0;
return db->hdb_set_sync(context, db, db3->do_sync);
}
static krb5_error_code
DB__del(krb5_context context, HDB *db, krb5_data key)
{
DB3_HDB *db3 = (DB3_HDB *)db;
DB *d = (DB*)db->hdb_db;
DBT k;
krb5_error_code code;
@@ -304,21 +319,7 @@ DB__del(krb5_context context, HDB *db, krb5_data key)
}
return code;
}
code = (*d->sync)(d, 0);
if (code) {
if (code == EACCES || code == ENOSPC || code == EINVAL) {
krb5_set_error_message(context, code,
"Database %s del sync error: %s",
db->hdb_name, strerror(code));
} else {
code = HDB_ERR_UK_SERROR;
krb5_set_error_message(context, code,
"Database %s del sync error: unknown (%d)",
db->hdb_name, code);
}
return code;
}
return 0;
return db->hdb_set_sync(context, db, db3->do_sync);
}
#define RD_CACHE_SZ 0x8000 /* Minimal read cache size */
@@ -485,6 +486,7 @@ hdb_db3_create(krb5_context context, HDB **db,
(*db)->hdb__put = DB__put;
(*db)->hdb__del = DB__del;
(*db)->hdb_destroy = DB_destroy;
(*db)->hdb_set_sync = DB_set_sync;
(*db3)->lock_fd = -1;
return 0;