driver-sqlpool.c (dovecot-2.3.16) | : | driver-sqlpool.c (dovecot-2.3.17) | ||
---|---|---|---|---|
skipping to change at line 420 | skipping to change at line 420 | |||
conns = array_get(&db->all_connections, &count); | conns = array_get(&db->all_connections, &count); | |||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | |||
if (conns[i].db->state == SQL_DB_STATE_CONNECTING) { | if (conns[i].db->state == SQL_DB_STATE_CONNECTING) { | |||
*conn_r = &conns[i]; | *conn_r = &conns[i]; | |||
return TRUE; | return TRUE; | |||
} | } | |||
} | } | |||
return FALSE; | return FALSE; | |||
} | } | |||
static bool | ||||
driver_sqlpool_get_connected_flags(struct sqlpool_db *db, | ||||
enum sql_db_flags *flags_r) | ||||
{ | ||||
const struct sqlpool_connection *conn; | ||||
array_foreach(&db->all_connections, conn) { | ||||
if (conn->db->state > SQL_DB_STATE_CONNECTING) { | ||||
*flags_r = sql_get_flags(conn->db); | ||||
return TRUE; | ||||
} | ||||
} | ||||
return FALSE; | ||||
} | ||||
static enum sql_db_flags driver_sqlpool_get_flags(struct sql_db *_db) | static enum sql_db_flags driver_sqlpool_get_flags(struct sql_db *_db) | |||
{ | { | |||
struct sqlpool_db *db = (struct sqlpool_db *)_db; | struct sqlpool_db *db = (struct sqlpool_db *)_db; | |||
const struct sqlpool_connection *conn, *last_conn = NULL; | const struct sqlpool_connection *conn; | |||
enum sql_db_flags flags; | ||||
/* try to use a connected db */ | /* try to use a connected db */ | |||
array_foreach(&db->all_connections, conn) { | if (driver_sqlpool_get_connected_flags(db, &flags)) | |||
if (SQL_DB_IS_READY(conn->db)) | return flags; | |||
return sql_get_flags(conn->db); | ||||
last_conn = conn; | if (!driver_sqlpool_get_sync_connection(db, &conn)) { | |||
} | /* Failed to connect to database. Just use the first | |||
/* fallback to the last db, if there is any */ | connection. */ | |||
if (last_conn != NULL) | conn = array_idx(&db->all_connections, 0); | |||
return sql_get_flags(last_conn->db); | } | |||
/* Just use the default flags. The flags shouldn't be worth having | return sql_get_flags(conn->db); | |||
to create a connection. */ | ||||
return _db->flags; | ||||
} | } | |||
static int | static int | |||
driver_sqlpool_parse_hosts(struct sqlpool_db *db, const char *connect_string, | driver_sqlpool_parse_hosts(struct sqlpool_db *db, const char *connect_string, | |||
const char **error_r) | const char **error_r) | |||
{ | { | |||
const char *const *args, *key, *value, *hostname; | const char *const *args, *key, *value, *hostname; | |||
struct sqlpool_host *host; | struct sqlpool_host *host; | |||
ARRAY_TYPE(const_string) hostnames, connect_args; | ARRAY_TYPE(const_string) hostnames, connect_args; | |||
skipping to change at line 887 | skipping to change at line 901 | |||
conns = array_get(&db->all_connections, &count); | conns = array_get(&db->all_connections, &count); | |||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | |||
if (SQL_DB_IS_READY(conns[i].db)) | if (SQL_DB_IS_READY(conns[i].db)) | |||
return sql_escape_blob(conns[i].db, data, size); | return sql_escape_blob(conns[i].db, data, size); | |||
} | } | |||
/* no ready connections. just use the first one (we're guaranteed | /* no ready connections. just use the first one (we're guaranteed | |||
to always have one) */ | to always have one) */ | |||
return sql_escape_blob(conns[0].db, data, size); | return sql_escape_blob(conns[0].db, data, size); | |||
} | } | |||
static void driver_sqlpool_wait(struct sql_db *_db) | ||||
{ | ||||
struct sqlpool_db *db = (struct sqlpool_db *)_db; | ||||
const struct sqlpool_connection *conn; | ||||
array_foreach(&db->all_connections, conn) | ||||
sql_wait(conn->db); | ||||
} | ||||
struct sql_db driver_sqlpool_db = { | struct sql_db driver_sqlpool_db = { | |||
"", | "", | |||
.v = { | .v = { | |||
.get_flags = driver_sqlpool_get_flags, | .get_flags = driver_sqlpool_get_flags, | |||
.deinit = driver_sqlpool_deinit, | .deinit = driver_sqlpool_deinit, | |||
.connect = driver_sqlpool_connect, | .connect = driver_sqlpool_connect, | |||
.disconnect = driver_sqlpool_disconnect, | .disconnect = driver_sqlpool_disconnect, | |||
.escape_string = driver_sqlpool_escape_string, | .escape_string = driver_sqlpool_escape_string, | |||
.exec = driver_sqlpool_exec, | .exec = driver_sqlpool_exec, | |||
.query = driver_sqlpool_query, | .query = driver_sqlpool_query, | |||
.query_s = driver_sqlpool_query_s, | .query_s = driver_sqlpool_query_s, | |||
.wait = driver_sqlpool_wait, | ||||
.transaction_begin = driver_sqlpool_transaction_begin, | .transaction_begin = driver_sqlpool_transaction_begin, | |||
.transaction_commit = driver_sqlpool_transaction_commit, | .transaction_commit = driver_sqlpool_transaction_commit, | |||
.transaction_commit_s = driver_sqlpool_transaction_commit_s, | .transaction_commit_s = driver_sqlpool_transaction_commit_s, | |||
.transaction_rollback = driver_sqlpool_transaction_rollback, | .transaction_rollback = driver_sqlpool_transaction_rollback, | |||
.update = driver_sqlpool_update, | .update = driver_sqlpool_update, | |||
.escape_blob = driver_sqlpool_escape_blob, | .escape_blob = driver_sqlpool_escape_blob, | |||
} | } | |||
End of changes. 5 change blocks. | ||||
12 lines changed or deleted | 36 lines changed or added |