diff options
author | Matthieu Patou <mat@matws.net> | 2012-05-30 10:43:27 -0700 |
---|---|---|
committer | Matthieu Patou <mat@matws.net> | 2012-06-22 23:22:04 -0700 |
commit | 6f3a8b41f5b43c35263a401b2bddbe4e49812b85 (patch) | |
tree | bd0da53909e07e60f2592c028cbacb28029b1320 /source4/dsdb/samdb/ldb_modules/partition_metadata.c | |
parent | 9f1213d954c72a46ac1f30e936e4004b1ed9ff76 (diff) | |
download | samba-6f3a8b41f5b43c35263a401b2bddbe4e49812b85.tar.gz samba-6f3a8b41f5b43c35263a401b2bddbe4e49812b85.tar.bz2 samba-6f3a8b41f5b43c35263a401b2bddbe4e49812b85.zip |
s4-dsdb: Add/Update SCHEMA_SEQ_NUM key in the metadata.tdb after schemaUpdateNow
The idea is to signal to other process accessing the database that the
schema was forced to be reloaded and so they should reload as well.
Diffstat (limited to 'source4/dsdb/samdb/ldb_modules/partition_metadata.c')
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/partition_metadata.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/partition_metadata.c b/source4/dsdb/samdb/ldb_modules/partition_metadata.c index 8e97b52802..0bf7a40640 100644 --- a/source4/dsdb/samdb/ldb_modules/partition_metadata.c +++ b/source4/dsdb/samdb/ldb_modules/partition_metadata.c @@ -139,6 +139,38 @@ static int partition_metadata_set_uint64(struct ldb_module *module, return LDB_SUCCESS; } +int partition_metadata_inc_schema_sequence(struct ldb_module *module) +{ + struct partition_private_data *data; + int ret; + uint64_t value; + + data = talloc_get_type_abort(ldb_module_get_private(module), + struct partition_private_data); + if (!data || !data->metadata) { + return ldb_module_error(module, LDB_ERR_OPERATIONS_ERROR, + "partition_metadata: metadata not initialized"); + } + + if (data->metadata->in_transaction == 0) { + return ldb_module_error(module, LDB_ERR_OPERATIONS_ERROR, + "partition_metadata: increment sequence number without transaction"); + } + ret = partition_metadata_get_uint64(module, DSDB_METADATA_SCHEMA_SEQ_NUM, &value, 0); + if (ret != LDB_SUCCESS) { + return ret; + } + + value++; + ret = partition_metadata_set_uint64(module, DSDB_METADATA_SCHEMA_SEQ_NUM, value, false); + if (ret == LDB_ERR_OPERATIONS_ERROR) { + /* Modify failed, let's try the add */ + ret = partition_metadata_set_uint64(module, DSDB_METADATA_SCHEMA_SEQ_NUM, value, true); + } + return ret; +} + + /* * Open sam.ldb.d/metadata.tdb. |