annotate src/lib-sql/driver-cassandra.c @ 22715:20415dd0b85a

dsync: Add per-mailbox sync lock that is always used. Both importing and exporting gets the lock before they even sync the mailbox. The lock is kept until the import/export finishes. This guarantees that no matter how dsync is run, two dsyncs can't be working on the same mailbox at the same time. This lock is in addition to the optional per-user lock enabled by the -l parameter. If the -l parameter is used, the same lock timeout is used for the per-mailbox lock. Otherwise 30s timeout is used. This should help to avoid email duplication when replication is enabled for public namespaces, and maybe in some other rare situations as well.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 28 Dec 2017 14:10:23 +0200
parents cb108f786fb4
children 37d5a5c7a7b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22617
diff changeset
1 /* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
5 #include "hex-binary.h"
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "str.h"
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ioloop.h"
19743
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
8 #include "net.h"
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "write-full.h"
19150
a72a65771d8c cassandra: If log_level=debug, log also how long the queries take.
Timo Sirainen <tss@iki.fi>
parents: 19146
diff changeset
10 #include "time-util.h"
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
11 #include "var-expand.h"
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
12 #include "settings-parser.h"
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "sql-api-private.h"
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #ifdef BUILD_CASSANDRA
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
16 #include <fcntl.h>
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include <unistd.h>
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <cassandra.h>
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #define IS_CONNECTED(db) \
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 ((db)->api.state != SQL_DB_STATE_DISCONNECTED && \
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 (db)->api.state != SQL_DB_STATE_CONNECTING)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
24 #define CASSANDRA_FALLBACK_WARN_INTERVAL_SECS 60
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
25 #define CASSANDRA_FALLBACK_FIRST_RETRY_MSECS 50
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
26 #define CASSANDRA_FALLBACK_MAX_RETRY_MSECS (1000*60)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
27
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
28 #define CASS_QUERY_DEFAULT_WARN_TIMEOUT_SECS 5
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
29
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 typedef void driver_cassandra_callback_t(CassFuture *future, void *context);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
32 enum cassandra_counter_type {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
33 CASSANDRA_COUNTER_TYPE_QUERY_SENT,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
34 CASSANDRA_COUNTER_TYPE_QUERY_RECV_OK,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
35 CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_NO_HOSTS,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
36 CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_QUEUE_FULL,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
37 CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_CLIENT_TIMEOUT,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
38 CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_SERVER_TIMEOUT,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
39 CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_SERVER_UNAVAILABLE,
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
40 CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_OTHER,
21844
afa236a944eb driver-cassandra: Add metric for slow queries
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21829
diff changeset
41 CASSANDRA_COUNTER_TYPE_QUERY_SLOW,
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
42
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
43 CASSANDRA_COUNTER_COUNT
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
44 };
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
45 static const char *counter_names[CASSANDRA_COUNTER_COUNT] = {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
46 "sent",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
47 "recv_ok",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
48 "recv_err_no_hosts",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
49 "recv_err_queue_full",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
50 "recv_err_client_timeout",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
51 "recv_err_server_timeout",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
52 "recv_err_server_unavailable",
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
53 "recv_err_other",
21844
afa236a944eb driver-cassandra: Add metric for slow queries
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21829
diff changeset
54 "slow",
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
55 };
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
56
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
57 enum cassandra_query_type {
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
58 CASSANDRA_QUERY_TYPE_READ,
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
59 CASSANDRA_QUERY_TYPE_READ_MORE,
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
60 CASSANDRA_QUERY_TYPE_WRITE,
22368
faadf17a3baa cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22358
diff changeset
61 CASSANDRA_QUERY_TYPE_DELETE,
faadf17a3baa cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22358
diff changeset
62
faadf17a3baa cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22358
diff changeset
63 CASSANDRA_QUERY_TYPE_COUNT
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
64 };
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
65
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
66 static const char *cassandra_query_type_names[CASSANDRA_QUERY_TYPE_COUNT] = {
22368
faadf17a3baa cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22358
diff changeset
67 "read", "read-more", "write", "delete"
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
68 };
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
69
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 struct cassandra_callback {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 unsigned int id;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 CassFuture *future;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 struct cassandra_db *db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 driver_cassandra_callback_t *callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 void *context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 struct cassandra_db {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 struct sql_db api;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
20046
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
81 char *hosts, *keyspace, *user, *password;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
82 CassConsistency read_consistency, write_consistency, delete_consistency;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
83 CassConsistency read_fallback_consistency, write_fallback_consistency, delete_fallback_consistency;
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
84 CassLogLevel log_level;
20483
80e064878fab cassandra: Added debug_queries connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20482
diff changeset
85 bool debug_queries;
20834
426ae3e75ca5 cassandra: Added latency_aware_routing connect-parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20529
diff changeset
86 bool latency_aware_routing;
19218
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
87 unsigned int protocol_version;
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
88 unsigned int num_threads;
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
89 unsigned int connect_timeout_secs, request_timeout_secs;
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
90 unsigned int warn_timeout_secs;
21384
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
91 unsigned int heartbeat_interval_secs, idle_timeout_secs;
21531
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
92 unsigned int execution_retry_interval_msecs, execution_retry_times;
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
93 unsigned int page_size;
19743
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
94 in_port_t port;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 CassCluster *cluster;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 CassSession *session;
19216
1e4d2306f1f3 cassandra: Use a local monotonic timestamp generator.
Timo Sirainen <tss@iki.fi>
parents: 19153
diff changeset
98 CassTimestampGen *timestamp_gen;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 int fd_pipe[2];
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 struct io *io_pipe;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
102 ARRAY(struct cassandra_sql_prepared_statement *) pending_prepares;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 ARRAY(struct cassandra_callback *) callbacks;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
104 ARRAY(struct cassandra_result *) results;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 unsigned int callback_ids;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
107 char *metrics_path;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
108 struct timeout *to_metrics;
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
109 uint64_t counters[CASSANDRA_COUNTER_COUNT];
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
110
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
111 struct timeval primary_query_last_sent[CASSANDRA_QUERY_TYPE_COUNT];
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
112 time_t last_fallback_warning[CASSANDRA_QUERY_TYPE_COUNT];
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
113 unsigned int fallback_failures[CASSANDRA_QUERY_TYPE_COUNT];
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
114
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
115 /* for synchronous queries: */
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 struct ioloop *ioloop, *orig_ioloop;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 struct sql_result *sync_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 char *error;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 struct cassandra_result {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 struct sql_result api;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 CassStatement *statement;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 const CassResult *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 CassIterator *iterator;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 char *query;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 char *error;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
129 CassConsistency consistency, fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
130 enum cassandra_query_type query_type;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
131 struct timeval page0_start_time, start_time, finish_time;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
132 unsigned int row_count, total_row_count, page_num;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 pool_t row_pool;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 ARRAY_TYPE(const_string) fields;
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
136 ARRAY(size_t) field_sizes;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 sql_query_callback_t *callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 void *context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
141 unsigned int is_prepared:1;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
142 unsigned int query_sent:1;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 unsigned int finished:1;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
144 unsigned int paging_continues:1;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 struct cassandra_transaction_context {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 struct sql_transaction_context ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 int refcount;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
151 sql_commit2_callback_t *callback;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 void *context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
154 struct cassandra_sql_statement *stmt;
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
155 char *query;
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
156 char *error;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 unsigned int begin_succeeded:1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 unsigned int begin_failed:1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 unsigned int failed:1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
163 struct cassandra_sql_arg {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
164 unsigned int column_idx;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
165
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
166 char *value_str;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
167 unsigned char *value_binary;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
168 size_t value_binary_size;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
169 int64_t value_int64;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
170 };
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
171
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
172 struct cassandra_sql_statement {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
173 struct sql_statement stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
174
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
175 struct cassandra_sql_prepared_statement *prep;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
176 CassStatement *cass_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
177
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
178 ARRAY(struct cassandra_sql_arg) pending_args;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
179 cass_int64_t pending_timestamp;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
180
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
181 struct cassandra_result *result;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
182 };
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
183
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
184 struct cassandra_sql_prepared_statement {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
185 struct sql_prepared_statement prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
186 char *query_template;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
187
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
188 /* NULL, until the prepare is asynchronously finished */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
189 const CassPrepared *prepared;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
190 /* statements waiting for prepare to finish */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
191 ARRAY(struct cassandra_sql_statement *) pending_statements;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
192 /* an error here will cause the prepare to be retried on the next
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
193 execution attempt. */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
194 char *error;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
195
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
196 bool pending;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
197 };
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
198
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 extern const struct sql_db driver_cassandra_db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 extern const struct sql_result driver_cassandra_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 static struct {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 CassConsistency consistency;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 const char *name;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 } cass_consistency_names[] = {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 { CASS_CONSISTENCY_ANY, "any" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 { CASS_CONSISTENCY_ONE, "one" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 { CASS_CONSISTENCY_TWO, "two" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 { CASS_CONSISTENCY_THREE, "three" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 { CASS_CONSISTENCY_QUORUM, "" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 { CASS_CONSISTENCY_ALL, "all" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 { CASS_CONSISTENCY_LOCAL_QUORUM, "local-quorum" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 { CASS_CONSISTENCY_EACH_QUORUM, "each-quorum" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 { CASS_CONSISTENCY_SERIAL, "serial" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 { CASS_CONSISTENCY_LOCAL_SERIAL, "local-serial" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 { CASS_CONSISTENCY_LOCAL_ONE, "local-one" }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
219 static struct {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
220 CassLogLevel log_level;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
221 const char *name;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
222 } cass_log_level_names[] = {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
223 { CASS_LOG_CRITICAL, "critical" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
224 { CASS_LOG_ERROR, "error" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
225 { CASS_LOG_WARN, "warn" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
226 { CASS_LOG_INFO, "info" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
227 { CASS_LOG_DEBUG, "debug" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
228 { CASS_LOG_TRACE, "trace" }
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
229 };
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
230
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
231 static void driver_cassandra_prepare_pending(struct cassandra_db *db);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
232 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
233 prepare_finish_pending_statements(struct cassandra_sql_prepared_statement *prep_stmt);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
234 static void driver_cassandra_result_send_query(struct cassandra_result *result);
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
235 static void driver_cassandra_send_queries(struct cassandra_db *db);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 static void result_finish(struct cassandra_result *result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 static int consistency_parse(const char *str, CassConsistency *consistency_r)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 unsigned int i;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 for (i = 0; i < N_ELEMENTS(cass_consistency_names); i++) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 if (strcmp(cass_consistency_names[i].name, str) == 0) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 *consistency_r = cass_consistency_names[i].consistency;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
251 static int log_level_parse(const char *str, CassLogLevel *log_level_r)
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
252 {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
253 unsigned int i;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
254
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
255 for (i = 0; i < N_ELEMENTS(cass_log_level_names); i++) {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
256 if (strcmp(cass_log_level_names[i].name, str) == 0) {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
257 *log_level_r = cass_log_level_names[i].log_level;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
258 return 0;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
259 }
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
260 }
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
261 return -1;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
262 }
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
263
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 static void driver_cassandra_set_state(struct cassandra_db *db, enum sql_db_state state)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 /* switch back to original ioloop in case the caller wants to
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 add/remove timeouts */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 if (db->ioloop != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 io_loop_set_current(db->orig_ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 sql_db_set_state(&db->api, state);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 if (db->ioloop != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 io_loop_set_current(db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
275 static void driver_cassandra_close(struct cassandra_db *db, const char *error)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
277 struct cassandra_sql_prepared_statement *const *prep_stmtp;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
278 struct cassandra_result *const *resultp;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
279
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 if (db->io_pipe != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 io_remove(&db->io_pipe);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 if (db->fd_pipe[0] != -1) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 i_close_fd(&db->fd_pipe[0]);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 i_close_fd(&db->fd_pipe[1]);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 driver_cassandra_set_state(db, SQL_DB_STATE_DISCONNECTED);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
288 array_foreach(&db->pending_prepares, prep_stmtp) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
289 (*prep_stmtp)->pending = FALSE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
290 (*prep_stmtp)->error = i_strdup(error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
291 prepare_finish_pending_statements(*prep_stmtp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
292 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
293 array_clear(&db->pending_prepares);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
294
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
295 while (array_count(&db->results) > 0) {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
296 resultp = array_idx(&db->results, 0);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
297 if ((*resultp)->error == NULL)
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
298 (*resultp)->error = i_strdup(error);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
299 result_finish(*resultp);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
300 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
301
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 if (db->ioloop != NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 /* running a sync query, stop it */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 io_loop_stop(db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 static void driver_cassandra_log_error(CassFuture *future, const char *str)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 const char *message;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 size_t size;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 cass_future_error_message(future, &message, &size);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 i_error("cassandra: %s: %.*s", str, (int)size, message);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 static void driver_cassandra_future_callback(CassFuture *future ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 void *context)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 struct cassandra_callback *cb = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 /* this isn't the main thread - communicate with main thread by
21652
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
323 writing the callback id to the pipe. note that we must not use
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
324 almost any dovecot functions here because most of them are using
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
325 data-stack, which isn't thread-safe. especially don't use
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
326 i_error() here. */
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
327 if (write_full(cb->db->fd_pipe[1], &cb->id, sizeof(cb->id)) < 0) {
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
328 const char *str = t_strdup_printf(
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
329 "cassandra: write(pipe) failed: %s\n",
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
330 strerror(errno));
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
331 (void)write_full(STDERR_FILENO, str, strlen(str));
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
332 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 static void cassandra_callback_run(struct cassandra_callback *cb)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 cb->callback(cb->future, cb->context);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 cass_future_free(cb->future);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 i_free(cb);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 static void driver_cassandra_input_id(struct cassandra_db *db, unsigned int id)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 struct cassandra_callback *cb, *const *cbp;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 /* usually there are only a few callbacks, so don't bother with using
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 a hash table */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 array_foreach(&db->callbacks, cbp) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 cb = *cbp;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 if (cb->id == id) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 array_delete(&db->callbacks,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 array_foreach_idx(&db->callbacks, cbp), 1);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 cassandra_callback_run(cb);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 i_panic("cassandra: Received unknown ID %u", id);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 static void driver_cassandra_input(struct cassandra_db *db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 unsigned int ids[1024];
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 ssize_t ret;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 ret = read(db->fd_pipe[0], ids, sizeof(ids));
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 if (ret < 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 i_error("cassandra: read(pipe) failed: %m");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 else if (ret == 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 i_error("cassandra: read(pipe) failed: EOF");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 else if (ret % sizeof(ids[0]) != 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 i_error("cassandra: read(pipe) returned wrong amount of data");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 else {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 /* success */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 unsigned int i, count = ret / sizeof(ids[0]);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 for (i = 0; i < count && db->api.state != SQL_DB_STATE_DISCONNECTED; i++)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 driver_cassandra_input_id(db, ids[i]);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 }
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
380 driver_cassandra_close(db, "IPC pipe closed");
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 driver_cassandra_set_callback(CassFuture *future, struct cassandra_db *db,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 driver_cassandra_callback_t *callback,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 void *context)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 struct cassandra_callback *cb;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 cb = i_new(struct cassandra_callback, 1);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 cb->id = ++db->callback_ids;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 cb->future = future;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 cb->callback = callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 cb->context = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 cb->db = db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 array_append(&db->callbacks, &cb, 1);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 cass_future_set_callback(future, driver_cassandra_future_callback, cb);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 static void connect_callback(CassFuture *future, void *context)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 struct cassandra_db *db = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 CassError rc;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 if ((rc = cass_future_error_code(future)) != CASS_OK) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 driver_cassandra_log_error(future,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 "Couldn't connect to Cassandra");
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
409 driver_cassandra_close(db, "Couldn't connect to Cassandra");
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 driver_cassandra_set_state(db, SQL_DB_STATE_IDLE);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 if (db->ioloop != NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 /* driver_cassandra_sync_init() waiting for connection to
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 finish */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 io_loop_stop(db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 }
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
418 driver_cassandra_prepare_pending(db);
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
419 driver_cassandra_send_queries(db);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 static int driver_cassandra_connect(struct sql_db *_db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 struct cassandra_db *db = (struct cassandra_db *)_db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 CassFuture *future;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 i_assert(db->api.state == SQL_DB_STATE_DISCONNECTED);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 if (pipe(db->fd_pipe) < 0) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 i_error("pipe() failed: %m");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 db->io_pipe = io_add(db->fd_pipe[0], IO_READ,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 driver_cassandra_input, db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 driver_cassandra_set_state(db, SQL_DB_STATE_CONNECTING);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 future = cass_session_connect_keyspace(db->session, db->cluster, db->keyspace);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 driver_cassandra_set_callback(future, db, connect_callback, db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 static void driver_cassandra_disconnect(struct sql_db *_db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 struct cassandra_db *db = (struct cassandra_db *)_db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
446 driver_cassandra_close(db, "Disconnected");
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 driver_cassandra_escape_string(struct sql_db *db ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 const char *string)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 string_t *escaped;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 unsigned int i;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 if (strchr(string, '\'') == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 return string;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 escaped = t_str_new(strlen(string)+10);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 for (i = 0; string[i] != '\0'; i++) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 if (string[i] == '\'')
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 str_append_c(escaped, '\'');
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 str_append_c(escaped, string[i]);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 return str_c(escaped);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 static void driver_cassandra_parse_connect_string(struct cassandra_db *db,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 const char *connect_string)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 {
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
470 const char *const *args, *key, *value, *error;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 string_t *hosts = t_str_new(64);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
472 bool read_fallback_set = FALSE, write_fallback_set = FALSE, delete_fallback_set = FALSE;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
474 db->log_level = CASS_LOG_WARN;
19048
7648b127ca37 cassandra: Changed default consistency levels to local-quorum.
Timo Sirainen <tss@iki.fi>
parents: 19047
diff changeset
475 db->read_consistency = CASS_CONSISTENCY_LOCAL_QUORUM;
7648b127ca37 cassandra: Changed default consistency levels to local-quorum.
Timo Sirainen <tss@iki.fi>
parents: 19047
diff changeset
476 db->write_consistency = CASS_CONSISTENCY_LOCAL_QUORUM;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
477 db->delete_consistency = CASS_CONSISTENCY_LOCAL_QUORUM;
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
478 db->connect_timeout_secs = SQL_CONNECT_TIMEOUT_SECS;
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
479 db->request_timeout_secs = SQL_QUERY_TIMEOUT_SECS;
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
480 db->warn_timeout_secs = CASS_QUERY_DEFAULT_WARN_TIMEOUT_SECS;
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
481
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 args = t_strsplit_spaces(connect_string, " ");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 for (; *args != NULL; args++) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 value = strchr(*args, '=');
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 if (value == NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 i_fatal("cassandra: Missing value in connect string: %s",
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 *args);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 key = t_strdup_until(*args, value++);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 if (strcmp(key, "host") == 0) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 if (str_len(hosts) > 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 str_append_c(hosts, ',');
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 str_append(hosts, value);
19743
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
495 } else if (strcmp(key, "port") == 0) {
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
496 if (net_str2port(value, &db->port) < 0)
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
497 i_fatal("cassandra: Invalid port: %s", value);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 } else if (strcmp(key, "dbname") == 0 ||
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 strcmp(key, "keyspace") == 0) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 i_free(db->keyspace);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 db->keyspace = i_strdup(value);
20046
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
502 } else if (strcmp(key, "user") == 0) {
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
503 i_free(db->user);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
504 db->user = i_strdup(value);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
505 } else if (strcmp(key, "password") == 0) {
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
506 i_free(db->password);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
507 db->password = i_strdup(value);
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
508 } else if (strcmp(key, "read_consistency") == 0) {
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
509 if (consistency_parse(value, &db->read_consistency) < 0)
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
510 i_fatal("cassandra: Unknown read_consistency: %s", value);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
511 } else if (strcmp(key, "read_fallback_consistency") == 0) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
512 if (consistency_parse(value, &db->read_fallback_consistency) < 0)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
513 i_fatal("cassandra: Unknown read_fallback_consistency: %s", value);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
514 read_fallback_set = TRUE;
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
515 } else if (strcmp(key, "write_consistency") == 0) {
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
516 if (consistency_parse(value, &db->write_consistency) < 0)
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
517 i_fatal("cassandra: Unknown write_consistency: %s", value);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
518 } else if (strcmp(key, "write_fallback_consistency") == 0) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
519 if (consistency_parse(value, &db->write_fallback_consistency) < 0)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
520 i_fatal("cassandra: Unknown write_fallback_consistency: %s", value);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
521 write_fallback_set = TRUE;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
522 } else if (strcmp(key, "delete_consistency") == 0) {
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
523 if (consistency_parse(value, &db->delete_consistency) < 0)
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
524 i_fatal("cassandra: Unknown delete_consistency: %s", value);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
525 } else if (strcmp(key, "delete_fallback_consistency") == 0) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
526 if (consistency_parse(value, &db->delete_fallback_consistency) < 0)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
527 i_fatal("cassandra: Unknown delete_fallback_consistency: %s", value);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
528 delete_fallback_set = TRUE;
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
529 } else if (strcmp(key, "log_level") == 0) {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
530 if (log_level_parse(value, &db->log_level) < 0)
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
531 i_fatal("cassandra: Unknown log_level: %s", value);
20483
80e064878fab cassandra: Added debug_queries connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20482
diff changeset
532 } else if (strcmp(key, "debug_queries") == 0) {
80e064878fab cassandra: Added debug_queries connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20482
diff changeset
533 db->debug_queries = TRUE;
20834
426ae3e75ca5 cassandra: Added latency_aware_routing connect-parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20529
diff changeset
534 } else if (strcmp(key, "latency_aware_routing") == 0) {
426ae3e75ca5 cassandra: Added latency_aware_routing connect-parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20529
diff changeset
535 db->latency_aware_routing = TRUE;
19218
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
536 } else if (strcmp(key, "version") == 0) {
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
537 if (str_to_uint(value, &db->protocol_version) < 0)
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
538 i_fatal("cassandra: Invalid version: %s", value);
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
539 } else if (strcmp(key, "num_threads") == 0) {
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
540 if (str_to_uint(value, &db->num_threads) < 0)
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
541 i_fatal("cassandra: Invalid num_threads: %s", value);
21384
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
542 } else if (strcmp(key, "heartbeat_interval") == 0) {
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
543 if (settings_get_time(value, &db->heartbeat_interval_secs, &error) < 0)
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
544 i_fatal("cassandra: Invalid heartbeat_interval '%s': %s", value, error);
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
545 } else if (strcmp(key, "idle_timeout") == 0) {
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
546 if (settings_get_time(value, &db->idle_timeout_secs, &error) < 0)
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
547 i_fatal("cassandra: Invalid idle_timeout '%s': %s", value, error);
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
548 } else if (strcmp(key, "connect_timeout") == 0) {
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
549 if (settings_get_time(value, &db->connect_timeout_secs, &error) < 0)
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
550 i_fatal("cassandra: Invalid connect_timeout '%s': %s", value, error);
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
551 } else if (strcmp(key, "request_timeout") == 0) {
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
552 if (settings_get_time(value, &db->request_timeout_secs, &error) < 0)
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
553 i_fatal("cassandra: Invalid request_timeout '%s': %s", value, error);
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
554 } else if (strcmp(key, "warn_timeout") == 0) {
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
555 if (settings_get_time(value, &db->warn_timeout_secs, &error) < 0)
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
556 i_fatal("cassandra: Invalid warn_timeout '%s': %s", value, error);
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
557 } else if (strcmp(key, "metrics") == 0) {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
558 i_free(db->metrics_path);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
559 db->metrics_path = i_strdup(value);
21531
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
560 } else if (strcmp(key, "execution_retry_interval") == 0) {
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
561 if (settings_get_time_msecs(value, &db->execution_retry_interval_msecs, &error) < 0)
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
562 i_fatal("cassandra: Invalid execution_retry_interval '%s': %s", value, error);
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
563 #ifndef HAVE_CASSANDRA_SPECULATIVE_POLICY
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
564 i_fatal("cassandra: This cassandra version does not support execution_retry_interval");
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
565 #endif
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
566 } else if (strcmp(key, "execution_retry_times") == 0) {
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
567 if (str_to_uint(value, &db->execution_retry_times) < 0)
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
568 i_fatal("cassandra: Invalid execution_retry_times %s", value);
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
569 #ifndef HAVE_CASSANDRA_SPECULATIVE_POLICY
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
570 i_fatal("cassandra: This cassandra version does not support execution_retry_times");
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
571 #endif
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
572 } else if (strcmp(key, "page_size") == 0) {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
573 if (str_to_uint(value, &db->page_size) < 0)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
574 i_fatal("cassandra: Invalid page_size: %s", value);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 } else {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 i_fatal("cassandra: Unknown connect string: %s", key);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
580 if (!read_fallback_set)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
581 db->read_fallback_consistency = db->read_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
582 if (!write_fallback_set)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
583 db->write_fallback_consistency = db->write_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
584 if (!delete_fallback_set)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
585 db->delete_fallback_consistency = db->delete_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
586
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 if (str_len(hosts) == 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 i_fatal("cassandra: No hosts given in connect string");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 if (db->keyspace == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 i_fatal("cassandra: No dbname given in connect string");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 db->hosts = i_strdup(str_c(hosts));
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
594 static void
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
595 driver_cassandra_get_metrics_json(struct cassandra_db *db, string_t *dest)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
596 {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
597 #define ADD_UINT64(_struct, _field) \
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
598 str_printfa(dest, "\""#_field"\": %llu,", (unsigned long long)metrics._struct._field);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
599 #define ADD_DOUBLE(_struct, _field) \
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
600 str_printfa(dest, "\""#_field"\": %02lf,", metrics._struct._field);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
601 CassMetrics metrics;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
602
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
603 cass_session_get_metrics(db->session, &metrics);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
604 str_append(dest, "{ \"requests\": {");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
605 ADD_UINT64(requests, min);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
606 ADD_UINT64(requests, max);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
607 ADD_UINT64(requests, mean);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
608 ADD_UINT64(requests, stddev);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
609 ADD_UINT64(requests, median);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
610 ADD_UINT64(requests, percentile_75th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
611 ADD_UINT64(requests, percentile_95th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
612 ADD_UINT64(requests, percentile_98th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
613 ADD_UINT64(requests, percentile_99th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
614 ADD_UINT64(requests, percentile_999th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
615 ADD_DOUBLE(requests, mean_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
616 ADD_DOUBLE(requests, one_minute_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
617 ADD_DOUBLE(requests, five_minute_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
618 ADD_DOUBLE(requests, fifteen_minute_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
619 str_truncate(dest, str_len(dest)-1);
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
620
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
621 str_append(dest, "}, \"stats\": {");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
622 ADD_UINT64(stats, total_connections);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
623 ADD_UINT64(stats, available_connections);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
624 ADD_UINT64(stats, exceeded_pending_requests_water_mark);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
625 ADD_UINT64(stats, exceeded_write_bytes_water_mark);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
626 str_truncate(dest, str_len(dest)-1);
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
627
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
628 str_append(dest, "}, \"errors\": {");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
629 ADD_UINT64(errors, connection_timeouts);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
630 ADD_UINT64(errors, pending_request_timeouts);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
631 ADD_UINT64(errors, request_timeouts);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
632 str_truncate(dest, str_len(dest)-1);
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
633
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
634 str_append(dest, "}, \"queries\": {");
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
635 for (unsigned int i = 0; i < CASSANDRA_COUNTER_COUNT; i++) {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
636 str_printfa(dest, "\"%s\": %llu,", counter_names[i],
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
637 (unsigned long long)db->counters[i]);
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
638 }
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
639 str_truncate(dest, str_len(dest)-1);
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
640 str_append(dest, "}}");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
641 }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
642
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
643 static void driver_cassandra_metrics_write(struct cassandra_db *db)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
644 {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
645 struct var_expand_table tab[] = {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
646 { '\0', NULL, NULL }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
647 };
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
648 string_t *path = t_str_new(64);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
649 string_t *data;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
650 int fd;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
651
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
652 var_expand(path, db->metrics_path, tab);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
653
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
654 fd = open(str_c(path), O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, 0600);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
655 if (fd == -1) {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
656 i_error("creat(%s) failed: %m", str_c(path));
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
657 return;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
658 }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
659 data = t_str_new(1024);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
660 driver_cassandra_get_metrics_json(db, data);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
661 if (write_full(fd, str_data(data), str_len(data)) < 0)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
662 i_error("write(%s) failed: %m", str_c(path));
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
663 i_close_fd(&fd);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
664 }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
665
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 static struct sql_db *driver_cassandra_init_v(const char *connect_string)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 struct cassandra_db *db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 db = i_new(struct cassandra_db, 1);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671 db->api = driver_cassandra_db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 db->fd_pipe[0] = db->fd_pipe[1] = -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674 T_BEGIN {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 driver_cassandra_parse_connect_string(db, connect_string);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 } T_END;
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
677 cass_log_set_level(db->log_level);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678
22531
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
679 if (db->protocol_version > 0 && db->protocol_version < 4) {
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
680 /* binding with column indexes requires v4 */
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
681 db->api.v.prepared_statement_init = NULL;
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
682 db->api.v.prepared_statement_deinit = NULL;
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
683 db->api.v.statement_init_prepared = NULL;
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
684 }
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
685
19219
8183663ad7c0 cassandra: copy&paste mistake - use monotonic timestamp generator, not server side..
Timo Sirainen <tss@iki.fi>
parents: 19218
diff changeset
686 db->timestamp_gen = cass_timestamp_gen_monotonic_new();
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 db->cluster = cass_cluster_new();
19216
1e4d2306f1f3 cassandra: Use a local monotonic timestamp generator.
Timo Sirainen <tss@iki.fi>
parents: 19153
diff changeset
688 cass_cluster_set_timestamp_gen(db->cluster, db->timestamp_gen);
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
689 cass_cluster_set_connect_timeout(db->cluster, db->connect_timeout_secs * 1000);
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
690 cass_cluster_set_request_timeout(db->cluster, db->request_timeout_secs * 1000);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 cass_cluster_set_contact_points(db->cluster, db->hosts);
20046
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
692 if (db->user != NULL && db->password != NULL)
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
693 cass_cluster_set_credentials(db->cluster, db->user, db->password);
19743
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
694 if (db->port != 0)
26c805d628f8 lib-sql: Allow port to be configured for Cassandra cluster
Michael M Slusarz <michael.slusarz@dovecot.fi>
parents: 19552
diff changeset
695 cass_cluster_set_port(db->cluster, db->port);
19218
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
696 if (db->protocol_version != 0)
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
697 cass_cluster_set_protocol_version(db->cluster, db->protocol_version);
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
698 if (db->num_threads != 0)
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
699 cass_cluster_set_num_threads_io(db->cluster, db->num_threads);
20834
426ae3e75ca5 cassandra: Added latency_aware_routing connect-parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20529
diff changeset
700 if (db->latency_aware_routing)
20999
dbcc7ae05ad0 Compiler warning fixes with -Wstrict-bool
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20834
diff changeset
701 cass_cluster_set_latency_aware_routing(db->cluster, cass_true);
21384
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
702 if (db->heartbeat_interval_secs != 0)
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
703 cass_cluster_set_connection_heartbeat_interval(db->cluster, db->heartbeat_interval_secs);
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
704 if (db->idle_timeout_secs != 0)
f0f626fbfc55 cassandra: Support configuring heartbeat_interval and idle_timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21383
diff changeset
705 cass_cluster_set_connection_idle_timeout(db->cluster, db->idle_timeout_secs);
21531
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
706 #ifdef HAVE_CASSANDRA_SPECULATIVE_POLICY
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
707 if (db->execution_retry_times > 0 && db->execution_retry_interval_msecs > 0)
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
708 cass_cluster_set_constant_speculative_execution_policy(db->cluster, db->execution_retry_interval_msecs, db->execution_retry_times);
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
709 #endif
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 db->session = cass_session_new();
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
711 if (db->metrics_path != NULL)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
712 db->to_metrics = timeout_add(1000, driver_cassandra_metrics_write, db);
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
713 i_array_init(&db->results, 16);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 i_array_init(&db->callbacks, 16);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
715 i_array_init(&db->pending_prepares, 16);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 return &db->api;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 static void driver_cassandra_deinit_v(struct sql_db *_db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 struct cassandra_db *db = (struct cassandra_db *)_db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
723 driver_cassandra_close(db, "Deinitialized");
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 i_assert(array_count(&db->callbacks) == 0);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 array_free(&db->callbacks);
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
727 i_assert(array_count(&db->results) == 0);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
728 array_free(&db->results);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
729 i_assert(array_count(&db->pending_prepares) == 0);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
730 array_free(&db->pending_prepares);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 cass_session_free(db->session);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 cass_cluster_free(db->cluster);
19216
1e4d2306f1f3 cassandra: Use a local monotonic timestamp generator.
Timo Sirainen <tss@iki.fi>
parents: 19153
diff changeset
734 cass_timestamp_gen_free(db->timestamp_gen);
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
735 if (db->to_metrics != NULL)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
736 timeout_remove(&db->to_metrics);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
737 i_free(db->metrics_path);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738 i_free(db->hosts);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 i_free(db->error);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 i_free(db->keyspace);
20046
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
741 i_free(db->user);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
742 i_free(db->password);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 array_free(&_db->module_contexts);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 i_free(db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
747 static void driver_cassandra_result_unlink(struct cassandra_db *db,
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
748 struct cassandra_result *result)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 {
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
750 struct cassandra_result *const *results;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
751 unsigned int i, count;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
753 results = array_get(&db->results, &count);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
754 for (i = 0; i < count; i++) {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
755 if (results[i] == result) {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
756 array_delete(&db->results, i, 1);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
757 return;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
758 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
759 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
760 i_unreached();
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
763 static void driver_cassandra_log_result(struct cassandra_result *result,
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
764 bool all_pages, long long reply_usecs)
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
765 {
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
766 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
767 struct timeval now;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
768 unsigned int row_count;
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
769
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
770 if (db->log_level < CASS_LOG_DEBUG && !db->debug_queries &&
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
771 reply_usecs/1000000 < db->warn_timeout_secs)
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
772 return;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
773
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
774 if (gettimeofday(&now, NULL) < 0)
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
775 i_fatal("gettimeofday() failed: %m");
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
776
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
777 string_t *str = t_str_new(128);
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
778 str_printfa(str, "cassandra: Finished %squery '%s' (",
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
779 result->is_prepared ? "prepared " : "", result->query);
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
780 if (all_pages) {
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
781 str_printfa(str, "%u pages in total, ", result->page_num);
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
782 row_count = result->total_row_count;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
783 } else {
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
784 if (result->page_num > 0 || result->paging_continues)
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
785 str_printfa(str, "page %u, ", result->page_num);
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
786 row_count = result->row_count;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
787 }
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
788 str_printfa(str, "%u rows, %lld+%lld us): %s", row_count, reply_usecs,
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
789 timeval_diff_usecs(&now, &result->finish_time),
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
790 result->error != NULL ? result->error : "success");
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
791
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
792 if (reply_usecs/1000000 >= db->warn_timeout_secs) {
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
793 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_SLOW]++;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
794 i_warning("%s", str_c(str));
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
795 } else {
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
796 i_debug("%s", str_c(str));
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
797 }
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
798 }
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
799
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 static void driver_cassandra_result_free(struct sql_result *_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802 struct cassandra_db *db = (struct cassandra_db *)_result->db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803 struct cassandra_result *result = (struct cassandra_result *)_result;
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
804 long long reply_usecs;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805
19056
97ff15e9a7fd lib-sql: sql_result.free() should never be reached from the query callback.
Timo Sirainen <tss@iki.fi>
parents: 19048
diff changeset
806 i_assert(!result->api.callback);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
807 i_assert(result->callback == NULL);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
808
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 if (_result == db->sync_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810 db->sync_result = NULL;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
812 reply_usecs = timeval_diff_usecs(&result->finish_time, &result->start_time);
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
813 driver_cassandra_log_result(result, FALSE, reply_usecs);
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
814
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
815 if (result->page_num > 0 && !result->paging_continues) {
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
816 /* Multi-page query finishes now. Log a debug/warning summary
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
817 message about it separate from the per-page messages. */
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
818 reply_usecs = timeval_diff_usecs(&result->finish_time,
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
819 &result->page0_start_time);
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
820 driver_cassandra_log_result(result, TRUE, reply_usecs);
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
821 }
19152
ffb377cccd22 cassandra: With debugging, log also how long result was used for before it was freed.
Timo Sirainen <tss@iki.fi>
parents: 19151
diff changeset
822
18833
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
823 if (result->result != NULL)
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
824 cass_result_free(result->result);
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
825 if (result->iterator != NULL)
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
826 cass_iterator_free(result->iterator);
19151
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
827 if (result->statement != NULL)
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
828 cass_statement_free(result->statement);
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
829 if (result->row_pool != NULL)
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
830 pool_unref(&result->row_pool);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 i_free(result->query);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 i_free(result->error);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 i_free(result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
834 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 static void result_finish(struct cassandra_result *result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 bool free_result = TRUE;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 result->finished = TRUE;
19152
ffb377cccd22 cassandra: With debugging, log also how long result was used for before it was freed.
Timo Sirainen <tss@iki.fi>
parents: 19151
diff changeset
842 result->finish_time = ioloop_timeval;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
843 driver_cassandra_result_unlink(db, result);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844
18834
42cdfb0153d9 cassandra: Added extra asserts and sanity checks to make sure query errors are caught.
Timo Sirainen <tss@iki.fi>
parents: 18833
diff changeset
845 i_assert((result->error != NULL) == (result->iterator == NULL));
42cdfb0153d9 cassandra: Added extra asserts and sanity checks to make sure query errors are caught.
Timo Sirainen <tss@iki.fi>
parents: 18833
diff changeset
846
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847 result->api.callback = TRUE;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 T_BEGIN {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849 result->callback(&result->api, result->context);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850 } T_END;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 result->api.callback = FALSE;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 free_result = db->sync_result != &result->api;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 if (db->ioloop != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855 io_loop_stop(db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856
19057
0770ab82703d lib-sql: Debugging help - Added assert before clearing sql_result.callback.
Timo Sirainen <tss@iki.fi>
parents: 19056
diff changeset
857 i_assert(!free_result || result->api.refcount > 0);
0770ab82703d lib-sql: Debugging help - Added assert before clearing sql_result.callback.
Timo Sirainen <tss@iki.fi>
parents: 19056
diff changeset
858 result->callback = NULL;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 if (free_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 sql_result_unref(&result->api);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
863 static void query_resend_with_fallback(struct cassandra_result *result)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
864 {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
865 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
866 time_t last_warning =
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
867 ioloop_time - db->last_fallback_warning[result->query_type];
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
868
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
869 if (last_warning >= CASSANDRA_FALLBACK_WARN_INTERVAL_SECS) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
870 i_warning("%s - retrying future %s queries with consistency %s (instead of %s)",
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
871 result->error, cassandra_query_type_names[result->query_type],
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
872 cass_consistency_string(result->fallback_consistency),
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
873 cass_consistency_string(result->consistency));
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
874 db->last_fallback_warning[result->query_type] = ioloop_time;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
875 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
876 i_free_and_null(result->error);
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
877 db->fallback_failures[result->query_type]++;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
878
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
879 result->consistency = result->fallback_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
880 driver_cassandra_result_send_query(result);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
881 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
882
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
883 static void counters_inc_error(struct cassandra_db *db, CassError error)
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
884 {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
885 switch (error) {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
886 case CASS_ERROR_LIB_NO_HOSTS_AVAILABLE:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
887 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_NO_HOSTS]++;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
888 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
889 case CASS_ERROR_LIB_REQUEST_QUEUE_FULL:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
890 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_QUEUE_FULL]++;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
891 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
892 case CASS_ERROR_LIB_REQUEST_TIMED_OUT:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
893 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_CLIENT_TIMEOUT]++;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
894 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
895 case CASS_ERROR_SERVER_WRITE_TIMEOUT:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
896 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_SERVER_TIMEOUT]++;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
897 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
898 case CASS_ERROR_SERVER_UNAVAILABLE:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
899 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_SERVER_UNAVAILABLE]++;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
900 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
901 default:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
902 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_ERR_OTHER]++;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
903 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
904 }
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
905 }
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
906
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
907 static void query_callback(CassFuture *future, void *context)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
908 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 struct cassandra_result *result = context;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
910 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
911 CassError error = cass_future_error_code(future);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
913 if (error != CASS_OK) {
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
914 const char *errmsg;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915 size_t errsize;
20482
bde406ffe5b2 cassandra: If query fails, include how long the reply took in the error message.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20481
diff changeset
916 int msecs;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918 cass_future_error_message(future, &errmsg, &errsize);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 i_free(result->error);
20482
bde406ffe5b2 cassandra: If query fails, include how long the reply took in the error message.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20481
diff changeset
920
bde406ffe5b2 cassandra: If query fails, include how long the reply took in the error message.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20481
diff changeset
921 msecs = timeval_diff_msecs(&ioloop_timeval, &result->start_time);
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
922 counters_inc_error(db, error);
21740
3ce8158b7fd5 cassandra: Treat CASS_ERROR_SERVER_UNAVAILABLE as "write success is uncertain"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21652
diff changeset
923 /* Timeouts bring uncertainty whether the query succeeded or
3ce8158b7fd5 cassandra: Treat CASS_ERROR_SERVER_UNAVAILABLE as "write success is uncertain"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21652
diff changeset
924 not. Also _SERVER_UNAVAILABLE could have actually written
3ce8158b7fd5 cassandra: Treat CASS_ERROR_SERVER_UNAVAILABLE as "write success is uncertain"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21652
diff changeset
925 enough copies of the data for the query to succeed. */
21272
1be2f1e78975 cassandra: Treat "Request timed out" also as SQL_RESULT_ERROR_TYPE_WRITE_UNCERTAIN
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20999
diff changeset
926 result->api.error_type = error == CASS_ERROR_SERVER_WRITE_TIMEOUT ||
21740
3ce8158b7fd5 cassandra: Treat CASS_ERROR_SERVER_UNAVAILABLE as "write success is uncertain"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21652
diff changeset
927 error == CASS_ERROR_SERVER_UNAVAILABLE ||
21272
1be2f1e78975 cassandra: Treat "Request timed out" also as SQL_RESULT_ERROR_TYPE_WRITE_UNCERTAIN
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20999
diff changeset
928 error == CASS_ERROR_LIB_REQUEST_TIMED_OUT ?
20527
231c1f214d40 cassandra: Support returning SQL_RESULT_ERROR_TYPE_WRITE_UNCERTAIN
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20483
diff changeset
929 SQL_RESULT_ERROR_TYPE_WRITE_UNCERTAIN :
231c1f214d40 cassandra: Support returning SQL_RESULT_ERROR_TYPE_WRITE_UNCERTAIN
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20483
diff changeset
930 SQL_RESULT_ERROR_TYPE_UNKNOWN;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
931 result->error = i_strdup_printf("Query '%s' failed: %.*s (in %u.%03u secs%s)",
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
932 result->query, (int)errsize, errmsg, msecs/1000, msecs%1000,
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
933 result->page_num == 0 ? "" : t_strdup_printf(", page %u", result->page_num));
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
934
20306
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
935 /* unavailable = cassandra server knows that there aren't
21740
3ce8158b7fd5 cassandra: Treat CASS_ERROR_SERVER_UNAVAILABLE as "write success is uncertain"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21652
diff changeset
936 enough nodes available. "All hosts in current policy
3ce8158b7fd5 cassandra: Treat CASS_ERROR_SERVER_UNAVAILABLE as "write success is uncertain"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21652
diff changeset
937 attempted and were either unavailable or failed"
20306
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
938
21972
1ea4631afc59 cassandra: Use fallback consistency for CASS_ERROR_LIB_NO_HOSTS_AVAILABLE errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21844
diff changeset
939 no hosts available = The client library couldn't connect to
1ea4631afc59 cassandra: Use fallback consistency for CASS_ERROR_LIB_NO_HOSTS_AVAILABLE errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21844
diff changeset
940 enough cassanra nodes. Error message is the same as for
1ea4631afc59 cassandra: Use fallback consistency for CASS_ERROR_LIB_NO_HOSTS_AVAILABLE errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21844
diff changeset
941 "unavailable".
1ea4631afc59 cassandra: Use fallback consistency for CASS_ERROR_LIB_NO_HOSTS_AVAILABLE errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21844
diff changeset
942
20306
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
943 write timeout = cassandra server couldn't reach all the
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
944 needed nodes. this may be because it hasn't yet detected
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
945 that the servers are down, or because the servers are just
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
946 too busy. we'll try the fallback consistency to avoid
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
947 unnecessary temporary errors. */
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
948 if ((error == CASS_ERROR_SERVER_UNAVAILABLE ||
21972
1ea4631afc59 cassandra: Use fallback consistency for CASS_ERROR_LIB_NO_HOSTS_AVAILABLE errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21844
diff changeset
949 error == CASS_ERROR_LIB_NO_HOSTS_AVAILABLE ||
20306
2417b436d73c cassandra: Try fallback_consistency also for write timeout failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20202
diff changeset
950 error == CASS_ERROR_SERVER_WRITE_TIMEOUT) &&
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
951 result->fallback_consistency != result->consistency) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
952 /* retry with fallback consistency */
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
953 query_resend_with_fallback(result);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
954 return;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
955 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
956 result_finish(result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
957 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 }
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
959 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_RECV_OK]++;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
960
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
961 if (result->fallback_consistency != result->consistency) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
962 /* non-fallback query finished successfully. if there had been
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
963 any fallbacks, reset them. */
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
964 db->fallback_failures[result->query_type] = 0;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
965 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
966
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
967 result->result = cass_future_get_result(future);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
968 result->iterator = cass_iterator_from_result(result->result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
969 result_finish(result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
970 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
971
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
972 static void driver_cassandra_init_statement(struct cassandra_result *result)
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
973 {
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
974 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
975
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
976 cass_statement_set_consistency(result->statement, result->consistency);
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
977
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
978 #ifdef HAVE_CASSANDRA_SPECULATIVE_POLICY
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
979 cass_statement_set_is_idempotent(result->statement, cass_true);
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
980 #endif
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
981 if (db->page_size > 0)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
982 cass_statement_set_paging_size(result->statement, db->page_size);
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
983 }
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
984
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
985 static void driver_cassandra_result_send_query(struct cassandra_result *result)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
986 {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
987 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
988 CassFuture *future;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
989
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
990 i_assert(result->statement != NULL);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
991
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
992 db->counters[CASSANDRA_COUNTER_TYPE_QUERY_SENT]++;
22532
10d5c2886b60 cassandra: Fix paged queries to work again
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22531
diff changeset
993 if (result->query_type != CASSANDRA_QUERY_TYPE_READ_MORE)
10d5c2886b60 cassandra: Fix paged queries to work again
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22531
diff changeset
994 driver_cassandra_init_statement(result);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
995
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
996 future = cass_session_execute(db->session, result->statement);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
997 driver_cassandra_set_callback(future, db, query_callback, result);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
998 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
999
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1000 static bool
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1001 driver_cassandra_want_fallback_query(struct cassandra_result *result)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1002 {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1003 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1004 unsigned int failure_count = db->fallback_failures[result->query_type];
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1005 unsigned int i, msecs = CASSANDRA_FALLBACK_FIRST_RETRY_MSECS;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1006 struct timeval tv;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1007
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1008 if (failure_count == 0)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1009 return FALSE;
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1010 /* double the retries every time. */
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1011 for (i = 1; i < failure_count; i++) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1012 msecs *= 2;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1013 if (msecs >= CASSANDRA_FALLBACK_MAX_RETRY_MSECS) {
21828
8d30f9e1dcc3 cassandra: Fallback consistency fix - max retry interval was set wrong
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21740
diff changeset
1014 msecs = CASSANDRA_FALLBACK_MAX_RETRY_MSECS;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1015 break;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1016 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1017 }
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1018 /* If last primary query sent timestamp + msecs is older than current
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1019 time, we need to retry the primary query. Note that this practically
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1020 prevents multiple primary queries from being attempted
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1021 simultaneously, because the caller updates primary_query_last_sent
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1022 immediately when returning.
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1023
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1024 The only time when multiple primary queries can be running in
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1025 parallel is when the earlier query is being slow and hasn't finished
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1026 early enough. This could even be a wanted feature, since while the
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1027 first query might have to wait for a timeout, Cassandra could have
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1028 been fixed in the meantime and the second query finishes
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1029 successfully. */
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1030 tv = db->primary_query_last_sent[result->query_type];
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1031 timeval_add_msecs(&tv, msecs);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1032 return timeval_cmp(&ioloop_timeval, &tv) < 0;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1033 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1034
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1035 static int driver_cassandra_send_query(struct cassandra_result *result)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1036 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1037 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1038 int ret;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1039
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1040 if (!SQL_DB_IS_READY(&db->api)) {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1041 if ((ret = sql_connect(&db->api)) <= 0) {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1042 if (ret < 0)
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1043 driver_cassandra_close(db, "Couldn't connect to Cassandra");
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1044 return ret;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1045 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1046 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1047
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1048 if (result->page0_start_time.tv_sec == 0)
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1049 result->page0_start_time = ioloop_timeval;
19150
a72a65771d8c cassandra: If log_level=debug, log also how long the queries take.
Timo Sirainen <tss@iki.fi>
parents: 19146
diff changeset
1050 result->start_time = ioloop_timeval;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1051 result->row_pool = pool_alloconly_create("cassandra result", 512);
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1052 switch (result->query_type) {
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1053 case CASSANDRA_QUERY_TYPE_READ:
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1054 result->consistency = db->read_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1055 result->fallback_consistency = db->read_fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1056 break;
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1057 case CASSANDRA_QUERY_TYPE_READ_MORE:
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1058 /* consistency is already set and we don't want to fallback
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1059 at this point anymore. */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1060 result->fallback_consistency = result->consistency;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1061 break;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1062 case CASSANDRA_QUERY_TYPE_WRITE:
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1063 result->consistency = db->write_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1064 result->fallback_consistency = db->write_fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1065 break;
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1066 case CASSANDRA_QUERY_TYPE_DELETE:
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1067 result->consistency = db->delete_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1068 result->fallback_consistency = db->delete_fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1069 break;
22368
faadf17a3baa cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22358
diff changeset
1070 case CASSANDRA_QUERY_TYPE_COUNT:
faadf17a3baa cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22358
diff changeset
1071 i_unreached();
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1072 }
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1073
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1074 if (driver_cassandra_want_fallback_query(result))
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1075 result->consistency = result->fallback_consistency;
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1076 else
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1077 db->primary_query_last_sent[result->query_type] = ioloop_timeval;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1078
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1079 driver_cassandra_result_send_query(result);
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1080 result->query_sent = TRUE;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1081 return 1;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1082 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1084 static void driver_cassandra_send_queries(struct cassandra_db *db)
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1085 {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1086 struct cassandra_result *const *results;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1087 unsigned int i, count;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1088
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1089 results = array_get(&db->results, &count);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1090 for (i = 0; i < count; i++) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1091 if (!results[i]->query_sent && results[i]->statement != NULL) {
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1092 if (driver_cassandra_send_query(results[i]) <= 0)
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1093 break;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1094 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1095 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1096 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1097
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1098 static void exec_callback(struct sql_result *_result ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1099 void *context ATTR_UNUSED)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1100 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1101 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1102
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1103 static struct cassandra_result *
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1104 driver_cassandra_query_init(struct cassandra_db *db, const char *query,
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1105 enum cassandra_query_type query_type,
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1106 bool is_prepared,
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1107 sql_query_callback_t *callback, void *context)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1108 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1109 struct cassandra_result *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1110
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1111 result = i_new(struct cassandra_result, 1);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1112 result->api = driver_cassandra_result;
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1113 result->api.db = &db->api;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1114 result->api.refcount = 1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1115 result->callback = callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1116 result->context = context;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1117 result->query_type = query_type;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1118 result->query = i_strdup(query);
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1119 result->is_prepared = is_prepared;
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1120 array_append(&db->results, &result, 1);
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1121 return result;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1122 }
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1123
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1124 static void
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1125 driver_cassandra_query_full(struct sql_db *_db, const char *query,
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1126 enum cassandra_query_type query_type,
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1127 sql_query_callback_t *callback, void *context)
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1128 {
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1129 struct cassandra_db *db = (struct cassandra_db *)_db;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1130 struct cassandra_result *result;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1131
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1132 result = driver_cassandra_query_init(db, query, query_type, FALSE,
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1133 callback, context);
22529
7b17f52b75b6 cassandra: Cleanup - Create statement earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22528
diff changeset
1134 result->statement = cass_statement_new(query, 0);
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1135 (void)driver_cassandra_send_query(result);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1136 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1137
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1138 static void driver_cassandra_exec(struct sql_db *db, const char *query)
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1139 {
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1140 driver_cassandra_query_full(db, query, CASSANDRA_QUERY_TYPE_WRITE, exec_callback, NULL);
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1141 }
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1142
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1143 static void driver_cassandra_query(struct sql_db *db, const char *query,
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1144 sql_query_callback_t *callback, void *context)
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1145 {
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1146 driver_cassandra_query_full(db, query, CASSANDRA_QUERY_TYPE_READ, callback, context);
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1147 }
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1148
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1149 static void cassandra_query_s_callback(struct sql_result *result, void *context)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1150 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1151 struct cassandra_db *db = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1152
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1153 db->sync_result = result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1154 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1155
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1156 static void driver_cassandra_sync_init(struct cassandra_db *db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1157 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1158 if (sql_connect(&db->api) < 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1159 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1160 db->orig_ioloop = current_ioloop;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1161 db->ioloop = io_loop_create();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1162 if (IS_CONNECTED(db))
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1163 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1164 i_assert(db->api.state == SQL_DB_STATE_CONNECTING);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1165
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1166 db->io_pipe = io_loop_move_io(&db->io_pipe);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1167 /* wait for connecting to finish */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1168 io_loop_run(db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1169 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1170
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1171 static void driver_cassandra_sync_deinit(struct cassandra_db *db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1172 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1173 if (db->orig_ioloop == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1174 return;
18648
d71fa3ae930f lib-sql: Don't crash in Cassandra if connection to it failed.
Timo Sirainen <tss@iki.fi>
parents: 18640
diff changeset
1175 if (db->io_pipe != NULL) {
d71fa3ae930f lib-sql: Don't crash in Cassandra if connection to it failed.
Timo Sirainen <tss@iki.fi>
parents: 18640
diff changeset
1176 io_loop_set_current(db->orig_ioloop);
d71fa3ae930f lib-sql: Don't crash in Cassandra if connection to it failed.
Timo Sirainen <tss@iki.fi>
parents: 18640
diff changeset
1177 db->io_pipe = io_loop_move_io(&db->io_pipe);
d71fa3ae930f lib-sql: Don't crash in Cassandra if connection to it failed.
Timo Sirainen <tss@iki.fi>
parents: 18640
diff changeset
1178 io_loop_set_current(db->ioloop);
d71fa3ae930f lib-sql: Don't crash in Cassandra if connection to it failed.
Timo Sirainen <tss@iki.fi>
parents: 18640
diff changeset
1179 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1180 io_loop_destroy(&db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1182
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1183 static struct sql_result *
22527
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1184 driver_cassandra_sync_query(struct cassandra_db *db, const char *query,
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1185 enum cassandra_query_type query_type)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1186 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1187 struct sql_result *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1188
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1189 i_assert(db->sync_result == NULL);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1190
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1191 switch (db->api.state) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1192 case SQL_DB_STATE_CONNECTING:
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1193 case SQL_DB_STATE_BUSY:
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1194 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1195 case SQL_DB_STATE_DISCONNECTED:
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1196 sql_not_connected_result.refcount++;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1197 return &sql_not_connected_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1198 case SQL_DB_STATE_IDLE:
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1199 break;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1200 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1201
22527
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1202 driver_cassandra_query_full(&db->api, query, query_type,
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1203 cassandra_query_s_callback, db);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1204 if (db->sync_result == NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1205 db->io_pipe = io_loop_move_io(&db->io_pipe);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1206 io_loop_run(db->ioloop);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1207 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1208
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1209 result = db->sync_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1210 if (result == &sql_not_connected_result) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1211 /* we don't end up in cassandra's free function, so sync_result
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1212 won't be set to NULL if we don't do it here. */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1213 db->sync_result = NULL;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1214 } else if (result == NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1215 result = &sql_not_connected_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1216 result->refcount++;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1217 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1218 return result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1219 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1220
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1221 static struct sql_result *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1222 driver_cassandra_query_s(struct sql_db *_db, const char *query)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1223 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1224 struct cassandra_db *db = (struct cassandra_db *)_db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225 struct sql_result *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1226
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1227 driver_cassandra_sync_init(db);
22527
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1228 result = driver_cassandra_sync_query(db, query,
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1229 CASSANDRA_QUERY_TYPE_READ);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1230 driver_cassandra_sync_deinit(db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1231 return result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1232 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1233
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1234 static int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1235 driver_cassandra_get_value(struct cassandra_result *result,
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1236 const CassValue *value, const char **str_r,
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1237 size_t *len_r)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1238 {
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1239 const unsigned char *output;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1240 void *output_dup;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1241 size_t output_size;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1242 CassError rc;
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1243 const char *type;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1244
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1245 if (cass_value_is_null(value)) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1246 *str_r = NULL;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1247 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1248 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1249
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1250 switch (cass_data_type_type(cass_value_data_type(value))) {
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1251 case CASS_VALUE_TYPE_INT: {
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1252 cass_int32_t num;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1253
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1254 rc = cass_value_get_int32(value, &num);
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1255 if (rc == CASS_OK) {
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1256 const char *str = t_strdup_printf("%d", num);
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1257 output_size = strlen(str);
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1258 output = (const void *)str;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1259 }
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1260 type = "int32";
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1261 break;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1262 }
22617
655f60aa8cf2 cassandra: Support "timestamp" type fields properly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22616
diff changeset
1263 case CASS_VALUE_TYPE_TIMESTAMP:
21383
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1264 case CASS_VALUE_TYPE_BIGINT: {
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1265 cass_int64_t num;
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1266
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1267 rc = cass_value_get_int64(value, &num);
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1268 if (rc == CASS_OK) {
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1269 const char *str = t_strdup_printf("%lld", (long long)num);
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1270 output_size = strlen(str);
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1271 output = (const void *)str;
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1272 }
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1273 type = "int64";
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1274 break;
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1275 }
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1276 default:
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1277 rc = cass_value_get_bytes(value, &output, &output_size);
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1278 type = "bytes";
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1279 break;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1280 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1281 if (rc != CASS_OK) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1282 i_free(result->error);
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1283 result->error = i_strdup_printf("Couldn't get value as %s: %s",
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1284 type, cass_error_desc(rc));
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1285 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1286 }
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1287 output_dup = p_malloc(result->row_pool, output_size + 1);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1288 memcpy(output_dup, output, output_size);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1289 *str_r = output_dup;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1290 *len_r = output_size;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1291 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1292 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1293
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1294 static int driver_cassandra_result_next_page(struct cassandra_result *result)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1295 {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1296 struct cassandra_db *db = (struct cassandra_db *)result->api.db;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1297
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1298 if (db->page_size == 0) {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1299 /* no paging */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1300 return 0;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1301 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1302 if (cass_result_has_more_pages(result->result) == cass_false)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1303 return 0;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1304
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1305 /* callers that don't support sql_query_more() will still get a useful
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1306 error message. */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1307 i_free(result->error);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1308 result->error = i_strdup("Paged query has more results, but not supported by the caller");
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1309 return SQL_RESULT_NEXT_MORE;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1310 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1311
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1312 static int driver_cassandra_result_next_row(struct sql_result *_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1313 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1314 struct cassandra_result *result = (struct cassandra_result *)_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1315 const CassRow *row;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1316 const CassValue *value;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1317 const char *str;
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1318 size_t size;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1319 unsigned int i;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1320 int ret = 1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1321
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1322 if (result->iterator == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1323 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1324
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1325 if (!cass_iterator_next(result->iterator))
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1326 return driver_cassandra_result_next_page(result);
19153
7fc709a7b5a5 cassandra: With debugging, log also how many rows were iterated.
Timo Sirainen <tss@iki.fi>
parents: 19152
diff changeset
1327 result->row_count++;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1328 result->total_row_count++;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1329
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1330 p_clear(result->row_pool);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1331 p_array_init(&result->fields, result->row_pool, 8);
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1332 p_array_init(&result->field_sizes, result->row_pool, 8);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1333
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1334 row = cass_iterator_get_row(result->iterator);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1335 for (i = 0; (value = cass_row_get_column(row, i)) != NULL; i++) {
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1336 if (driver_cassandra_get_value(result, value, &str, &size) < 0) {
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1337 ret = -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1338 break;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1339 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1340 array_append(&result->fields, &str, 1);
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1341 array_append(&result->field_sizes, &size, 1);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1342 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1343 return ret;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1344 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1345
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1346 static void
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1347 driver_cassandra_result_more(struct sql_result **_result, bool async,
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1348 sql_query_callback_t *callback, void *context)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1349 {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1350 struct cassandra_db *db = (struct cassandra_db *)(*_result)->db;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1351 struct cassandra_result *new_result;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1352 struct cassandra_result *old_result =
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1353 (struct cassandra_result *)*_result;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1354
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1355 /* Initialize the next page as a new sql_result */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1356 new_result = driver_cassandra_query_init(db, old_result->query,
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1357 CASSANDRA_QUERY_TYPE_READ_MORE,
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1358 old_result->is_prepared,
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1359 callback, context);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1360
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1361 /* Preserve the statement and update its paging state */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1362 new_result->statement = old_result->statement;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1363 old_result->statement = NULL;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1364 cass_statement_set_paging_state(new_result->statement,
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1365 old_result->result);
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1366 old_result->paging_continues = TRUE;
22432
aff38b5d7f1f cassandra: Fix confusing debug logging for paged query results.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22373
diff changeset
1367 /* The caller did support paging. Clear out the "...not supported by
aff38b5d7f1f cassandra: Fix confusing debug logging for paged query results.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22373
diff changeset
1368 the caller" error text, so it won't be in the debug log output. */
aff38b5d7f1f cassandra: Fix confusing debug logging for paged query results.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22373
diff changeset
1369 i_free_and_null(old_result->error);
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1370
22532
10d5c2886b60 cassandra: Fix paged queries to work again
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22531
diff changeset
1371 new_result->consistency = old_result->consistency;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1372 new_result->page_num = old_result->page_num + 1;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1373 new_result->page0_start_time = old_result->page0_start_time;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1374 new_result->total_row_count = old_result->total_row_count;
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1375
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1376 sql_result_unref(*_result);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1377 *_result = NULL;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1378
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1379 if (async)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1380 (void)driver_cassandra_send_query(new_result);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1381 else {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1382 i_assert(db->api.state == SQL_DB_STATE_IDLE);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1383 driver_cassandra_sync_init(db);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1384 (void)driver_cassandra_send_query(new_result);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1385 if (new_result->result == NULL) {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1386 db->io_pipe = io_loop_move_io(&db->io_pipe);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1387 io_loop_run(db->ioloop);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1388 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1389 driver_cassandra_sync_deinit(db);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1390
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1391 callback(&new_result->api, context);
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1392 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1393 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1394
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1395 static unsigned int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1396 driver_cassandra_result_get_fields_count(struct sql_result *_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1397 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1398 struct cassandra_result *result = (struct cassandra_result *)_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1399
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1400 return array_count(&result->fields);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1401 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1402
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1403 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1404 driver_cassandra_result_get_field_name(struct sql_result *_result ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1405 unsigned int idx ATTR_UNUSED)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1406 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1407 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1408 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1409
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1410 static int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1411 driver_cassandra_result_find_field(struct sql_result *_result ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1412 const char *field_name ATTR_UNUSED)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1413 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1414 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1415 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1416
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1417 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1418 driver_cassandra_result_get_field_value(struct sql_result *_result,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1419 unsigned int idx)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1420 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1421 struct cassandra_result *result = (struct cassandra_result *)_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1422 const char *const *strp;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1423
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1424 strp = array_idx(&result->fields, idx);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1425 return *strp;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1426 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1427
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1428 static const unsigned char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1429 driver_cassandra_result_get_field_value_binary(struct sql_result *_result ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1430 unsigned int idx ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1431 size_t *size_r ATTR_UNUSED)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1432 {
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1433 struct cassandra_result *result = (struct cassandra_result *)_result;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1434 const char *const *strp;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1435 const size_t *sizep;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1436
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1437 strp = array_idx(&result->fields, idx);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1438 sizep = array_idx(&result->field_sizes, idx);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1439 *size_r = *sizep;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1440 return (const void *)*strp;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1441 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1442
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1443 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1444 driver_cassandra_result_find_field_value(struct sql_result *result ATTR_UNUSED,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1445 const char *field_name ATTR_UNUSED)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1446 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1447 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1448 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1449
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1450 static const char *const *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1451 driver_cassandra_result_get_values(struct sql_result *_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1452 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1453 struct cassandra_result *result = (struct cassandra_result *)_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1454
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1455 return array_idx(&result->fields, 0);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1456 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1457
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1458 static const char *driver_cassandra_result_get_error(struct sql_result *_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1459 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1460 struct cassandra_result *result = (struct cassandra_result *)_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1461
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1462 if (result->error != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1463 return result->error;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1464 return "FIXME";
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1465 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1466
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1467 static struct sql_transaction_context *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1468 driver_cassandra_transaction_begin(struct sql_db *db)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1469 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1470 struct cassandra_transaction_context *ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1471
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1472 ctx = i_new(struct cassandra_transaction_context, 1);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1473 ctx->ctx.db = db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1474 ctx->refcount = 1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1475 return &ctx->ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1476 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1477
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1478 static void
18840
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1479 driver_cassandra_transaction_unref(struct cassandra_transaction_context **_ctx)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1480 {
18840
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1481 struct cassandra_transaction_context *ctx = *_ctx;
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1482
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1483 *_ctx = NULL;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1484 i_assert(ctx->refcount > 0);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1485 if (--ctx->refcount > 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1486 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1487
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1488 i_free(ctx->query);
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1489 i_free(ctx->error);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1490 i_free(ctx);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1491 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1492
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1493 static void
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1494 transaction_set_failed(struct cassandra_transaction_context *ctx,
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1495 const char *error)
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1496 {
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1497 if (ctx->failed) {
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1498 i_assert(ctx->error != NULL);
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1499 } else {
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1500 i_assert(ctx->error == NULL);
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1501 ctx->failed = TRUE;
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1502 ctx->error = i_strdup(error);
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1503 }
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1504 }
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1505
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1506 static void
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1507 transaction_commit_callback(struct sql_result *result, void *context)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1508 {
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1509 struct cassandra_transaction_context *ctx = context;
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1510 struct sql_commit_result commit_result;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1511
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21384
diff changeset
1512 i_zero(&commit_result);
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1513 if (sql_result_next_row(result) < 0) {
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1514 commit_result.error = sql_result_get_error(result);
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1515 commit_result.error_type = sql_result_get_error_type(result);
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1516 }
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1517 ctx->callback(&commit_result, ctx->context);
18840
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1518 driver_cassandra_transaction_unref(&ctx);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1519 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1520
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1521 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1522 driver_cassandra_transaction_commit(struct sql_transaction_context *_ctx,
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1523 sql_commit2_callback_t *callback, void *context)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1524 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1525 struct cassandra_transaction_context *ctx =
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1526 (struct cassandra_transaction_context *)_ctx;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1527 struct cassandra_db *db = (struct cassandra_db *)_ctx->db;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1528 enum cassandra_query_type query_type;
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1529 struct sql_commit_result result;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1530
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21384
diff changeset
1531 i_zero(&result);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1532 ctx->callback = callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1533 ctx->context = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1534
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1535 if (ctx->failed || (ctx->query == NULL && ctx->stmt == NULL)) {
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1536 if (ctx->failed)
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1537 result.error = ctx->error;
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1538
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1539 callback(&result, context);
18840
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1540 driver_cassandra_transaction_unref(&ctx);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1541 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1542 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1543
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1544 /* just a single query, send it */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1545 const char *query = ctx->query != NULL ?
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1546 ctx->query : sql_statement_get_query(&ctx->stmt->stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1547 if (strncasecmp(query, "DELETE ", 7) == 0)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1548 query_type = CASSANDRA_QUERY_TYPE_DELETE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1549 else
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1550 query_type = CASSANDRA_QUERY_TYPE_WRITE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1551
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1552 if (ctx->query != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1553 driver_cassandra_query_full(_ctx->db, query, query_type,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1554 transaction_commit_callback, ctx);
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1555 } else {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1556 ctx->stmt->result =
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1557 driver_cassandra_query_init(db, query, query_type, TRUE,
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1558 transaction_commit_callback, ctx);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1559 if (ctx->stmt->cass_stmt == NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1560 /* wait for prepare to finish */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1561 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1562 ctx->stmt->result->statement = ctx->stmt->cass_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1563 (void)driver_cassandra_send_query(ctx->stmt->result);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1564 pool_unref(&ctx->stmt->stmt.pool);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1565 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1566 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1567 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1568
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1569 static void
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1570 driver_cassandra_try_commit_s(struct cassandra_transaction_context *ctx)
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1571 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1572 struct sql_transaction_context *_ctx = &ctx->ctx;
22527
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1573 struct cassandra_db *db = (struct cassandra_db *)_ctx->db;
18834
42cdfb0153d9 cassandra: Added extra asserts and sanity checks to make sure query errors are caught.
Timo Sirainen <tss@iki.fi>
parents: 18833
diff changeset
1574 struct sql_result *result = NULL;
22527
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1575 enum cassandra_query_type query_type;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1576
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1577 /* just a single query, send it */
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1578 if (strncasecmp(ctx->query, "DELETE ", 7) == 0)
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1579 query_type = CASSANDRA_QUERY_TYPE_DELETE;
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1580 else
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1581 query_type = CASSANDRA_QUERY_TYPE_WRITE;
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1582 driver_cassandra_sync_init(db);
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1583 result = driver_cassandra_sync_query(db, ctx->query, query_type);
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1584 driver_cassandra_sync_deinit(db);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1585
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1586 if (sql_result_next_row(result) < 0)
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1587 transaction_set_failed(ctx, sql_result_get_error(result));
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1588 sql_result_unref(result);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1589 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1590
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1591 static int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1592 driver_cassandra_transaction_commit_s(struct sql_transaction_context *_ctx,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1593 const char **error_r)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1594 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1595 struct cassandra_transaction_context *ctx =
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1596 (struct cassandra_transaction_context *)_ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1597
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1598 if (ctx->stmt != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1599 /* nothing should be using this - don't bother implementing */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1600 i_panic("cassandra: sql_transaction_commit_s() not supported for prepared statements");
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1601 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1602
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1603 if (ctx->query != NULL && !ctx->failed)
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1604 driver_cassandra_try_commit_s(ctx);
18848
47fa4a6c6b9a cassandra: Commit failures returned an already freed error string.
Timo Sirainen <tss@iki.fi>
parents: 18841
diff changeset
1605 *error_r = t_strdup(ctx->error);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1606
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1607 i_assert(ctx->refcount == 1);
18839
247c6ae2eae4 cassandra: Don't access freed memory when doing an assert-check.
Timo Sirainen <tss@iki.fi>
parents: 18835
diff changeset
1608 i_assert((*error_r != NULL) == ctx->failed);
18840
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1609 driver_cassandra_transaction_unref(&ctx);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1610 return *error_r == NULL ? 0 : -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1611 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1612
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1613 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1614 driver_cassandra_transaction_rollback(struct sql_transaction_context *_ctx)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1615 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1616 struct cassandra_transaction_context *ctx =
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1617 (struct cassandra_transaction_context *)_ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1618
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1619 i_assert(ctx->refcount == 1);
18840
34943b67e01f cassandra: Minor code cleanup to make sure we don't try to access freed transaction memory.
Timo Sirainen <tss@iki.fi>
parents: 18839
diff changeset
1620 driver_cassandra_transaction_unref(&ctx);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1621 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1622
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1623 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1624 driver_cassandra_update(struct sql_transaction_context *_ctx, const char *query,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1625 unsigned int *affected_rows)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1626 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1627 struct cassandra_transaction_context *ctx =
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1628 (struct cassandra_transaction_context *)_ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1629
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1630 i_assert(affected_rows == NULL);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1631
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1632 if (ctx->query != NULL || ctx->stmt != NULL) {
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1633 transaction_set_failed(ctx, "Multiple changes in transaction not supported");
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1634 return;
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1635 }
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1636 ctx->query = i_strdup(query);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1637 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1638
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1639 static const char *
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1640 driver_cassandra_escape_blob(struct sql_db *_db ATTR_UNUSED,
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1641 const unsigned char *data, size_t size)
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1642 {
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1643 string_t *str = t_str_new(128);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1644
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1645 str_append(str, "0x");
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1646 binary_to_hex_append(str, data, size);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1647 return str_c(str);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1648 }
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1649
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1650 static CassError
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1651 driver_cassandra_bind_int(struct cassandra_sql_statement *stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1652 unsigned int column_idx, int64_t value)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1653 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1654 const CassDataType *data_type;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1655 CassValueType value_type;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1656
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1657 i_assert(stmt->prep != NULL);
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1658
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1659 /* statements require exactly correct value type */
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1660 data_type = cass_prepared_parameter_data_type(stmt->prep->prepared, column_idx);
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1661 value_type = cass_data_type_type(data_type);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1662
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1663 switch (value_type) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1664 case CASS_VALUE_TYPE_INT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1665 if (value < -2147483648 || value > 2147483647)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1666 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1667 return cass_statement_bind_int32(stmt->cass_stmt, column_idx, value);
22617
655f60aa8cf2 cassandra: Support "timestamp" type fields properly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22616
diff changeset
1668 case CASS_VALUE_TYPE_TIMESTAMP:
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1669 case CASS_VALUE_TYPE_BIGINT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1670 return cass_statement_bind_int64(stmt->cass_stmt, column_idx, value);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1671 case CASS_VALUE_TYPE_SMALL_INT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1672 if (value < -32768 || value > 32767)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1673 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1674 return cass_statement_bind_int16(stmt->cass_stmt, column_idx, value);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1675 case CASS_VALUE_TYPE_TINY_INT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1676 if (value < -128 || value > 127)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1677 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1678 return cass_statement_bind_int8(stmt->cass_stmt, column_idx, value);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1679 default:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1680 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1681 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1682 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1683
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1684 static void prepare_finish_arg(struct cassandra_sql_statement *stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1685 const struct cassandra_sql_arg *arg)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1686 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1687 CassError rc;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1688
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1689 if (arg->value_str != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1690 rc = cass_statement_bind_string(stmt->cass_stmt, arg->column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1691 arg->value_str);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1692 } else if (arg->value_binary != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1693 rc = cass_statement_bind_bytes(stmt->cass_stmt, arg->column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1694 arg->value_binary,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1695 arg->value_binary_size);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1696 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1697 rc = driver_cassandra_bind_int(stmt, arg->column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1698 arg->value_int64);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1699 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1700 if (rc != CASS_OK) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1701 i_error("cassandra: Statement '%s': Failed to bind column %u: %s",
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1702 stmt->stmt.query_template, arg->column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1703 cass_error_desc(rc));
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1704 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1705 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1706
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1707 static void prepare_finish_statement(struct cassandra_sql_statement *stmt)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1708 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1709 const struct cassandra_sql_arg *arg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1710
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1711 if (stmt->prep->prepared == NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1712 i_assert(stmt->prep->error != NULL);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1713
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1714 if (stmt->result != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1715 stmt->result->error = i_strdup(stmt->prep->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1716 result_finish(stmt->result);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1717 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1718 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1719 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1720 stmt->cass_stmt = cass_prepared_bind(stmt->prep->prepared);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1721
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1722 if (stmt->pending_timestamp != 0) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1723 cass_statement_set_timestamp(stmt->cass_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1724 stmt->pending_timestamp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1725 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1726
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1727 if (array_is_created(&stmt->pending_args)) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1728 array_foreach(&stmt->pending_args, arg)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1729 prepare_finish_arg(stmt, arg);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1730 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1731 if (stmt->result != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1732 stmt->result->statement = stmt->cass_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1733 (void)driver_cassandra_send_query(stmt->result);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1734 pool_unref(&stmt->stmt.pool);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1735 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1736 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1737
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1738 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1739 prepare_finish_pending_statements(struct cassandra_sql_prepared_statement *prep_stmt)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1740 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1741 struct cassandra_sql_statement *const *stmtp;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1742
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1743 array_foreach(&prep_stmt->pending_statements, stmtp)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1744 prepare_finish_statement(*stmtp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1745 array_clear(&prep_stmt->pending_statements);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1746 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1747
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1748 static void prepare_callback(CassFuture *future, void *context)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1749 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1750 struct cassandra_sql_prepared_statement *prep_stmt = context;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1751 CassError error = cass_future_error_code(future);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1752
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1753 if (error != CASS_OK) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1754 const char *errmsg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1755 size_t errsize;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1756
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1757 cass_future_error_message(future, &errmsg, &errsize);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1758 i_free(prep_stmt->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1759 prep_stmt->error = i_strndup(errmsg, errsize);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1760 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1761 prep_stmt->prepared = cass_future_get_prepared(future);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1762 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1763
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1764 prepare_finish_pending_statements(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1765 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1766
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1767 static void prepare_start(struct cassandra_sql_prepared_statement *prep_stmt)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1768 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1769 struct cassandra_db *db = (struct cassandra_db *)prep_stmt->prep_stmt.db;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1770 CassFuture *future;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1771
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1772 if (!SQL_DB_IS_READY(&db->api)) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1773 if (!prep_stmt->pending) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1774 prep_stmt->pending = TRUE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1775 array_append(&db->pending_prepares, &prep_stmt, 1);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1776
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1777 if (sql_connect(&db->api) < 0)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1778 i_unreached();
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1779 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1780 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1781 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1782
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1783 /* clear the current error in case we're retrying */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1784 i_free_and_null(prep_stmt->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1785
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1786 future = cass_session_prepare(db->session, prep_stmt->query_template);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1787 driver_cassandra_set_callback(future, db, prepare_callback, prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1788 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1789
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1790 static void driver_cassandra_prepare_pending(struct cassandra_db *db)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1791 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1792 struct cassandra_sql_prepared_statement *const *prep_stmtp;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1793
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1794 i_assert(SQL_DB_IS_READY(&db->api));
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1795
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1796 array_foreach(&db->pending_prepares, prep_stmtp) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1797 (*prep_stmtp)->pending = FALSE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1798 prepare_start(*prep_stmtp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1799 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1800 array_clear(&db->pending_prepares);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1801 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1802
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1803 static struct sql_prepared_statement *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1804 driver_cassandra_prepared_statement_init(struct sql_db *db,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1805 const char *query_template)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1806 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1807 struct cassandra_sql_prepared_statement *prep_stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1808 i_new(struct cassandra_sql_prepared_statement, 1);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1809 prep_stmt->prep_stmt.db = db;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1810 prep_stmt->query_template = i_strdup(query_template);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1811 i_array_init(&prep_stmt->pending_statements, 4);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1812 prepare_start(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1813 return &prep_stmt->prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1814 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1815
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1816 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1817 driver_cassandra_prepared_statement_deinit(struct sql_prepared_statement *_prep_stmt)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1818 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1819 struct cassandra_sql_prepared_statement *prep_stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1820 (struct cassandra_sql_prepared_statement *)_prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1821
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1822 i_assert(array_count(&prep_stmt->pending_statements) == 0);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1823 if (prep_stmt->prepared != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1824 cass_prepared_free(prep_stmt->prepared);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1825 array_free(&prep_stmt->pending_statements);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1826 i_free(prep_stmt->query_template);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1827 i_free(prep_stmt->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1828 i_free(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1829 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1830
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1831 static struct sql_statement *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1832 driver_cassandra_statement_init(struct sql_db *db ATTR_UNUSED,
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1833 const char *query_template ATTR_UNUSED)
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1834 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1835 pool_t pool = pool_alloconly_create("cassandra sql statement", 1024);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1836 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1837 p_new(pool, struct cassandra_sql_statement, 1);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1838 stmt->stmt.pool = pool;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1839 return &stmt->stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1840 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1841
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1842 static struct sql_statement *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1843 driver_cassandra_statement_init_prepared(struct sql_prepared_statement *_prep_stmt)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1844 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1845 struct cassandra_sql_prepared_statement *prep_stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1846 (struct cassandra_sql_prepared_statement *)_prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1847 pool_t pool = pool_alloconly_create("cassandra prepared sql statement", 1024);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1848 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1849 p_new(pool, struct cassandra_sql_statement, 1);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1850
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1851 stmt->stmt.pool = pool;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1852 stmt->stmt.query_template =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1853 p_strdup(stmt->stmt.pool, prep_stmt->query_template);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1854 stmt->prep = prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1855
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1856 if (prep_stmt->prepared != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1857 /* statement is already prepared. we can use it immediately. */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1858 stmt->cass_stmt = cass_prepared_bind(prep_stmt->prepared);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1859 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1860 if (prep_stmt->error != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1861 prepare_start(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1862 /* need to wait until prepare is finished */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1863 array_append(&prep_stmt->pending_statements, &stmt, 1);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1864 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1865 return &stmt->stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1866 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1867
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1868 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1869 driver_cassandra_statement_abort(struct sql_statement *_stmt)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1870 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1871 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1872 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1873
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1874 if (stmt->cass_stmt != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1875 cass_statement_free(stmt->cass_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1876 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1877
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1878 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1879 driver_cassandra_statement_set_timestamp(struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1880 const struct timespec *ts)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1881 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1882 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1883 (struct cassandra_sql_statement *)_stmt;
22533
062f94c547ce cassandra: Timestamp should be in microseconds, not milliseconds
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22532
diff changeset
1884 cass_int64_t ts_usecs =
062f94c547ce cassandra: Timestamp should be in microseconds, not milliseconds
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22532
diff changeset
1885 (cass_int64_t)ts->tv_sec * 1000000ULL +
062f94c547ce cassandra: Timestamp should be in microseconds, not milliseconds
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22532
diff changeset
1886 ts->tv_nsec / 1000;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1887
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1888 if (stmt->cass_stmt != NULL)
22533
062f94c547ce cassandra: Timestamp should be in microseconds, not milliseconds
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22532
diff changeset
1889 cass_statement_set_timestamp(stmt->cass_stmt, ts_usecs);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1890 else
22533
062f94c547ce cassandra: Timestamp should be in microseconds, not milliseconds
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22532
diff changeset
1891 stmt->pending_timestamp = ts_usecs;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1892 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1893
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1894 static struct cassandra_sql_arg *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1895 driver_cassandra_add_pending_arg(struct cassandra_sql_statement *stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1896 unsigned int column_idx)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1897 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1898 struct cassandra_sql_arg *arg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1899
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1900 if (!array_is_created(&stmt->pending_args))
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1901 p_array_init(&stmt->pending_args, stmt->stmt.pool, 8);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1902 arg = array_append_space(&stmt->pending_args);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1903 arg->column_idx = column_idx;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1904 return arg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1905 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1906
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1907 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1908 driver_cassandra_statement_bind_str(struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1909 unsigned int column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1910 const char *value)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1911 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1912 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1913 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1914 if (stmt->cass_stmt != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1915 cass_statement_bind_string(stmt->cass_stmt, column_idx, value);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1916 else if (stmt->prep != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1917 struct cassandra_sql_arg *arg =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1918 driver_cassandra_add_pending_arg(stmt, column_idx);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1919 arg->value_str = p_strdup(_stmt->pool, value);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1920 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1921 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1922
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1923 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1924 driver_cassandra_statement_bind_binary(struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1925 unsigned int column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1926 const void *value, size_t value_size)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1927 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1928 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1929 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1930
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1931 if (stmt->cass_stmt != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1932 cass_statement_bind_bytes(stmt->cass_stmt, column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1933 value, value_size);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1934 } else if (stmt->prep != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1935 struct cassandra_sql_arg *arg =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1936 driver_cassandra_add_pending_arg(stmt, column_idx);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1937 arg->value_binary = p_memdup(_stmt->pool, value, value_size);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1938 arg->value_binary_size = value_size;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1939 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1940 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1941
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1942 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1943 driver_cassandra_statement_bind_int64(struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1944 unsigned int column_idx, int64_t value)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1945 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1946 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1947 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1948
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1949 if (stmt->cass_stmt != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1950 driver_cassandra_bind_int(stmt, column_idx, value);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1951 else if (stmt->prep != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1952 struct cassandra_sql_arg *arg =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1953 driver_cassandra_add_pending_arg(stmt, column_idx);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1954 arg->value_int64 = value;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1955 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1956 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1957
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1958 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1959 driver_cassandra_statement_query(struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1960 sql_query_callback_t *callback, void *context)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1961 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1962 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1963 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1964 struct cassandra_db *db = (struct cassandra_db *)_stmt->db;
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1965 const char *query = sql_statement_get_query(_stmt);
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1966 bool is_prepared = stmt->cass_stmt != NULL || stmt->prep != NULL;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1967
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1968 stmt->result = driver_cassandra_query_init(db, query,
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1969 CASSANDRA_QUERY_TYPE_READ,
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1970 is_prepared,
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1971 callback, context);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1972 if (stmt->cass_stmt != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1973 stmt->result->statement = stmt->cass_stmt;
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1974 } else if (stmt->prep != NULL) {
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1975 /* wait for prepare to finish */
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1976 return;
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1977 } else {
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1978 stmt->result->statement = cass_statement_new(query, 0);
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1979 if (stmt->pending_timestamp != 0) {
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1980 cass_statement_set_timestamp(stmt->result->statement,
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1981 stmt->pending_timestamp);
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1982 }
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1983 }
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1984 (void)driver_cassandra_send_query(stmt->result);
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1985 pool_unref(&_stmt->pool);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1986 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1987
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1988 static struct sql_result *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1989 driver_cassandra_statement_query_s(struct sql_statement *_stmt ATTR_UNUSED)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1990 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1991 i_panic("cassandra: sql_statement_query_s() not supported");
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1992 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1993
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1994 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1995 driver_cassandra_update_stmt(struct sql_transaction_context *_ctx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1996 struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1997 unsigned int *affected_rows)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1998 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1999 struct cassandra_transaction_context *ctx =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2000 (struct cassandra_transaction_context *)_ctx;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2001 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2002 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2003
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2004 i_assert(affected_rows == NULL);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2005
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2006 if (ctx->query != NULL || ctx->stmt != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2007 transaction_set_failed(ctx, "Multiple changes in transaction not supported");
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2008 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2009 }
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2010 if (stmt->prep != NULL)
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2011 ctx->stmt = stmt;
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2012 else
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2013 ctx->query = i_strdup(sql_statement_get_query(_stmt));
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2014 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2015
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2016 const struct sql_db driver_cassandra_db = {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2017 .name = "cassandra",
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2018 .flags = SQL_DB_FLAG_PREP_STATEMENTS,
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2019
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2020 .v = {
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2021 .init = driver_cassandra_init_v,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2022 .deinit = driver_cassandra_deinit_v,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2023 .connect = driver_cassandra_connect,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2024 .disconnect = driver_cassandra_disconnect,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2025 .escape_string = driver_cassandra_escape_string,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2026 .exec = driver_cassandra_exec,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2027 .query = driver_cassandra_query,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2028 .query_s = driver_cassandra_query_s,
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2029
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2030 .transaction_begin = driver_cassandra_transaction_begin,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2031 .transaction_commit2 = driver_cassandra_transaction_commit,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2032 .transaction_commit_s = driver_cassandra_transaction_commit_s,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2033 .transaction_rollback = driver_cassandra_transaction_rollback,
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2034
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2035 .update = driver_cassandra_update,
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
2036
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2037 .escape_blob = driver_cassandra_escape_blob,
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2038
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2039 .prepared_statement_init = driver_cassandra_prepared_statement_init,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2040 .prepared_statement_deinit = driver_cassandra_prepared_statement_deinit,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2041 .statement_init = driver_cassandra_statement_init,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2042 .statement_init_prepared = driver_cassandra_statement_init_prepared,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2043 .statement_abort = driver_cassandra_statement_abort,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2044 .statement_set_timestamp = driver_cassandra_statement_set_timestamp,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2045 .statement_bind_str = driver_cassandra_statement_bind_str,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2046 .statement_bind_binary = driver_cassandra_statement_bind_binary,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2047 .statement_bind_int64 = driver_cassandra_statement_bind_int64,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2048 .statement_query = driver_cassandra_statement_query,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2049 .statement_query_s = driver_cassandra_statement_query_s,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2050 .update_stmt = driver_cassandra_update_stmt,
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2051 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2052 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2053
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2054 const struct sql_result driver_cassandra_result = {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2055 .v = {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2056 driver_cassandra_result_free,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2057 driver_cassandra_result_next_row,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2058 driver_cassandra_result_get_fields_count,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2059 driver_cassandra_result_get_field_name,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2060 driver_cassandra_result_find_field,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2061 driver_cassandra_result_get_field_value,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2062 driver_cassandra_result_get_field_value_binary,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2063 driver_cassandra_result_find_field_value,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2064 driver_cassandra_result_get_values,
22354
b9a2a6135419 lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21972
diff changeset
2065 driver_cassandra_result_get_error,
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
2066 driver_cassandra_result_more,
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2067 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2068 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2069
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2070 const char *driver_cassandra_version = DOVECOT_ABI_VERSION;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2071
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2072 void driver_cassandra_init(void);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2073 void driver_cassandra_deinit(void);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2074
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2075 void driver_cassandra_init(void)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2076 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2077 sql_driver_register(&driver_cassandra_db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2078 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2079
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2080 void driver_cassandra_deinit(void)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2081 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2082 sql_driver_unregister(&driver_cassandra_db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2083 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2084
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2085 #endif