annotate src/lib-sql/driver-cassandra.c @ 22962:a58d4fd9e20d

cassandra: Fix consistency=quorum to work Previously it could have been used by setting "consistency=", but this was an accident.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 17 May 2018 16:29:28 +0300
parents 34315e5fd52e
children 91b975cdeb87
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;
22728
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
133 cass_int64_t timestamp;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 pool_t row_pool;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 ARRAY_TYPE(const_string) fields;
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
137 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
138
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 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
140 void *context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
142 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
143 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
144 unsigned int finished:1;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
145 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
146 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 struct cassandra_transaction_context {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 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
150 int refcount;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
152 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
153 void *context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
155 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
156 char *query;
22810
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
157 cass_int64_t query_timestamp;
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
158 char *error;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 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
161 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
162 unsigned int failed:1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
165 struct cassandra_sql_arg {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
166 unsigned int column_idx;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
167
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
168 char *value_str;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
169 unsigned char *value_binary;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
170 size_t value_binary_size;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
171 int64_t value_int64;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
172 };
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
173
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
174 struct cassandra_sql_statement {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
175 struct sql_statement stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
176
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
177 struct cassandra_sql_prepared_statement *prep;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
178 CassStatement *cass_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
179
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
180 ARRAY(struct cassandra_sql_arg) pending_args;
22727
37d5a5c7a7b7 cassandra: Rename cassandra_sql_statement.pending_timestamp to just timestamp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22713
diff changeset
181 cass_int64_t timestamp;
22530
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 struct cassandra_result *result;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
184 };
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
185
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
186 struct cassandra_sql_prepared_statement {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
187 struct sql_prepared_statement prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
188 char *query_template;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
189
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
190 /* NULL, until the prepare is asynchronously finished */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
191 const CassPrepared *prepared;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
192 /* statements waiting for prepare to finish */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
193 ARRAY(struct cassandra_sql_statement *) pending_statements;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
194 /* 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
195 execution attempt. */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
196 char *error;
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 bool pending;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
199 };
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
200
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 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
202 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
203
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 static struct {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 CassConsistency consistency;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 const char *name;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 } cass_consistency_names[] = {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 { CASS_CONSISTENCY_ANY, "any" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 { CASS_CONSISTENCY_ONE, "one" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 { CASS_CONSISTENCY_TWO, "two" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 { CASS_CONSISTENCY_THREE, "three" },
22962
a58d4fd9e20d cassandra: Fix consistency=quorum to work
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22961
diff changeset
212 { CASS_CONSISTENCY_QUORUM, "quorum" },
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 { CASS_CONSISTENCY_ALL, "all" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 { 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
215 { 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
216 { CASS_CONSISTENCY_SERIAL, "serial" },
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 { 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
218 { 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
219 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
221 static struct {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
222 CassLogLevel log_level;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
223 const char *name;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
224 } cass_log_level_names[] = {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
225 { CASS_LOG_CRITICAL, "critical" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
226 { CASS_LOG_ERROR, "error" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
227 { CASS_LOG_WARN, "warn" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
228 { CASS_LOG_INFO, "info" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
229 { CASS_LOG_DEBUG, "debug" },
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
230 { CASS_LOG_TRACE, "trace" }
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
231 };
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
232
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
233 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
234 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
235 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
236 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
237 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
238 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
239
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 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
241 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 unsigned int i;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 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
245 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
246 *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
247 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 }
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 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
253 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
254 {
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
255 unsigned int i;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
256
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
257 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
258 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
259 *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
260 return 0;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
261 }
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 return -1;
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
264 }
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
265
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 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
267 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 /* 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
269 add/remove timeouts */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 if (db->ioloop != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 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
272 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
273 if (db->ioloop != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 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
275 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
277 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
278 {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
279 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
280 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
281
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 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
283 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
284 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
285 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
286 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
287 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 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
289
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
290 array_foreach(&db->pending_prepares, prep_stmtp) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
291 (*prep_stmtp)->pending = FALSE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
292 (*prep_stmtp)->error = i_strdup(error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
293 prepare_finish_pending_statements(*prep_stmtp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
294 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
295 array_clear(&db->pending_prepares);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
296
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
297 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
298 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
299 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
300 (*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
301 result_finish(*resultp);
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
302 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
303
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 if (db->ioloop != NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 /* 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
306 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
307 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 }
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 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
311 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 const char *message;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 size_t size;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 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
316 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
317 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 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
320 void *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 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
323
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 /* 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
325 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
326 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
327 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
328 i_error() here. */
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
329 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
330 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
331 "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
332 strerror(errno));
e04d881da1fb cassandra: Don't use i_error() from non-main thread
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21531
diff changeset
333 (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
334 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 }
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 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
338 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 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
340 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
341 i_free(cb);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 }
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 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
345 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 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
347
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 /* 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
349 a hash table */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 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
351 cb = *cbp;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 if (cb->id == id) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 array_delete(&db->callbacks,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 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
355 cassandra_callback_run(cb);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 }
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 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
360 }
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 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
363 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 unsigned int ids[1024];
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 ssize_t ret;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 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
368 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: %m");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 else if (ret == 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) failed: EOF");
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 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
373 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
374 else {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 /* success */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 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
377
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 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
379 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
380 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 }
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
382 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
383 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 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
387 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
388 void *context)
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 struct cassandra_callback *cb;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 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
393 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
394 cb->future = future;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 cb->callback = callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 cb->context = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 cb->db = db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 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
399
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 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
401 }
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 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
404 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 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
406 CassError rc;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 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
409 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
410 "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
411 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
412 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 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
415 if (db->ioloop != NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 /* 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
417 finish */
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 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
419 }
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
420 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
421 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
422 }
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 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
425 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 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
427 CassFuture *future;
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 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
430
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 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
432 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
433 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 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
436 driver_cassandra_input, db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 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
438
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 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
440 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
441 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 }
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 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
445 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 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
447
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
448 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
449 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 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
453 const char *string)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 string_t *escaped;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 unsigned int i;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 if (strchr(string, '\'') == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 return string;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 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
461 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
462 if (string[i] == '\'')
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 str_append_c(escaped, '\'');
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 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
465 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 return str_c(escaped);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 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
470 const char *connect_string)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 {
20068
5cd9a6bc7d43 cassandra: Added num_threads, connect_timeout and request_timeout settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20046
diff changeset
472 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
473 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
474 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
475
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
476 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
477 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
478 db->write_consistency = CASS_CONSISTENCY_LOCAL_QUORUM;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
479 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
480 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
481 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
482 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
483
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 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
485 for (; *args != NULL; args++) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 value = strchr(*args, '=');
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 if (value == NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 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
489 *args);
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 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
492
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 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
494 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
495 str_append_c(hosts, ',');
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 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
497 } 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
498 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
499 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
500 } 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
501 strcmp(key, "keyspace") == 0) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 i_free(db->keyspace);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 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
504 } 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
505 i_free(db->user);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
506 db->user = i_strdup(value);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
507 } 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
508 i_free(db->password);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
509 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
510 } 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
511 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
512 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
513 } 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
514 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
515 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
516 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
517 } 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
518 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
519 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
520 } 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
521 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
522 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
523 write_fallback_set = TRUE;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
524 } else if (strcmp(key, "delete_consistency") == 0) {
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
525 if (consistency_parse(value, &db->delete_consistency) < 0)
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
526 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
527 } 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
528 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
529 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
530 delete_fallback_set = TRUE;
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
531 } 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
532 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
533 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
534 } else if (strcmp(key, "debug_queries") == 0) {
80e064878fab cassandra: Added debug_queries connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20482
diff changeset
535 db->debug_queries = TRUE;
20834
426ae3e75ca5 cassandra: Added latency_aware_routing connect-parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20529
diff changeset
536 } 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
537 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
538 } 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
539 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
540 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
541 } 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
542 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
543 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
544 } 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
545 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
546 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
547 } 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
548 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
549 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
550 } 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
551 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
552 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
553 } 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
554 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
555 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
556 } 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
557 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
558 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
559 } else if (strcmp(key, "metrics") == 0) {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
560 i_free(db->metrics_path);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
561 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
562 } 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
563 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
564 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
565 #ifndef HAVE_CASSANDRA_SPECULATIVE_POLICY
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
566 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
567 #endif
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
568 } 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
569 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
570 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
571 #ifndef HAVE_CASSANDRA_SPECULATIVE_POLICY
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
572 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
573 #endif
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
574 } 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
575 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
576 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
577 } else {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 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
579 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
582 if (!read_fallback_set)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
583 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
584 if (!write_fallback_set)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
585 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
586 if (!delete_fallback_set)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
587 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
588
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 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
590 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
591 if (db->keyspace == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 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
593 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
594 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
596 static void
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
597 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
598 {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
599 #define ADD_UINT64(_struct, _field) \
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
600 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
601 #define ADD_DOUBLE(_struct, _field) \
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
602 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
603 CassMetrics metrics;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
604
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
605 cass_session_get_metrics(db->session, &metrics);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
606 str_append(dest, "{ \"requests\": {");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
607 ADD_UINT64(requests, min);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
608 ADD_UINT64(requests, max);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
609 ADD_UINT64(requests, mean);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
610 ADD_UINT64(requests, stddev);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
611 ADD_UINT64(requests, median);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
612 ADD_UINT64(requests, percentile_75th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
613 ADD_UINT64(requests, percentile_95th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
614 ADD_UINT64(requests, percentile_98th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
615 ADD_UINT64(requests, percentile_99th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
616 ADD_UINT64(requests, percentile_999th);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
617 ADD_DOUBLE(requests, mean_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
618 ADD_DOUBLE(requests, one_minute_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
619 ADD_DOUBLE(requests, five_minute_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
620 ADD_DOUBLE(requests, fifteen_minute_rate);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
621 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
622
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
623 str_append(dest, "}, \"stats\": {");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
624 ADD_UINT64(stats, total_connections);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
625 ADD_UINT64(stats, available_connections);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
626 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
627 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
628 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
629
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
630 str_append(dest, "}, \"errors\": {");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
631 ADD_UINT64(errors, connection_timeouts);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
632 ADD_UINT64(errors, pending_request_timeouts);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
633 ADD_UINT64(errors, request_timeouts);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
634 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
635
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
636 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
637 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
638 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
639 (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
640 }
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
641 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
642 str_append(dest, "}}");
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
643 }
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 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
646 {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
647 struct var_expand_table tab[] = {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
648 { '\0', NULL, NULL }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
649 };
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
650 string_t *path = t_str_new(64);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
651 string_t *data;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
652 int fd;
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 var_expand(path, db->metrics_path, tab);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
655
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
656 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
657 if (fd == -1) {
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
658 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
659 return;
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
660 }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
661 data = t_str_new(1024);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
662 driver_cassandra_get_metrics_json(db, data);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
663 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
664 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
665 i_close_fd(&fd);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
666 }
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
667
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 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
669 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 struct cassandra_db *db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 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
673 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
674 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
675
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 T_BEGIN {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 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
678 } T_END;
18761
315adb25e6b4 cassandra: Added log_level parameter to connect_string.
Timo Sirainen <tss@iki.fi>
parents: 18652
diff changeset
679 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
680
22531
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
681 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
682 /* 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
683 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
684 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
685 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
686 }
65df17ce8844 cassandra: Disable prepared statements with protocol v3 and older
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22530
diff changeset
687
19219
8183663ad7c0 cassandra: copy&paste mistake - use monotonic timestamp generator, not server side..
Timo Sirainen <tss@iki.fi>
parents: 19218
diff changeset
688 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
689 db->cluster = cass_cluster_new();
19216
1e4d2306f1f3 cassandra: Use a local monotonic timestamp generator.
Timo Sirainen <tss@iki.fi>
parents: 19153
diff changeset
690 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
691 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
692 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
693 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
694 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
695 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
696 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
697 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
698 if (db->protocol_version != 0)
e92af8f36ed0 cassandra: Added "version" parameter to specify a protocol version.
Timo Sirainen <tss@iki.fi>
parents: 19216
diff changeset
699 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
700 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
701 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
702 if (db->latency_aware_routing)
20999
dbcc7ae05ad0 Compiler warning fixes with -Wstrict-bool
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20834
diff changeset
703 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
704 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
705 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
706 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
707 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
708 #ifdef HAVE_CASSANDRA_SPECULATIVE_POLICY
a326cf8a579a driver-cassandra: Add support for speculative execution
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21529
diff changeset
709 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
710 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
711 #endif
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 db->session = cass_session_new();
20202
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
713 if (db->metrics_path != NULL)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
714 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
715 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
716 i_array_init(&db->callbacks, 16);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
717 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
718 return &db->api;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 }
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 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
722 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723 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
724
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
725 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
726
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 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
728 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
729 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
730 array_free(&db->results);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
731 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
732 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
733
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 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
735 cass_cluster_free(db->cluster);
19216
1e4d2306f1f3 cassandra: Use a local monotonic timestamp generator.
Timo Sirainen <tss@iki.fi>
parents: 19153
diff changeset
736 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
737 if (db->to_metrics != NULL)
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
738 timeout_remove(&db->to_metrics);
e4ac75a4f597 cassandra: Added metrics=path connect setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20068
diff changeset
739 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
740 i_free(db->hosts);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 i_free(db->error);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 i_free(db->keyspace);
20046
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
743 i_free(db->user);
ca2225e7782c cassandra: Added support for user and password settings.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19743
diff changeset
744 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
745 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
746 i_free(db);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
749 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
750 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
751 {
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
752 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
753 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
754
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
755 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
756 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
757 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
758 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
759 return;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
760 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
761 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
762 i_unreached();
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
765 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
766 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
767 {
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
768 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
769 struct timeval now;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
770 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
771
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
772 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
773 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
774 return;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
775
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
776 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
777 i_fatal("gettimeofday() failed: %m");
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
778
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
779 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
780 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
781 result->is_prepared ? "prepared " : "", result->query);
22728
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
782 if (result->timestamp != 0)
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
783 str_printfa(str, "timestamp=%"PRId64", ", result->timestamp);
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
784 if (all_pages) {
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
785 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
786 row_count = result->total_row_count;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
787 } else {
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
788 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
789 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
790 row_count = result->row_count;
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
791 }
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
792 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
793 timeval_diff_usecs(&now, &result->finish_time),
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
794 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
795
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
796 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
797 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
798 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
799 } else {
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
800 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
801 }
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
802 }
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
803
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 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
805 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806 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
807 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
808 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
809
19056
97ff15e9a7fd lib-sql: sql_result.free() should never be reached from the query callback.
Timo Sirainen <tss@iki.fi>
parents: 19048
diff changeset
810 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
811 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
812
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 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
814 db->sync_result = NULL;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815
20481
94736fed1324 cassandra: Warn if queries take too long (default 5 secs)
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20306
diff changeset
816 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
817 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
818
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
819 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
820 /* 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
821 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
822 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
823 &result->page0_start_time);
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
824 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
825 }
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
826
18833
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
827 if (result->result != NULL)
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
828 cass_result_free(result->result);
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
829 if (result->iterator != NULL)
0cf38b6b055d cassandra: Don't crash on failed queries.
Timo Sirainen <tss@iki.fi>
parents: 18761
diff changeset
830 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
831 if (result->statement != NULL)
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
832 cass_statement_free(result->statement);
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
833 if (result->row_pool != NULL)
7ddc7d2a3036 cassandra: Don't crash if connection to Cassandra failed.
Timo Sirainen <tss@iki.fi>
parents: 19150
diff changeset
834 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
835 i_free(result->query);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 i_free(result->error);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 i_free(result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 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
841 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 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
843 bool free_result = TRUE;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845 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
846 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
847 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
848
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
849 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
850
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 result->api.callback = TRUE;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 T_BEGIN {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 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
854 } T_END;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855 result->api.callback = FALSE;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 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
858 if (db->ioloop != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 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
860
19057
0770ab82703d lib-sql: Debugging help - Added assert before clearing sql_result.callback.
Timo Sirainen <tss@iki.fi>
parents: 19056
diff changeset
861 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
862 result->callback = NULL;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 if (free_result)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 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
865 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
867 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
868 {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
869 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
870 time_t last_warning =
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
871 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
872
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
873 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
874 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
875 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
876 cass_consistency_string(result->fallback_consistency),
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
877 cass_consistency_string(result->consistency));
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
878 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
879 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
880 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
881 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
882
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
883 result->consistency = result->fallback_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
884 driver_cassandra_result_send_query(result);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
885 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
886
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
887 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
888 {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
889 switch (error) {
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
890 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
891 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
892 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
893 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
894 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
895 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
896 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
897 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
898 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
899 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
900 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
901 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
902 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
903 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
904 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
905 default:
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
906 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
907 break;
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
908 }
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
909 }
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
910
22960
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
911 static bool query_error_want_fallback(CassError error)
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
912 {
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
913 switch (error) {
22961
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
914 case CASS_ERROR_LIB_WRITE_ERROR:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
915 case CASS_ERROR_LIB_REQUEST_TIMED_OUT:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
916 /* Communication problems on client side. Maybe it will work
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
917 with fallback consistency? */
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
918 return TRUE;
22960
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
919 case CASS_ERROR_LIB_NO_HOSTS_AVAILABLE:
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
920 /* The client library couldn't connect to enough Cassandra
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
921 nodes. The error message text is the same as for
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
922 CASS_ERROR_SERVER_UNAVAILABLE. */
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
923 return TRUE;
22961
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
924 case CASS_ERROR_SERVER_SERVER_ERROR:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
925 case CASS_ERROR_SERVER_OVERLOADED:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
926 case CASS_ERROR_SERVER_IS_BOOTSTRAPPING:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
927 case CASS_ERROR_SERVER_READ_TIMEOUT:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
928 case CASS_ERROR_SERVER_READ_FAILURE:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
929 case CASS_ERROR_SERVER_WRITE_FAILURE:
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
930 /* Servers are having trouble. Maybe with fallback consistency
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
931 we can reach non-troubled servers? */
34315e5fd52e cassandra: Use fallback_consistency on more types of errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22960
diff changeset
932 return TRUE;
22960
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
933 case CASS_ERROR_SERVER_UNAVAILABLE:
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
934 /* Cassandra server knows that there aren't enough nodes
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
935 available. "All hosts in current policy attempted and were
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
936 either unavailable or failed". */
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
937 return TRUE;
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
938 case CASS_ERROR_SERVER_WRITE_TIMEOUT:
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
939 /* Cassandra server couldn't reach all the needed nodes.
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
940 This may be because it hasn't yet detected that the servers
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
941 are down, or because the servers are just too busy. We'll
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
942 try the fallback consistency to avoid unnecessary temporary
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
943 errors. */
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
944 return TRUE;
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
945 default:
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
946 return FALSE;
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
947 }
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
948 }
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
949
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
950 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
951 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
952 struct cassandra_result *result = context;
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
953 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
954 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
955
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
956 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
957 const char *errmsg;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 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
959 int msecs;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
960
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
961 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
962 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
963
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
964 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
965 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
966 /* 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
967 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
968 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
969 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
970 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
971 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
972 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
973 SQL_RESULT_ERROR_TYPE_UNKNOWN;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
974 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
975 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
976 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
977
22960
f10330f73af6 cassandra: Cleanup - Move code to query_error_want_fallback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22811
diff changeset
978 if (query_error_want_fallback(error) &&
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
979 result->fallback_consistency != result->consistency) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
980 /* retry with fallback consistency */
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
981 query_resend_with_fallback(result);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
982 return;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
983 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
984 result_finish(result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
985 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
986 }
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
987 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
988
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
989 if (result->fallback_consistency != result->consistency) {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
990 /* 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
991 any fallbacks, reset them. */
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
992 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
993 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
994
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
995 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
996 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
997 result_finish(result);
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
998 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
999
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1000 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
1001 {
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1002 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
1003
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1004 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
1005
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1006 #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
1007 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
1008 #endif
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1009 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
1010 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
1011 }
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1012
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1013 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
1014 {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1015 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
1016 CassFuture *future;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1017
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1018 i_assert(result->statement != NULL);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1019
21529
cb58131424be cassandra: Track query counts internally and include them in metrics
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
1020 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
1021 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
1022 driver_cassandra_init_statement(result);
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1023
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1024 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
1025 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
1026 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1027
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1028 static bool
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1029 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
1030 {
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1031 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
1032 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
1033 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
1034 struct timeval tv;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1035
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1036 if (failure_count == 0)
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1037 return FALSE;
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1038 /* double the retries every time. */
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1039 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
1040 msecs *= 2;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1041 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
1042 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
1043 break;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1044 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1045 }
21829
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1046 /* 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
1047 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
1048 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
1049 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
1050 immediately when returning.
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1051
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1052 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
1053 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
1054 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
1055 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
1056 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
1057 successfully. */
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1058 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
1059 timeval_add_msecs(&tv, msecs);
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1060 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
1061 }
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1062
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1063 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
1064 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1065 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
1066 int ret;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1067
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1068 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
1069 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
1070 if (ret < 0)
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1071 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
1072 return ret;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1073 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1074 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1075
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1076 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
1077 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
1078 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
1079 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
1080 switch (result->query_type) {
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1081 case CASSANDRA_QUERY_TYPE_READ:
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1082 result->consistency = db->read_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1083 result->fallback_consistency = db->read_fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1084 break;
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1085 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
1086 /* 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
1087 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
1088 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
1089 break;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1090 case CASSANDRA_QUERY_TYPE_WRITE:
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1091 result->consistency = db->write_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1092 result->fallback_consistency = db->write_fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1093 break;
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1094 case CASSANDRA_QUERY_TYPE_DELETE:
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1095 result->consistency = db->delete_consistency;
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1096 result->fallback_consistency = db->delete_fallback_consistency;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1097 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
1098 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
1099 i_unreached();
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1100 }
19304
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1101
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1102 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
1103 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
1104 else
bec183747fef cassandra: Fallback consistency fix - it wasn't used permanently
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21828
diff changeset
1105 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
1106
8f7a0201ebe3 cassandra: Added read/write/delete_fallback_consistency settings.
Timo Sirainen <tss@iki.fi>
parents: 19297
diff changeset
1107 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
1108 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
1109 return 1;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1110 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1111
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1112 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
1113 {
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1114 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
1115 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
1116
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1117 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
1118 for (i = 0; i < count; i++) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1119 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
1120 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
1121 break;
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1122 }
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1123 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1124 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1125
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1126 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
1127 void *context ATTR_UNUSED)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1128 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1129 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1130
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1131 static struct cassandra_result *
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1132 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
1133 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
1134 bool is_prepared,
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1135 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
1136 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1137 struct cassandra_result *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1138
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1139 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
1140 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
1141 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
1142 result->api.refcount = 1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1143 result->callback = callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1144 result->context = context;
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1145 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
1146 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
1147 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
1148 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
1149 return result;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1150 }
19083
5d0bcb628c88 cassandra: Handle async queries internally - don't use sql pooling code.
Timo Sirainen <tss@iki.fi>
parents: 19072
diff changeset
1151
22356
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1152 static void
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1153 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
1154 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
1155 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
1156 {
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1157 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
1158 struct cassandra_result *result;
2fe6e07903f2 cassandra: Add wrapper functions in preparation for following commits
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1159
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1160 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
1161 callback, context);
22529
7b17f52b75b6 cassandra: Cleanup - Create statement earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22528
diff changeset
1162 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
1163 (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
1164 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1165
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1166 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
1167 {
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1168 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
1169 }
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1170
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1171 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
1172 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
1173 {
19146
602efd349b5c cassandra: Added delete_consistency parameter.
Timo Sirainen <tss@iki.fi>
parents: 19083
diff changeset
1174 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
1175 }
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1176
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1177 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
1178 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1179 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
1180
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181 db->sync_result = result;
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
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1184 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
1185 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1186 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
1187 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1188 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
1189 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
1190 if (IS_CONNECTED(db))
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1191 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1192 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
1193
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1194 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
1195 /* 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
1196 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
1197 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1198
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1199 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
1200 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1201 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
1202 return;
18648
d71fa3ae930f lib-sql: Don't crash in Cassandra if connection to it failed.
Timo Sirainen <tss@iki.fi>
parents: 18640
diff changeset
1203 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
1204 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
1205 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
1206 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
1207 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1208 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
1209 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1210
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1211 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
1212 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
1213 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
1214 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1215 struct sql_result *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1216
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1217 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
1218
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1219 switch (db->api.state) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1220 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
1221 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
1222 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1223 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
1224 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
1225 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
1226 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
1227 break;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1228 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1229
22527
db43860e2b12 cassandra: sql_transaction_commit_s() - Set query_type correctly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22526
diff changeset
1230 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
1231 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
1232 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
1233 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
1234 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
1235 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1236
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1237 result = db->sync_result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1238 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
1239 /* 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
1240 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
1241 db->sync_result = NULL;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1242 } else if (result == NULL) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1243 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
1244 result->refcount++;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1245 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1246 return result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1247 }
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 static struct sql_result *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1250 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
1251 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1252 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
1253 struct sql_result *result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1254
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1255 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
1256 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
1257 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
1258 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
1259 return result;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1260 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1261
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1262 static int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1263 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
1264 const CassValue *value, const char **str_r,
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1265 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
1266 {
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1267 const unsigned char *output;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1268 void *output_dup;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1269 size_t output_size;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1270 CassError rc;
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1271 const char *type;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1272
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1273 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
1274 *str_r = NULL;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1275 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1276 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1277
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1278 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
1279 case CASS_VALUE_TYPE_INT: {
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1280 cass_int32_t num;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1281
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1282 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
1283 if (rc == CASS_OK) {
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1284 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
1285 output_size = strlen(str);
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1286 output = (const void *)str;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1287 }
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1288 type = "int32";
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1289 break;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1290 }
22617
655f60aa8cf2 cassandra: Support "timestamp" type fields properly
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22616
diff changeset
1291 case CASS_VALUE_TYPE_TIMESTAMP:
21383
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1292 case CASS_VALUE_TYPE_BIGINT: {
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1293 cass_int64_t num;
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1294
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1295 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
1296 if (rc == CASS_OK) {
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1297 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
1298 output_size = strlen(str);
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1299 output = (const void *)str;
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1300 }
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1301 type = "int64";
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1302 break;
ca6f4f13e23e cassandra: Add support for "bigint" value type.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21272
diff changeset
1303 }
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1304 default:
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1305 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
1306 type = "bytes";
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1307 break;
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1308 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1309 if (rc != CASS_OK) {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1310 i_free(result->error);
19297
c854e1b3e419 cassandra: Added support for returning "int" type values.
Timo Sirainen <tss@iki.fi>
parents: 19219
diff changeset
1311 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
1312 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
1313 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1314 }
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1315 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
1316 memcpy(output_dup, output, output_size);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1317 *str_r = output_dup;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1318 *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
1319 return 0;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1320 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1321
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1322 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
1323 {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1324 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
1325
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1326 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
1327 /* no paging */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1328 return 0;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1329 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1330 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
1331 return 0;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1332
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1333 /* 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
1334 error message. */
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1335 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
1336 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
1337 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
1338 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1339
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1340 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
1341 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1342 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
1343 const CassRow *row;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1344 const CassValue *value;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1345 const char *str;
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1346 size_t size;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1347 unsigned int i;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1348 int ret = 1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1349
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1350 if (result->iterator == NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1351 return -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1352
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1353 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
1354 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
1355 result->row_count++;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1356 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
1357
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1358 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
1359 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
1360 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
1361
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1362 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
1363 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
1364 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
1365 ret = -1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1366 break;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1367 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1368 array_append(&result->fields, &str, 1);
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1369 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
1370 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1371 return ret;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1372 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1373
22357
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1374 static void
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1375 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
1376 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
1377 {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1378 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
1379 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
1380 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
1381 (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
1382
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1383 /* 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
1384 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
1385 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
1386 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
1387 callback, context);
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 /* 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
1390 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
1391 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
1392 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
1393 old_result->result);
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1394 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
1395 /* 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
1396 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
1397 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
1398
22811
d880c3334a2f cassandra: Make sure timestamp is always logged (if set) with debug_queries=y
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22810
diff changeset
1399 new_result->timestamp = old_result->timestamp;
22532
10d5c2886b60 cassandra: Fix paged queries to work again
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22531
diff changeset
1400 new_result->consistency = old_result->consistency;
22358
4f3967e2f493 cassandra: Improve logging for multipage queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22357
diff changeset
1401 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
1402 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
1403 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
1404
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1405 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
1406 *_result = NULL;
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1407
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1408 if (async)
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1409 (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
1410 else {
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1411 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
1412 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
1413 (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
1414 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
1415 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
1416 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
1417 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1418 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
1419
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1420 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
1421 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1422 }
732e248c2e26 cassandra: Add page_size setting to enable paged results for queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22356
diff changeset
1423
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1424 static unsigned int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1425 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
1426 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1427 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
1428
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1429 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
1430 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1431
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1432 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1433 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
1434 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
1435 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1436 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1437 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1438
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1439 static int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1440 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
1441 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
1442 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1443 i_unreached();
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1444 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1445
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1446 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1447 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
1448 unsigned int idx)
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 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
1451 const char *const *strp;
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 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
1454 return *strp;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1455 }
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 static const unsigned char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1458 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
1459 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
1460 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
1461 {
19071
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1462 struct cassandra_result *result = (struct cassandra_result *)_result;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1463 const char *const *strp;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1464 const size_t *sizep;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1465
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1466 strp = array_idx(&result->fields, idx);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1467 sizep = array_idx(&result->field_sizes, idx);
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1468 *size_r = *sizep;
5119a85795f7 cassandra: Implemented support for binary values.
Timo Sirainen <tss@iki.fi>
parents: 19058
diff changeset
1469 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
1470 }
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 static const char *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1473 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
1474 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
1475 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1476 i_unreached();
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
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1479 static const char *const *
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1480 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
1481 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1482 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
1483
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1484 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
1485 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1486
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1487 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
1488 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1489 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
1490
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1491 if (result->error != NULL)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1492 return result->error;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1493 return "FIXME";
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1494 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1495
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1496 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
1497 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
1498 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1499 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
1500
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1501 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
1502 ctx->ctx.db = db;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1503 ctx->refcount = 1;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1504 return &ctx->ctx;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1505 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1506
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1507 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
1508 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
1509 {
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
1510 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
1511
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
1512 *_ctx = NULL;
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1513 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
1514 if (--ctx->refcount > 0)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1515 return;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1516
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1517 i_free(ctx->query);
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1518 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
1519 i_free(ctx);
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
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1522 static void
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1523 transaction_set_failed(struct cassandra_transaction_context *ctx,
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1524 const char *error)
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1525 {
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1526 if (ctx->failed) {
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1527 i_assert(ctx->error != NULL);
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1528 } else {
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1529 i_assert(ctx->error == NULL);
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1530 ctx->failed = TRUE;
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1531 ctx->error = i_strdup(error);
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1532 }
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1533 }
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1534
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1535 static void
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1536 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
1537 {
19047
c33868915764 cassandra: Split consistency setting to read_consistency and write_consistency.
Timo Sirainen <tss@iki.fi>
parents: 18848
diff changeset
1538 struct cassandra_transaction_context *ctx = context;
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1539 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
1540
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
1541 i_zero(&commit_result);
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1542 if (sql_result_next_row(result) < 0) {
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1543 commit_result.error = sql_result_get_error(result);
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1544 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
1545 }
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1546 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
1547 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
1548 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1549
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1550 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1551 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
1552 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
1553 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1554 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
1555 (struct cassandra_transaction_context *)_ctx;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1556 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
1557 enum cassandra_query_type query_type;
20529
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1558 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
1559
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
1560 i_zero(&result);
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1561 ctx->callback = callback;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1562 ctx->context = context;
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1563
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1564 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
1565 if (ctx->failed)
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1566 result.error = ctx->error;
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1567
6450eb09e83c cassandra: Support commit2 API
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
1568 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
1569 driver_cassandra_transaction_unref(&ctx);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1570 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1571 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1572
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1573 /* just a single query, send it */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1574 const char *query = ctx->query != NULL ?
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1575 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
1576 if (strncasecmp(query, "DELETE ", 7) == 0)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1577 query_type = CASSANDRA_QUERY_TYPE_DELETE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1578 else
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1579 query_type = CASSANDRA_QUERY_TYPE_WRITE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1580
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1581 if (ctx->query != NULL) {
22810
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1582 struct cassandra_result *cass_result;
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1583
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1584 cass_result = driver_cassandra_query_init(db, query, query_type,
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1585 FALSE, transaction_commit_callback, ctx);
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1586 cass_result->statement = cass_statement_new(query, 0);
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1587 if (ctx->query_timestamp != 0) {
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1588 cass_result->timestamp = ctx->query_timestamp;
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1589 cass_statement_set_timestamp(cass_result->statement,
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1590 ctx->query_timestamp);
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1591 }
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
1592 (void)driver_cassandra_send_query(cass_result);
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1593 } else {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1594 ctx->stmt->result =
22616
629f44740f50 cassandra: Include "prepared" when logging about prepared statement queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22615
diff changeset
1595 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
1596 transaction_commit_callback, ctx);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1597 if (ctx->stmt->cass_stmt == NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1598 /* wait for prepare to finish */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1599 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1600 ctx->stmt->result->statement = ctx->stmt->cass_stmt;
22811
d880c3334a2f cassandra: Make sure timestamp is always logged (if set) with debug_queries=y
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22810
diff changeset
1601 ctx->stmt->result->timestamp = ctx->stmt->timestamp;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1602 (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
1603 pool_unref(&ctx->stmt->stmt.pool);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1604 }
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1605 }
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
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1608 static void
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1609 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
1610 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1611 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
1612 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
1613 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
1614 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
1615
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1616 /* 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
1617 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
1618 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
1619 else
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1620 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
1621 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
1622 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
1623 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
1624
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1625 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
1626 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
1627 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
1628 }
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 static int
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1631 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
1632 const char **error_r)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1633 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1634 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
1635 (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
1636
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1637 if (ctx->stmt != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1638 /* 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
1639 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
1640 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1641
22528
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1642 if (ctx->query != NULL && !ctx->failed)
18841
34fad121ec7b cassandra: Error handling cleanup.
Timo Sirainen <tss@iki.fi>
parents: 18840
diff changeset
1643 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
1644 *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
1645
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1646 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
1647 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
1648 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
1649 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
1650 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1651
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1652 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1653 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
1654 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1655 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
1656 (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
1657
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1658 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
1659 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
1660 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1661
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1662 static void
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1663 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
1664 unsigned int *affected_rows)
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1665 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1666 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
1667 (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
1668
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1669 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
1670
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1671 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
1672 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
1673 return;
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1674 }
348e82e819b0 cassandra: sql_transaction_commit*() cleanup - handle multiple query failures earlier
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22527
diff changeset
1675 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
1676 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1677
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1678 static const char *
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1679 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
1680 const unsigned char *data, size_t size)
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1681 {
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1682 string_t *str = t_str_new(128);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1683
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1684 str_append(str, "0x");
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1685 binary_to_hex_append(str, data, size);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1686 return str_c(str);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1687 }
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
1688
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1689 static CassError
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1690 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
1691 unsigned int column_idx, int64_t value)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1692 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1693 const CassDataType *data_type;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1694 CassValueType value_type;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1695
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1696 i_assert(stmt->prep != NULL);
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1697
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1698 /* 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
1699 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
1700 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
1701
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1702 switch (value_type) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1703 case CASS_VALUE_TYPE_INT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1704 if (value < -2147483648 || value > 2147483647)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1705 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1706 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
1707 case CASS_VALUE_TYPE_TIMESTAMP:
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1708 case CASS_VALUE_TYPE_BIGINT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1709 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
1710 case CASS_VALUE_TYPE_SMALL_INT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1711 if (value < -32768 || value > 32767)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1712 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1713 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
1714 case CASS_VALUE_TYPE_TINY_INT:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1715 if (value < -128 || value > 127)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1716 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1717 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
1718 default:
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1719 return CASS_ERROR_LIB_INVALID_VALUE_TYPE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1720 }
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
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1723 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
1724 const struct cassandra_sql_arg *arg)
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 CassError rc;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1727
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1728 if (arg->value_str != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1729 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
1730 arg->value_str);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1731 } else if (arg->value_binary != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1732 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
1733 arg->value_binary,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1734 arg->value_binary_size);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1735 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1736 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
1737 arg->value_int64);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1738 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1739 if (rc != CASS_OK) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1740 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
1741 stmt->stmt.query_template, arg->column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1742 cass_error_desc(rc));
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1743 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1744 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1745
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1746 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
1747 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1748 const struct cassandra_sql_arg *arg;
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 if (stmt->prep->prepared == NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1751 i_assert(stmt->prep->error != NULL);
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 (stmt->result != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1754 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
1755 result_finish(stmt->result);
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 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1758 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1759 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
1760
22727
37d5a5c7a7b7 cassandra: Rename cassandra_sql_statement.pending_timestamp to just timestamp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22713
diff changeset
1761 if (stmt->timestamp != 0)
37d5a5c7a7b7 cassandra: Rename cassandra_sql_statement.pending_timestamp to just timestamp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22713
diff changeset
1762 cass_statement_set_timestamp(stmt->cass_stmt, stmt->timestamp);
22530
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 if (array_is_created(&stmt->pending_args)) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1765 array_foreach(&stmt->pending_args, arg)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1766 prepare_finish_arg(stmt, arg);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1767 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1768 if (stmt->result != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1769 stmt->result->statement = stmt->cass_stmt;
22728
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
1770 stmt->result->timestamp = stmt->timestamp;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1771 (void)driver_cassandra_send_query(stmt->result);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1772 pool_unref(&stmt->stmt.pool);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1773 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1774 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1775
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1776 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1777 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
1778 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1779 struct cassandra_sql_statement *const *stmtp;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1780
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1781 array_foreach(&prep_stmt->pending_statements, stmtp)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1782 prepare_finish_statement(*stmtp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1783 array_clear(&prep_stmt->pending_statements);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1784 }
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 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
1787 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1788 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
1789 CassError error = cass_future_error_code(future);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1790
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1791 if (error != CASS_OK) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1792 const char *errmsg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1793 size_t errsize;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1794
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1795 cass_future_error_message(future, &errmsg, &errsize);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1796 i_free(prep_stmt->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1797 prep_stmt->error = i_strndup(errmsg, errsize);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1798 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1799 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
1800 }
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 prepare_finish_pending_statements(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1803 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1804
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1805 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
1806 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1807 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
1808 CassFuture *future;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1809
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1810 if (!SQL_DB_IS_READY(&db->api)) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1811 if (!prep_stmt->pending) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1812 prep_stmt->pending = TRUE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1813 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
1814
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1815 if (sql_connect(&db->api) < 0)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1816 i_unreached();
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1817 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1818 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1819 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1820
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1821 /* 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
1822 i_free_and_null(prep_stmt->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1823
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1824 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
1825 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
1826 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1827
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1828 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
1829 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1830 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
1831
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1832 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
1833
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1834 array_foreach(&db->pending_prepares, prep_stmtp) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1835 (*prep_stmtp)->pending = FALSE;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1836 prepare_start(*prep_stmtp);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1837 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1838 array_clear(&db->pending_prepares);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1839 }
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 static struct sql_prepared_statement *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1842 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
1843 const char *query_template)
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 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
1847 prep_stmt->prep_stmt.db = db;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1848 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
1849 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
1850 prepare_start(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1851 return &prep_stmt->prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1852 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1853
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1854 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1855 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
1856 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1857 struct cassandra_sql_prepared_statement *prep_stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1858 (struct cassandra_sql_prepared_statement *)_prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1859
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1860 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
1861 if (prep_stmt->prepared != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1862 cass_prepared_free(prep_stmt->prepared);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1863 array_free(&prep_stmt->pending_statements);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1864 i_free(prep_stmt->query_template);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1865 i_free(prep_stmt->error);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1866 i_free(prep_stmt);
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
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1869 static struct sql_statement *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1870 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
1871 const char *query_template ATTR_UNUSED)
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1872 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1873 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
1874 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1875 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
1876 stmt->stmt.pool = pool;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1877 return &stmt->stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1878 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1879
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1880 static struct sql_statement *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1881 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
1882 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1883 struct cassandra_sql_prepared_statement *prep_stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1884 (struct cassandra_sql_prepared_statement *)_prep_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1885 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
1886 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1887 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
1888
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1889 stmt->stmt.pool = pool;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1890 stmt->stmt.query_template =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1891 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
1892 stmt->prep = prep_stmt;
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 if (prep_stmt->prepared != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1895 /* 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
1896 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
1897 } else {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1898 if (prep_stmt->error != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1899 prepare_start(prep_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1900 /* need to wait until prepare is finished */
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1901 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
1902 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1903 return &stmt->stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1904 }
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 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1907 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
1908 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1909 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1910 (struct cassandra_sql_statement *)_stmt;
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 if (stmt->cass_stmt != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1913 cass_statement_free(stmt->cass_stmt);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1914 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1915
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1916 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1917 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
1918 const struct timespec *ts)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1919 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1920 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1921 (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
1922 cass_int64_t ts_usecs =
062f94c547ce cassandra: Timestamp should be in microseconds, not milliseconds
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22532
diff changeset
1923 (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
1924 ts->tv_nsec / 1000;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1925
22728
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
1926 i_assert(stmt->result == NULL);
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
1927
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1928 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
1929 cass_statement_set_timestamp(stmt->cass_stmt, ts_usecs);
22728
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
1930 stmt->timestamp = ts_usecs;
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1931 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1932
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1933 static struct cassandra_sql_arg *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1934 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
1935 unsigned int column_idx)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1936 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1937 struct cassandra_sql_arg *arg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1938
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1939 if (!array_is_created(&stmt->pending_args))
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1940 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
1941 arg = array_append_space(&stmt->pending_args);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1942 arg->column_idx = column_idx;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1943 return arg;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1944 }
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 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1947 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
1948 unsigned int column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1949 const char *value)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1950 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1951 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1952 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1953 if (stmt->cass_stmt != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1954 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
1955 else if (stmt->prep != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1956 struct cassandra_sql_arg *arg =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1957 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
1958 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
1959 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1960 }
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 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1963 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
1964 unsigned int column_idx,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1965 const void *value, size_t value_size)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1966 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1967 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1968 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1969
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1970 if (stmt->cass_stmt != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1971 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
1972 value, value_size);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
1973 } else if (stmt->prep != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1974 struct cassandra_sql_arg *arg =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1975 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
1976 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
1977 arg->value_binary_size = value_size;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1978 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1979 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1980
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1981 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1982 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
1983 unsigned int column_idx, int64_t value)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1984 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1985 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1986 (struct cassandra_sql_statement *)_stmt;
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 if (stmt->cass_stmt != NULL)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1989 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
1990 else if (stmt->prep != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1991 struct cassandra_sql_arg *arg =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1992 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
1993 arg->value_int64 = value;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1994 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1995 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1996
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1997 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
1998 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
1999 sql_query_callback_t *callback, void *context)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2000 {
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 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
2004 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
2005 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
2006
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2007 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
2008 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
2009 is_prepared,
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2010 callback, context);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2011 if (stmt->cass_stmt != NULL) {
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2012 stmt->result->statement = stmt->cass_stmt;
22811
d880c3334a2f cassandra: Make sure timestamp is always logged (if set) with debug_queries=y
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22810
diff changeset
2013 stmt->result->timestamp = stmt->timestamp;
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2014 } else if (stmt->prep != NULL) {
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2015 /* wait for prepare to finish */
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2016 return;
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2017 } else {
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2018 stmt->result->statement = cass_statement_new(query, 0);
22728
3970c1d61616 cassandra: Include the used timestamp in logged queries
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22727
diff changeset
2019 stmt->result->timestamp = stmt->timestamp;
22727
37d5a5c7a7b7 cassandra: Rename cassandra_sql_statement.pending_timestamp to just timestamp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22713
diff changeset
2020 if (stmt->timestamp != 0) {
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2021 cass_statement_set_timestamp(stmt->result->statement,
22727
37d5a5c7a7b7 cassandra: Rename cassandra_sql_statement.pending_timestamp to just timestamp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22713
diff changeset
2022 stmt->timestamp);
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2023 }
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2024 }
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2025 (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
2026 pool_unref(&_stmt->pool);
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2027 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2028
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2029 static struct sql_result *
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2030 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
2031 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2032 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
2033 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2034
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2035 static void
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2036 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
2037 struct sql_statement *_stmt,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2038 unsigned int *affected_rows)
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2039 {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2040 struct cassandra_transaction_context *ctx =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2041 (struct cassandra_transaction_context *)_ctx;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2042 struct cassandra_sql_statement *stmt =
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2043 (struct cassandra_sql_statement *)_stmt;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2044
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2045 i_assert(affected_rows == NULL);
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2046
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2047 if (ctx->query != NULL || ctx->stmt != NULL) {
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2048 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
2049 return;
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2050 }
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2051 if (stmt->prep != NULL)
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2052 ctx->stmt = stmt;
22744
0b4ac3fc56a2 cassandra: Fix crash when using prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22743
diff changeset
2053 else {
22615
ac7bd203229d cassandra: Fix using bigint types with unprepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22533
diff changeset
2054 ctx->query = i_strdup(sql_statement_get_query(_stmt));
22810
41c67443c1c5 cassandra: Fix setting timestamp for transaction queries with v3 protocol
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22744
diff changeset
2055 ctx->query_timestamp = stmt->timestamp;
22744
0b4ac3fc56a2 cassandra: Fix crash when using prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22743
diff changeset
2056 pool_unref(&_stmt->pool);
0b4ac3fc56a2 cassandra: Fix crash when using prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22743
diff changeset
2057 }
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2058 }
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2059
18640
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2060 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
2061 .name = "cassandra",
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2062 .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
2063
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2064 .v = {
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2065 .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
2066 .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
2067 .connect = driver_cassandra_connect,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2068 .disconnect = driver_cassandra_disconnect,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2069 .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
2070 .exec = driver_cassandra_exec,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2071 .query = driver_cassandra_query,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2072 .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
2073
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2074 .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
2075 .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
2076 .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
2077 .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
2078
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2079 .update = driver_cassandra_update,
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19071
diff changeset
2080
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22432
diff changeset
2081 .escape_blob = driver_cassandra_escape_blob,
22530
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2082
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2083 .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
2084 .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
2085 .statement_init = driver_cassandra_statement_init,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2086 .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
2087 .statement_abort = driver_cassandra_statement_abort,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2088 .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
2089 .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
2090 .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
2091 .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
2092 .statement_query = driver_cassandra_statement_query,
5f7b8aa18c27 cassandra: Add support for prepared statements
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22529
diff changeset
2093 .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
2094 .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
2095 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2096 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2097
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2098 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
2099 .v = {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2100 driver_cassandra_result_free,
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2101 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
2102 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
2103 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
2104 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
2105 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
2106 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
2107 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
2108 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
2109 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
2110 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
2111 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2112 };
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2113
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2114 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
2115
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2116 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
2117 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
2118
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2119 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
2120 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2121 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
2122 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2123
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2124 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
2125 {
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2126 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
2127 }
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2128
3725c601dbaf lib-sql: Added support for Cassandra CQL as lib-sql backend.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2129 #endif