Lines Matching refs:db
20 struct sql_db *db;
46 struct sqlpool_db *db;
74 sqlpool_add_connection(struct sqlpool_db *db, struct sqlpool_host *host,
84 sqlpool_request_new(struct sqlpool_db *db, const char *query)
89 request->db = db;
118 request->db->requests_head == request);
119 DLLIST2_REMOVE(&request->db->requests_head,
120 &request->db->requests_tail, request);
154 sqlpool_request_send_next(struct sqlpool_db *db, struct sql_db *conndb)
158 if (db->requests_head == NULL || !SQL_DB_IS_READY(conndb))
161 request = db->requests_head;
162 DLLIST2_REMOVE(&db->requests_head, &db->requests_tail, request);
163 timeout_reset(db->request_to);
182 sqlpool_find_host_with_least_connections(struct sqlpool_db *db,
188 hosts = array_get_modifiable(&db->hosts, &count);
203 static bool sqlpool_have_successful_connections(struct sqlpool_db *db)
207 array_foreach(&db->all_connections, conn) {
208 if (conn->db->state >= SQL_DB_STATE_IDLE)
215 sqlpool_handle_connect_failed(struct sqlpool_db *db, struct sql_db *conndb)
236 if (!sqlpool_have_successful_connections(db)) {
237 host = sqlpool_find_host_with_least_connections(db, &host_idx);
239 (void)sqlpool_add_connection(db, host, host_idx);
247 struct sqlpool_db *db = context;
252 sqlpool_request_send_next(db, conndb);
258 sqlpool_handle_connect_failed(db, conndb);
262 sqlpool_add_connection(struct sqlpool_db *db, struct sqlpool_host *host,
270 conndb = db->driver->v.init(host->connect_string);
274 conndb->state_change_context = db;
277 conn = array_append_space(&db->all_connections);
279 conn->db = conndb;
284 sqlpool_add_new_connection(struct sqlpool_db *db)
289 host = sqlpool_find_host_with_least_connections(db, &host_idx);
290 if (host->connection_count >= db->connection_limit)
293 return sqlpool_add_connection(db, host, host_idx);
297 sqlpool_find_available_connection(struct sqlpool_db *db,
306 conns = array_get(&db->all_connections, &count);
308 unsigned int idx = (i + db->last_query_conn_idx + 1) % count;
309 struct sql_db *conndb = conns[idx].db;
319 db->last_query_conn_idx = idx;
330 driver_sqlpool_get_connection(struct sqlpool_db *db,
338 conn = sqlpool_find_available_connection(db, unwanted_host_idx,
342 conn = sqlpool_find_available_connection(db, UINT_MAX,
348 conns = array_get(&db->all_connections, &count);
350 struct sql_db *conndb = conns[i].db;
355 conn = sqlpool_find_available_connection(db, UINT_MAX,
360 conn = sqlpool_add_new_connection(db);
362 (void)sql_connect(conn->db);
363 if (conn == NULL || !SQL_DB_IS_READY(conn->db))
371 driver_sqlpool_get_sync_connection(struct sqlpool_db *db,
377 if (driver_sqlpool_get_connection(db, UINT_MAX, conn_r))
382 conns = array_get(&db->all_connections, &count);
384 if (conns[i].db->state == SQL_DB_STATE_CONNECTING) {
393 driver_sqlpool_parse_hosts(struct sqlpool_db *db, const char *connect_string)
417 if (str_to_uint(value, &db->connection_limit) < 0) {
434 host = array_append_space(&db->hosts);
441 host = array_append_space(&db->hosts);
448 if (db->connection_limit == 0)
449 db->connection_limit = SQL_DEFAULT_CONNECTION_LIMIT;
452 static void sqlpool_add_all_once(struct sqlpool_db *db)
458 host = sqlpool_find_host_with_least_connections(db, &host_idx);
461 (void)sqlpool_add_connection(db, host, host_idx);
468 struct sqlpool_db *db;
472 db = i_new(struct sqlpool_db, 1);
473 db->driver = driver;
474 db->api = driver_sqlpool_db;
475 db->api.flags = driver->flags;
476 i_array_init(&db->hosts, 8);
479 driver_sqlpool_parse_hosts(db, connect_string);
482 i_array_init(&db->all_connections, 16);
484 sqlpool_add_all_once(db);
485 return &db->api;
488 static void driver_sqlpool_abort_requests(struct sqlpool_db *db)
490 while (db->requests_head != NULL) {
491 struct sqlpool_request *request = db->requests_head;
495 timeout_remove(&db->request_to);
500 struct sqlpool_db *db = (struct sqlpool_db *)_db;
504 array_foreach_modifiable(&db->all_connections, conn)
505 sql_deinit(&conn->db);
506 array_clear(&db->all_connections);
508 driver_sqlpool_abort_requests(db);
510 array_foreach_modifiable(&db->hosts, host)
513 i_assert(array_count(&db->all_connections) == 0);
514 array_free(&db->hosts);
515 array_free(&db->all_connections);
517 i_free(db);
522 struct sqlpool_db *db = (struct sqlpool_db *)_db;
526 array_foreach(&db->all_connections, conn) {
527 ret2 = conn->db->to_reconnect != NULL ? -1 :
528 sql_connect(conn->db);
539 struct sqlpool_db *db = (struct sqlpool_db *)_db;
542 array_foreach(&db->all_connections, conn)
543 sql_disconnect(conn->db);
544 driver_sqlpool_abort_requests(db);
550 struct sqlpool_db *db = (struct sqlpool_db *)_db;
555 conns = array_get(&db->all_connections, &count);
557 if (SQL_DB_IS_READY(conns[i].db))
558 return sql_escape_string(conns[i].db, string);
562 return sql_escape_string(conns[0].db, string);
565 static void driver_sqlpool_timeout(struct sqlpool_db *db)
567 while (db->requests_head != NULL) {
568 struct sqlpool_request *request = db->requests_head;
575 db->driver->name,
582 if (db->requests_head == NULL)
583 timeout_remove(&db->request_to);
587 driver_sqlpool_prepend_request(struct sqlpool_db *db,
590 DLLIST2_PREPEND(&db->requests_head, &db->requests_tail, request);
591 if (db->request_to == NULL) {
592 db->request_to = timeout_add(SQL_QUERY_TIMEOUT_SECS * 1000,
593 driver_sqlpool_timeout, db);
598 driver_sqlpool_append_request(struct sqlpool_db *db,
601 DLLIST2_APPEND(&db->requests_head, &db->requests_tail, request);
602 if (db->request_to == NULL) {
603 db->request_to = timeout_add(SQL_QUERY_TIMEOUT_SECS * 1000,
604 driver_sqlpool_timeout, db);
612 struct sqlpool_db *db = request->db;
617 request->retry_count < array_count(&db->hosts)) {
619 db->driver->name, sql_result_get_error(result));
621 driver_sqlpool_prepend_request(db, request);
623 if (driver_sqlpool_get_connection(request->db,
626 sqlpool_request_send_next(db, conn->db);
631 db->driver->name, request->query);
633 conndb = result->db;
639 sqlpool_request_send_next(db, conndb);
647 struct sqlpool_db *db = (struct sqlpool_db *)_db;
651 request = sqlpool_request_new(db, query);
655 if (!driver_sqlpool_get_connection(db, UINT_MAX, &conn))
656 driver_sqlpool_append_request(db, request);
659 sql_query(conn->db, query, driver_sqlpool_query_callback,
672 struct sqlpool_db *db = (struct sqlpool_db *)_db;
676 if (!driver_sqlpool_get_sync_connection(db, &conn)) {
681 result = sql_query_s(conn->db, query);
683 if (!driver_sqlpool_get_sync_connection(db, &conn))
687 result = sql_query_s(conn->db, query);
698 ctx->ctx.db = _db;
731 struct sqlpool_db *db = (struct sqlpool_db *)_ctx->db;
737 ctx->commit_request = sqlpool_request_new(db, NULL);
740 if (driver_sqlpool_get_connection(db, UINT_MAX, &conn))
741 sqlpool_request_handle_transaction(conn->db, ctx);
743 driver_sqlpool_append_request(db, ctx->commit_request);
752 struct sqlpool_db *db = (struct sqlpool_db *)_ctx->db;
759 if (!driver_sqlpool_get_sync_connection(db, &conn)) {
765 conn_trans = driver_sqlpool_new_conn_trans(ctx, conn->db);
797 struct sqlpool_db *db = (struct sqlpool_db *)_db;
802 conns = array_get(&db->all_connections, &count);
804 if (SQL_DB_IS_READY(conns[i].db))
805 return sql_escape_blob(conns[i].db, data, size);
809 return sql_escape_blob(conns[0].db, data, size);