summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/torture/torture.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 98da818695..ae1717338e 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -7155,6 +7155,135 @@ fail:
return result;
}
+static bool dbtrans_inc(struct db_context *db)
+{
+ struct db_record *rec;
+ uint32_t *val;
+ bool ret = false;
+ NTSTATUS status;
+
+ rec = db->fetch_locked(db, db, string_term_tdb_data("transtest"));
+ if (rec == NULL) {
+ printf(__location__ "fetch_lock failed\n");
+ return false;
+ }
+
+ if (rec->value.dsize != sizeof(uint32_t)) {
+ printf(__location__ "value.dsize = %d\n",
+ (int)rec->value.dsize);
+ goto fail;
+ }
+
+ val = (uint32_t *)rec->value.dptr;
+ *val += 1;
+
+ status = rec->store(rec, make_tdb_data((uint8_t *)val,
+ sizeof(uint32_t)),
+ 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf(__location__ "store failed: %s\n",
+ nt_errstr(status));
+ goto fail;
+ }
+
+ ret = true;
+fail:
+ TALLOC_FREE(rec);
+ return ret;
+}
+
+static bool run_local_dbtrans(int dummy)
+{
+ struct db_context *db;
+ struct db_record *rec;
+ NTSTATUS status;
+ uint32_t initial;
+ int res;
+
+ db = db_open(talloc_tos(), "transtest.tdb", 0, TDB_DEFAULT,
+ O_RDWR|O_CREAT, 0600);
+ if (db == NULL) {
+ printf("Could not open transtest.db\n");
+ return false;
+ }
+
+ res = db->transaction_start(db);
+ if (res == -1) {
+ printf(__location__ "transaction_start failed\n");
+ return false;
+ }
+
+ rec = db->fetch_locked(db, db, string_term_tdb_data("transtest"));
+ if (rec == NULL) {
+ printf(__location__ "fetch_lock failed\n");
+ return false;
+ }
+
+ if (rec->value.dptr == NULL) {
+ initial = 0;
+ status = rec->store(
+ rec, make_tdb_data((uint8_t *)&initial,
+ sizeof(initial)),
+ 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf(__location__ "store returned %s\n",
+ nt_errstr(status));
+ return false;
+ }
+ }
+
+ TALLOC_FREE(rec);
+
+ res = db->transaction_commit(db);
+ if (res == -1) {
+ printf(__location__ "transaction_commit failed\n");
+ return false;
+ }
+
+ while (true) {
+ uint32_t val, val2;
+ int i;
+
+ res = db->transaction_start(db);
+ if (res == -1) {
+ printf(__location__ "transaction_start failed\n");
+ break;
+ }
+
+ if (!dbwrap_fetch_uint32(db, "transtest", &val)) {
+ printf(__location__ "dbwrap_fetch_uint32 failed\n");
+ break;
+ }
+
+ for (i=0; i<10; i++) {
+ if (!dbtrans_inc(db)) {
+ return false;
+ }
+ }
+
+ if (!dbwrap_fetch_uint32(db, "transtest", &val2)) {
+ printf(__location__ "dbwrap_fetch_uint32 failed\n");
+ break;
+ }
+
+ if (val2 != val + 10) {
+ printf(__location__ "val=%d, val2=%d\n",
+ (int)val, (int)val2);
+ break;
+ }
+
+ printf("val2=%d\r", val2);
+
+ res = db->transaction_commit(db);
+ if (res == -1) {
+ printf(__location__ "transaction_commit failed\n");
+ break;
+ }
+ }
+
+ TALLOC_FREE(db);
+ return true;
+}
static double create_procs(bool (*fn)(int), bool *result)
{
@@ -7333,6 +7462,7 @@ static struct {
{ "LOCAL-STREAM-NAME", run_local_stream_name, 0},
{ "LOCAL-WBCLIENT", run_local_wbclient, 0},
{ "LOCAL-dom_sid_parse", run_local_dom_sid_parse, 0},
+ { "LOCAL-DBTRANS", run_local_dbtrans, 0},
{NULL, NULL, 0}};