pool: Change transaction handling
This commit is contained in:
+8
-46
@@ -51,41 +51,6 @@ bool replace_pool = FALSE;
|
|||||||
static void del(char *name);
|
static void del(char *name);
|
||||||
static void do_args(int argc, char *argv[]);
|
static void do_args(int argc, char *argv[]);
|
||||||
|
|
||||||
/**
|
|
||||||
* nesting counter for database transaction functions
|
|
||||||
*/
|
|
||||||
int nested_transaction = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* start a database transaction
|
|
||||||
*/
|
|
||||||
static void begin_transaction()
|
|
||||||
{
|
|
||||||
if (db->get_driver(db) == DB_SQLITE)
|
|
||||||
{
|
|
||||||
if (!nested_transaction)
|
|
||||||
{
|
|
||||||
db->execute(db, NULL, "BEGIN EXCLUSIVE TRANSACTION");
|
|
||||||
}
|
|
||||||
++nested_transaction;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* commit a database transaction
|
|
||||||
*/
|
|
||||||
static void commit_transaction()
|
|
||||||
{
|
|
||||||
if (db->get_driver(db) == DB_SQLITE)
|
|
||||||
{
|
|
||||||
--nested_transaction;
|
|
||||||
if (!nested_transaction)
|
|
||||||
{
|
|
||||||
db->execute(db, NULL, "END TRANSACTION");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create or replace a pool by name
|
* Create or replace a pool by name
|
||||||
*/
|
*/
|
||||||
@@ -370,8 +335,7 @@ static void add(char *name, host_t *start, host_t *end, int timeout)
|
|||||||
id = create_pool(name, start_addr, end_addr, timeout);
|
id = create_pool(name, start_addr, end_addr, timeout);
|
||||||
printf("allocating %d addresses... ", count);
|
printf("allocating %d addresses... ", count);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
/* run population in a transaction for sqlite */
|
db->transaction(db);
|
||||||
begin_transaction();
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
db->execute(db, NULL,
|
db->execute(db, NULL,
|
||||||
@@ -384,7 +348,7 @@ static void add(char *name, host_t *start, host_t *end, int timeout)
|
|||||||
}
|
}
|
||||||
chunk_increment(cur_addr);
|
chunk_increment(cur_addr);
|
||||||
}
|
}
|
||||||
commit_transaction();
|
db->commit(db);
|
||||||
printf("done.\n");
|
printf("done.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -449,8 +413,7 @@ static void add_addresses(char *pool, char *path, int timeout)
|
|||||||
host_t *addr;
|
host_t *addr;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
|
|
||||||
/* run population in a transaction for sqlite */
|
db->transaction(db);
|
||||||
begin_transaction();
|
|
||||||
|
|
||||||
addr = host_create_from_string("%any", 0);
|
addr = host_create_from_string("%any", 0);
|
||||||
pool_id = create_pool(pool, addr->get_address(addr),
|
pool_id = create_pool(pool, addr->get_address(addr),
|
||||||
@@ -510,7 +473,7 @@ static void add_addresses(char *pool, char *path, int timeout)
|
|||||||
addr->destroy(addr);
|
addr->destroy(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
commit_transaction();
|
db->commit(db);
|
||||||
|
|
||||||
printf("%d addresses done.\n", count);
|
printf("%d addresses done.\n", count);
|
||||||
}
|
}
|
||||||
@@ -596,6 +559,7 @@ static void resize(char *name, host_t *end)
|
|||||||
}
|
}
|
||||||
DESTROY_IF(old_end);
|
DESTROY_IF(old_end);
|
||||||
|
|
||||||
|
db->transaction(db);
|
||||||
if (db->execute(db, NULL,
|
if (db->execute(db, NULL,
|
||||||
"UPDATE pools SET end = ? WHERE name = ?",
|
"UPDATE pools SET end = ? WHERE name = ?",
|
||||||
DB_BLOB, new_addr, DB_TEXT, name) <= 0)
|
DB_BLOB, new_addr, DB_TEXT, name) <= 0)
|
||||||
@@ -606,8 +570,6 @@ static void resize(char *name, host_t *end)
|
|||||||
|
|
||||||
printf("allocating %d new addresses... ", count);
|
printf("allocating %d new addresses... ", count);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
/* run population in a transaction for sqlite */
|
|
||||||
begin_transaction();
|
|
||||||
while (count-- > 0)
|
while (count-- > 0)
|
||||||
{
|
{
|
||||||
chunk_increment(cur_addr);
|
chunk_increment(cur_addr);
|
||||||
@@ -616,7 +578,7 @@ static void resize(char *name, host_t *end)
|
|||||||
"VALUES (?, ?, ?, ?, ?)",
|
"VALUES (?, ?, ?, ?, ?)",
|
||||||
DB_UINT, id, DB_BLOB, cur_addr, DB_UINT, 0, DB_UINT, 0, DB_UINT, 1);
|
DB_UINT, id, DB_BLOB, cur_addr, DB_UINT, 0, DB_UINT, 0, DB_UINT, 1);
|
||||||
}
|
}
|
||||||
commit_transaction();
|
db->commit(db);
|
||||||
printf("done.\n");
|
printf("done.\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -900,7 +862,7 @@ static void batch(char *argv0, char *name)
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
begin_transaction();
|
db->transaction(db);
|
||||||
while (fgets(command, sizeof(command), file))
|
while (fgets(command, sizeof(command), file))
|
||||||
{
|
{
|
||||||
char *argv[ARGV_SIZE], *start;
|
char *argv[ARGV_SIZE], *start;
|
||||||
@@ -939,7 +901,7 @@ static void batch(char *argv0, char *name)
|
|||||||
|
|
||||||
do_args(argc, argv);
|
do_args(argc, argv);
|
||||||
}
|
}
|
||||||
commit_transaction();
|
db->commit(db);
|
||||||
|
|
||||||
if (file != stdin)
|
if (file != stdin)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user