ilios 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +5 -0
- data/README.md +24 -13
- data/ext/ilios/cassandra.c +7 -0
- data/ext/ilios/future.c +105 -42
- data/ext/ilios/ilios.h +5 -0
- data/ext/ilios/nogvl.c +13 -0
- data/ext/ilios/result.c +39 -7
- data/ext/ilios/session.c +32 -24
- data/ext/ilios/statement.c +16 -0
- data/ilios.gemspec +1 -1
- data/lib/ilios/version.rb +3 -3
- data/lib/ilios.rb +15 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2e5ed874d686d5d019f339dd5123277d70000429fc0e09d3ea6ad589a0d380b
|
4
|
+
data.tar.gz: f4618e513dcabbcde12f697c71ea565f3e9b6a398b3424af7970d173fbf8698b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2beb63c0e1e259e2127cdf9652985868a704ee42b2bc66d0ac54e6eb2545b22ccebc392755de048c7fa3c4148164aa09a276a4ec4876671bc6779f576b8330d6
|
7
|
+
data.tar.gz: 5a48c0c82277ef5960ed4859d50709e986f324c471e3525b0e80cce5a64967071389a2927f6bad772fde986205e9d5e200ecd5deb4be5778ff138283206547e3
|
data/.yardopts
ADDED
data/README.md
CHANGED
@@ -29,6 +29,8 @@ WITH REPLICATION = {
|
|
29
29
|
};
|
30
30
|
```
|
31
31
|
|
32
|
+
Then, you can run the following code.
|
33
|
+
|
32
34
|
```ruby
|
33
35
|
require 'ilios'
|
34
36
|
|
@@ -107,20 +109,29 @@ prepare_future = Ilios::Cassandra.session.prepare_async(<<~CQL)
|
|
107
109
|
CQL
|
108
110
|
|
109
111
|
prepare_future.on_success { |statement|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
112
|
+
futures = []
|
113
|
+
|
114
|
+
10.times do |i|
|
115
|
+
statement.bind({
|
116
|
+
id: i,
|
117
|
+
message: 'Hello World',
|
118
|
+
created_at: Time.now,
|
119
|
+
})
|
120
|
+
result_future = Ilios::Cassandra.session.execute_async(statement)
|
121
|
+
result_future.on_success { |result|
|
122
|
+
p result
|
123
|
+
p "success"
|
124
|
+
}
|
125
|
+
result_future.on_failure {
|
126
|
+
p "fail"
|
127
|
+
}
|
128
|
+
|
129
|
+
futures << result_future
|
130
|
+
end
|
131
|
+
futures.each(&:await)
|
123
132
|
}
|
133
|
+
|
134
|
+
prepare_future.await
|
124
135
|
```
|
125
136
|
|
126
137
|
## Contributing
|
data/ext/ilios/cassandra.c
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
#include "ilios.h"
|
2
2
|
|
3
|
+
/**
|
4
|
+
* Connects a session to the keyspace specified in +config+ method.
|
5
|
+
*
|
6
|
+
* @return [Cassandra::Session] A new session object.
|
7
|
+
* @raise [RuntimeError] If no host is specified to connect in +config+ method.
|
8
|
+
* @raise [Cassandra::ConnectError] If the connection fails for any reason.
|
9
|
+
*/
|
3
10
|
static VALUE cassandra_connect(VALUE self)
|
4
11
|
{
|
5
12
|
CassandraSession *cassandra_session;
|
data/ext/ilios/future.c
CHANGED
@@ -34,6 +34,7 @@ static void future_thread_pool_init(future_thread_pool *pool)
|
|
34
34
|
pool->queue = rb_funcall(cQueue, id_new, 0);
|
35
35
|
for (int i = 0; i < THREAD_MAX; i++) {
|
36
36
|
pool->thread[i] = rb_thread_create(future_result_yielder_thread, (void*)pool);
|
37
|
+
rb_funcall(pool->thread[i], id_abort_on_exception_set, 1, Qtrue);
|
37
38
|
}
|
38
39
|
}
|
39
40
|
|
@@ -112,11 +113,11 @@ static void future_result_failure_yield(CassandraFuture *cassandra_future)
|
|
112
113
|
}
|
113
114
|
}
|
114
115
|
|
115
|
-
static VALUE future_result_yielder_synchronize(VALUE
|
116
|
+
static VALUE future_result_yielder_synchronize(VALUE future)
|
116
117
|
{
|
117
118
|
CassandraFuture *cassandra_future;
|
118
119
|
|
119
|
-
GET_FUTURE(
|
120
|
+
GET_FUTURE(future, cassandra_future);
|
120
121
|
|
121
122
|
if (cass_future_error_code(cassandra_future->future) == CASS_OK) {
|
122
123
|
future_result_success_yield(cassandra_future);
|
@@ -126,14 +127,29 @@ static VALUE future_result_yielder_synchronize(VALUE arg)
|
|
126
127
|
return Qnil;
|
127
128
|
}
|
128
129
|
|
129
|
-
static VALUE
|
130
|
+
static VALUE future_result_yielder_body(VALUE future)
|
130
131
|
{
|
131
132
|
CassandraFuture *cassandra_future;
|
132
133
|
|
133
|
-
GET_FUTURE(
|
134
|
+
GET_FUTURE(future, cassandra_future);
|
134
135
|
|
135
136
|
nogvl_future_wait(cassandra_future->future);
|
136
|
-
return rb_mutex_synchronize(cassandra_future->proc_mutex, future_result_yielder_synchronize,
|
137
|
+
return rb_mutex_synchronize(cassandra_future->proc_mutex, future_result_yielder_synchronize, future);
|
138
|
+
|
139
|
+
}
|
140
|
+
|
141
|
+
static VALUE future_result_yielder_ensure(VALUE future)
|
142
|
+
{
|
143
|
+
CassandraFuture *cassandra_future;
|
144
|
+
|
145
|
+
GET_FUTURE(future, cassandra_future);
|
146
|
+
uv_sem_post(&cassandra_future->sem);
|
147
|
+
return Qnil;
|
148
|
+
}
|
149
|
+
|
150
|
+
static VALUE future_result_yielder(VALUE future)
|
151
|
+
{
|
152
|
+
return rb_ensure(future_result_yielder_body, future, future_result_yielder_ensure, future);
|
137
153
|
}
|
138
154
|
|
139
155
|
static VALUE future_result_yielder_thread(void *arg)
|
@@ -147,6 +163,32 @@ static VALUE future_result_yielder_thread(void *arg)
|
|
147
163
|
return Qnil;
|
148
164
|
}
|
149
165
|
|
166
|
+
VALUE future_create(CassFuture *future, VALUE session, future_kind kind)
|
167
|
+
{
|
168
|
+
CassandraFuture *cassandra_future;
|
169
|
+
VALUE cassandra_future_obj;
|
170
|
+
|
171
|
+
cassandra_future_obj = CREATE_FUTURE(cassandra_future);
|
172
|
+
cassandra_future->kind = kind;
|
173
|
+
cassandra_future->future = future;
|
174
|
+
cassandra_future->session_obj = session;
|
175
|
+
cassandra_future->proc_mutex = rb_mutex_new();
|
176
|
+
uv_sem_init(&cassandra_future->sem, 0);
|
177
|
+
cassandra_future->already_waited = false;
|
178
|
+
|
179
|
+
return cassandra_future_obj;
|
180
|
+
}
|
181
|
+
|
182
|
+
/**
|
183
|
+
* Run block when future resolves to a value.
|
184
|
+
*
|
185
|
+
* @yieldparam value [Cassandra::Statement, Cassandra::Result] A value.
|
186
|
+
* Yields +Cassandra::Statement+ object when future was created by +Cassandra::Session#prepare_async+.
|
187
|
+
* Yields +Cassandra::Result+ object when future was created by +Cassandra::Session#execute_async+.
|
188
|
+
* @return [Cassandra::Future] self.
|
189
|
+
* @raise [Cassandra::ExecutionError] If this method will be called twice.
|
190
|
+
* @raise [ArgumentError] If no block was given.
|
191
|
+
*/
|
150
192
|
static VALUE future_on_success(VALUE self)
|
151
193
|
{
|
152
194
|
CassandraFuture *cassandra_future;
|
@@ -157,33 +199,34 @@ static VALUE future_on_success(VALUE self)
|
|
157
199
|
if (cassandra_future->on_success_block) {
|
158
200
|
rb_raise(eExecutionError, "It should not call twice");
|
159
201
|
}
|
202
|
+
if (!rb_block_given_p()) {
|
203
|
+
rb_raise(rb_eArgError, "no block given");
|
204
|
+
}
|
160
205
|
|
161
|
-
|
162
|
-
rb_mutex_lock(cassandra_future->proc_mutex);
|
163
|
-
|
164
|
-
if (!cassandra_future->on_failure_block) {
|
165
|
-
// Invoke the callback with thread pool only once
|
166
|
-
wakeup_thread = true;
|
167
|
-
}
|
206
|
+
rb_mutex_lock(cassandra_future->proc_mutex);
|
168
207
|
|
169
|
-
|
208
|
+
if (!cassandra_future->on_failure_block) {
|
209
|
+
// Invoke the callback with thread pool only once
|
210
|
+
wakeup_thread = true;
|
211
|
+
}
|
170
212
|
|
171
|
-
|
172
|
-
rb_mutex_unlock(cassandra_future->proc_mutex);
|
173
|
-
if (cass_future_error_code(cassandra_future->future) == CASS_OK) {
|
174
|
-
future_result_success_yield(cassandra_future);
|
175
|
-
}
|
176
|
-
return self;
|
177
|
-
}
|
213
|
+
cassandra_future->on_success_block = rb_block_proc();
|
178
214
|
|
179
|
-
|
180
|
-
|
181
|
-
}
|
182
|
-
rb_mutex_unlock(cassandra_future->proc_mutex);
|
215
|
+
if (wakeup_thread) {
|
216
|
+
future_queue_push(future_thread_pool_get(cassandra_future), self);
|
183
217
|
}
|
218
|
+
rb_mutex_unlock(cassandra_future->proc_mutex);
|
219
|
+
|
184
220
|
return self;
|
185
221
|
}
|
186
222
|
|
223
|
+
/**
|
224
|
+
* Run block when future resolves to error.
|
225
|
+
*
|
226
|
+
* @return [Cassandra::Future] self.
|
227
|
+
* @raise [Cassandra::ExecutionError] If this method will be called twice.
|
228
|
+
* @raise [ArgumentError] If no block was given.
|
229
|
+
*/
|
187
230
|
static VALUE future_on_failure(VALUE self)
|
188
231
|
{
|
189
232
|
CassandraFuture *cassandra_future;
|
@@ -194,30 +237,48 @@ static VALUE future_on_failure(VALUE self)
|
|
194
237
|
if (cassandra_future->on_failure_block) {
|
195
238
|
rb_raise(eExecutionError, "It should not call twice");
|
196
239
|
}
|
240
|
+
if (!rb_block_given_p()) {
|
241
|
+
rb_raise(rb_eArgError, "no block given");
|
242
|
+
}
|
197
243
|
|
198
|
-
|
199
|
-
rb_mutex_lock(cassandra_future->proc_mutex);
|
244
|
+
rb_mutex_lock(cassandra_future->proc_mutex);
|
200
245
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
246
|
+
if (!cassandra_future->on_success_block) {
|
247
|
+
// Invoke the callback with thread pool only once
|
248
|
+
wakeup_thread = true;
|
249
|
+
}
|
205
250
|
|
206
|
-
|
251
|
+
cassandra_future->on_failure_block = rb_block_proc();
|
207
252
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
}
|
213
|
-
return self;
|
214
|
-
}
|
253
|
+
if (wakeup_thread) {
|
254
|
+
future_queue_push(future_thread_pool_get(cassandra_future), self);
|
255
|
+
}
|
256
|
+
rb_mutex_unlock(cassandra_future->proc_mutex);
|
215
257
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
258
|
+
return self;
|
259
|
+
}
|
260
|
+
|
261
|
+
/**
|
262
|
+
* Wait to complete a future's statement.
|
263
|
+
*
|
264
|
+
* @return [Cassandra::Future] self.
|
265
|
+
*/
|
266
|
+
static VALUE future_await(VALUE self)
|
267
|
+
{
|
268
|
+
CassandraFuture *cassandra_future;
|
269
|
+
|
270
|
+
GET_FUTURE(self, cassandra_future);
|
271
|
+
|
272
|
+
if (cassandra_future->already_waited) {
|
273
|
+
rb_raise(eExecutionError, "It should not call twice");
|
274
|
+
}
|
275
|
+
|
276
|
+
if (cassandra_future->on_success_block || cassandra_future->on_failure_block) {
|
277
|
+
nogvl_sem_wait(&cassandra_future->sem);
|
278
|
+
} else {
|
279
|
+
nogvl_future_wait(cassandra_future->future);
|
220
280
|
}
|
281
|
+
cassandra_future->already_waited = true;
|
221
282
|
return self;
|
222
283
|
}
|
223
284
|
|
@@ -238,6 +299,7 @@ static void future_destroy(void *ptr)
|
|
238
299
|
if (cassandra_future->future) {
|
239
300
|
cass_future_free(cassandra_future->future);
|
240
301
|
}
|
302
|
+
uv_sem_destroy(&cassandra_future->sem);
|
241
303
|
xfree(cassandra_future);
|
242
304
|
}
|
243
305
|
|
@@ -263,6 +325,7 @@ void Init_future(void)
|
|
263
325
|
|
264
326
|
rb_define_method(cFuture, "on_success", future_on_success, 0);
|
265
327
|
rb_define_method(cFuture, "on_failure", future_on_failure, 0);
|
328
|
+
rb_define_method(cFuture, "await", future_await, 0);
|
266
329
|
|
267
330
|
future_thread_pool_init(&thread_pool_prepare);
|
268
331
|
future_thread_pool_init(&thread_pool_execute);
|
data/ext/ilios/ilios.h
CHANGED
@@ -54,6 +54,9 @@ typedef struct
|
|
54
54
|
VALUE on_success_block;
|
55
55
|
VALUE on_failure_block;
|
56
56
|
VALUE proc_mutex;
|
57
|
+
|
58
|
+
uv_sem_t sem;
|
59
|
+
bool already_waited;
|
57
60
|
} CassandraFuture;
|
58
61
|
|
59
62
|
extern const rb_data_type_t cassandra_session_data_type;
|
@@ -94,9 +97,11 @@ extern void Init_statement(void);
|
|
94
97
|
extern void Init_result(void);
|
95
98
|
extern void Init_future(void);
|
96
99
|
|
100
|
+
extern VALUE future_create(CassFuture *future, VALUE session, future_kind kind);
|
97
101
|
extern void nogvl_future_wait(CassFuture *future);
|
98
102
|
extern CassFuture *nogvl_session_prepare(CassSession* session, VALUE query);
|
99
103
|
extern CassFuture *nogvl_session_execute(CassSession* session, CassStatement* statement);
|
104
|
+
extern void nogvl_sem_wait(uv_sem_t *sem);
|
100
105
|
|
101
106
|
extern void statement_default_config(CassandraStatement *cassandra_statement);
|
102
107
|
extern void result_await(CassandraResult *cassandra_result);
|
data/ext/ilios/nogvl.c
CHANGED
@@ -51,3 +51,16 @@ CassFuture *nogvl_session_execute(CassSession* session, CassStatement* statement
|
|
51
51
|
nogvl_session_execute_args args = { session, statement };
|
52
52
|
return (CassFuture *)rb_thread_call_without_gvl(nogvl_session_execute_cb, &args, RUBY_UBF_PROCESS, 0);
|
53
53
|
}
|
54
|
+
|
55
|
+
static void *nogvl_sem_wait_cb(void *ptr)
|
56
|
+
{
|
57
|
+
uv_sem_t *sem = (uv_sem_t *)ptr;
|
58
|
+
uv_sem_wait(sem);
|
59
|
+
return NULL;
|
60
|
+
}
|
61
|
+
|
62
|
+
void nogvl_sem_wait(uv_sem_t *sem)
|
63
|
+
{
|
64
|
+
// Releases GVL to run another thread while waiting
|
65
|
+
rb_thread_call_without_gvl(nogvl_sem_wait_cb, sem, RUBY_UBF_PROCESS, 0);
|
66
|
+
}
|
data/ext/ilios/result.c
CHANGED
@@ -33,6 +33,12 @@ void result_await(CassandraResult *cassandra_result)
|
|
33
33
|
}
|
34
34
|
}
|
35
35
|
|
36
|
+
/**
|
37
|
+
* Loads next page synchronously
|
38
|
+
*
|
39
|
+
* @return [Cassandra::Result, nil] returns self or +nil+ if last page.
|
40
|
+
* @raise [Cassandra::ExecutionError] If the query is invalid or there is something wrong with the session.
|
41
|
+
*/
|
36
42
|
static VALUE result_next_page(VALUE self)
|
37
43
|
{
|
38
44
|
CassandraResult *cassandra_result;
|
@@ -176,23 +182,49 @@ static VALUE result_convert_row(const CassResult *result, const CassRow *row, si
|
|
176
182
|
return hash;
|
177
183
|
}
|
178
184
|
|
185
|
+
struct result_each_arg {
|
186
|
+
CassandraResult *cassandra_result;
|
187
|
+
CassIterator *iterator;
|
188
|
+
};
|
189
|
+
|
190
|
+
static VALUE result_each_body(VALUE a)
|
191
|
+
{
|
192
|
+
struct result_each_arg *args = (struct result_each_arg *)a;
|
193
|
+
size_t column_count = cass_result_column_count(args->cassandra_result->result);
|
194
|
+
|
195
|
+
while (cass_iterator_next(args->iterator)) {
|
196
|
+
const CassRow *row = cass_iterator_get_row(args->iterator);
|
197
|
+
rb_yield(result_convert_row(args->cassandra_result->result, row, column_count));
|
198
|
+
}
|
199
|
+
return Qnil;
|
200
|
+
}
|
201
|
+
|
202
|
+
static VALUE result_each_ensure(VALUE a)
|
203
|
+
{
|
204
|
+
CassIterator *iterator = (CassIterator *)a;
|
205
|
+
cass_iterator_free(iterator);
|
206
|
+
return Qnil;
|
207
|
+
}
|
208
|
+
|
209
|
+
/**
|
210
|
+
* Yield the row of result into a block.
|
211
|
+
*
|
212
|
+
* @return [Cassandra::Result, Enumerator] returns self or +Enumerator+ if block is not given.
|
213
|
+
*/
|
179
214
|
static VALUE result_each(VALUE self)
|
180
215
|
{
|
181
216
|
CassandraResult *cassandra_result;
|
182
217
|
CassIterator *iterator;
|
183
|
-
|
218
|
+
struct result_each_arg args;
|
184
219
|
|
185
220
|
RETURN_ENUMERATOR(self, 0, 0);
|
186
221
|
|
187
222
|
GET_RESULT(self, cassandra_result);
|
188
223
|
|
189
224
|
iterator = cass_iterator_from_result(cassandra_result->result);
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
rb_yield(result_convert_row(cassandra_result->result, row, column_count));
|
194
|
-
}
|
195
|
-
cass_iterator_free(iterator);
|
225
|
+
args.cassandra_result = cassandra_result;
|
226
|
+
args.iterator = iterator;
|
227
|
+
rb_ensure(result_each_body, (VALUE)&args, result_each_ensure, (VALUE)iterator);
|
196
228
|
|
197
229
|
return self;
|
198
230
|
}
|
data/ext/ilios/session.c
CHANGED
@@ -15,26 +15,32 @@ const rb_data_type_t cassandra_session_data_type = {
|
|
15
15
|
RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
|
16
16
|
};
|
17
17
|
|
18
|
+
/**
|
19
|
+
* Prepares a given query asynchronously and returns a future prepared statement.
|
20
|
+
*
|
21
|
+
* @param query [String] A query to prepare.
|
22
|
+
* @return [Cassandra::Future] A future prepared statement.
|
23
|
+
* @raise [TypeError] If the query is not a string.
|
24
|
+
*/
|
18
25
|
static VALUE session_prepare_async(VALUE self, VALUE query)
|
19
26
|
{
|
20
27
|
CassandraSession *cassandra_session;
|
21
|
-
CassandraFuture *cassandra_future;
|
22
28
|
CassFuture *prepare_future;
|
23
|
-
VALUE cassandra_future_obj;
|
24
29
|
|
25
30
|
GET_SESSION(self, cassandra_session);
|
26
31
|
|
27
32
|
prepare_future = nogvl_session_prepare(cassandra_session->session, query);
|
28
|
-
|
29
|
-
cassandra_future_obj = CREATE_FUTURE(cassandra_future);
|
30
|
-
cassandra_future->kind = prepare_async;
|
31
|
-
cassandra_future->future = prepare_future;
|
32
|
-
cassandra_future->session_obj = self;
|
33
|
-
cassandra_future->proc_mutex = rb_mutex_new();
|
34
|
-
|
35
|
-
return cassandra_future_obj;
|
33
|
+
return future_create(prepare_future, self, prepare_async);
|
36
34
|
}
|
37
35
|
|
36
|
+
/**
|
37
|
+
* Prepares a given query.
|
38
|
+
*
|
39
|
+
* @param query [String] A query to prepare.
|
40
|
+
* @return [Cassandra::Statement] A statement to execute.
|
41
|
+
* @raise [Cassandra::ExecutionError] If the query is invalid or there is something wrong with the session.
|
42
|
+
* @raise [TypeError] If the query is not a string.
|
43
|
+
*/
|
38
44
|
static VALUE session_prepare(VALUE self, VALUE query)
|
39
45
|
{
|
40
46
|
CassandraSession *cassandra_session;
|
@@ -66,29 +72,34 @@ static VALUE session_prepare(VALUE self, VALUE query)
|
|
66
72
|
return cassandra_statement_obj;
|
67
73
|
}
|
68
74
|
|
75
|
+
/**
|
76
|
+
* Executes a given statement asynchronously and returns a future result.
|
77
|
+
*
|
78
|
+
* @param statement [Cassandra::Statement] A statement to execute.
|
79
|
+
* @return [Cassandra::Future] A future for result.
|
80
|
+
* @raise [TypeError] If the invalid object is given.
|
81
|
+
*/
|
69
82
|
static VALUE session_execute_async(VALUE self, VALUE statement)
|
70
83
|
{
|
71
84
|
CassandraSession *cassandra_session;
|
72
85
|
CassandraStatement *cassandra_statement;
|
73
|
-
CassandraFuture *cassandra_future;
|
74
86
|
CassFuture *result_future;
|
75
|
-
VALUE cassandra_future_obj;
|
76
87
|
|
77
88
|
GET_SESSION(self, cassandra_session);
|
78
89
|
GET_STATEMENT(statement, cassandra_statement);
|
79
90
|
|
80
91
|
result_future = nogvl_session_execute(cassandra_session->session, cassandra_statement->statement);
|
81
|
-
|
82
|
-
cassandra_future_obj = CREATE_FUTURE(cassandra_future);
|
83
|
-
cassandra_future->kind = execute_async;
|
84
|
-
cassandra_future->future = result_future;
|
85
|
-
cassandra_future->session_obj = self;
|
86
|
-
cassandra_future->statement_obj = statement;
|
87
|
-
cassandra_future->proc_mutex = rb_mutex_new();
|
88
|
-
|
89
|
-
return cassandra_future_obj;
|
92
|
+
return future_create(result_future, self, execute_async);
|
90
93
|
}
|
91
94
|
|
95
|
+
/**
|
96
|
+
* Executes a given statement.
|
97
|
+
*
|
98
|
+
* @param statement [Cassandra::Statement] A statement to execute.
|
99
|
+
* @return [Cassandra::Result] A result.
|
100
|
+
* @raise [Cassandra::ExecutionError] If there is something wrong with the session.
|
101
|
+
* @raise [TypeError] If the invalid object is given.
|
102
|
+
*/
|
92
103
|
static VALUE session_execute(VALUE self, VALUE statement)
|
93
104
|
{
|
94
105
|
CassandraSession *cassandra_session;
|
@@ -115,9 +126,6 @@ static void session_destroy(void *ptr)
|
|
115
126
|
CassandraSession *cassandra_session = (CassandraSession *)ptr;
|
116
127
|
|
117
128
|
if (cassandra_session->session) {
|
118
|
-
CassFuture *close_future = cass_session_close(cassandra_session->session);
|
119
|
-
nogvl_future_wait(close_future);
|
120
|
-
cass_future_free(close_future);
|
121
129
|
cass_session_free(cassandra_session->session);
|
122
130
|
}
|
123
131
|
if (cassandra_session->connect_future) {
|
data/ext/ilios/statement.c
CHANGED
@@ -150,6 +150,16 @@ result_check:
|
|
150
150
|
return ST_CONTINUE;
|
151
151
|
}
|
152
152
|
|
153
|
+
/**
|
154
|
+
* Binds a specified column value to a query.
|
155
|
+
* A hash object should be given with column name as key.
|
156
|
+
*
|
157
|
+
* @param hash [Hash] A hash object to bind.
|
158
|
+
* @return [Cassandra::Statement] self.
|
159
|
+
* @raise [RangeError] If an invalid range of values was given.
|
160
|
+
* @raise [TypeError] If an invalid type of values was given.
|
161
|
+
* @raise [Cassandra::StatementError] If an invalid column name was given.
|
162
|
+
*/
|
153
163
|
static VALUE statement_bind(VALUE self, VALUE hash)
|
154
164
|
{
|
155
165
|
CassandraStatement *cassandra_statement;
|
@@ -161,6 +171,12 @@ static VALUE statement_bind(VALUE self, VALUE hash)
|
|
161
171
|
return self;
|
162
172
|
}
|
163
173
|
|
174
|
+
/**
|
175
|
+
* Sets the statement's page size.
|
176
|
+
*
|
177
|
+
* @param page_size [Integer] A page size.
|
178
|
+
* @return [Cassandra::Statement] self.
|
179
|
+
*/
|
164
180
|
static VALUE statement_page_size(VALUE self, VALUE page_size)
|
165
181
|
{
|
166
182
|
CassandraStatement *cassandra_statement;
|
data/ilios.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.files =
|
26
26
|
Dir.chdir(__dir__) do
|
27
27
|
`git ls-files -z`.split("\x0").reject do |f|
|
28
|
-
(f == __FILE__) || f.match(%r{\A(?:(?:test)/|\.(?:git|editorconfig|rubocop.*))})
|
28
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:test|example)/|\.(?:git|editorconfig|rubocop.*))})
|
29
29
|
end
|
30
30
|
end
|
31
31
|
spec.require_paths = ['lib']
|
data/lib/ilios/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Ilios
|
4
|
-
VERSION = '0.
|
4
|
+
VERSION = '0.2.0'
|
5
5
|
public_constant :VERSION
|
6
6
|
|
7
|
-
CASSANDRA_CPP_DRIVER_VERSION = '2.17.
|
7
|
+
CASSANDRA_CPP_DRIVER_VERSION = '2.17.1'
|
8
8
|
public_constant :CASSANDRA_CPP_DRIVER_VERSION
|
9
9
|
|
10
|
-
LIBUV_VERSION = '1.
|
10
|
+
LIBUV_VERSION = '1.47.0'
|
11
11
|
public_constant :LIBUV_VERSION
|
12
12
|
end
|
data/lib/ilios.rb
CHANGED
@@ -5,6 +5,7 @@ require 'ilios/version'
|
|
5
5
|
|
6
6
|
module Ilios
|
7
7
|
module Cassandra
|
8
|
+
# The default options.
|
8
9
|
@@config = {
|
9
10
|
keyspace: 'ilios',
|
10
11
|
hosts: ['127.0.0.1'],
|
@@ -14,10 +15,24 @@ module Ilios
|
|
14
15
|
page_size: 10_000
|
15
16
|
}
|
16
17
|
|
18
|
+
#
|
19
|
+
# Configures the option for connection or execution.
|
20
|
+
# The default value will be overridden by the specified option.
|
21
|
+
#
|
22
|
+
# @param config [Hash] A hash object contained the options.
|
23
|
+
#
|
17
24
|
def self.config=(config)
|
18
25
|
@@config = @@config.merge(config)
|
19
26
|
end
|
20
27
|
|
28
|
+
#
|
29
|
+
# Connects a session to the keyspace specified in +config+ method.
|
30
|
+
# The session object will be memorized by each threads.
|
31
|
+
#
|
32
|
+
# @return [Cassandra::Session] The session object.
|
33
|
+
# @raise [RuntimeError] If no host is specified to connect in +config+ method.
|
34
|
+
# @raise [Cassandra::ConnectError] If the connection fails for any reason.
|
35
|
+
#
|
21
36
|
def self.session
|
22
37
|
Thread.current[:ilios_cassandra_session] ||= connect
|
23
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ilios
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Watson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mini_portile2
|
@@ -32,6 +32,7 @@ extensions:
|
|
32
32
|
- ext/ilios/extconf.rb
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
+
- ".yardopts"
|
35
36
|
- Dockerfile
|
36
37
|
- Gemfile
|
37
38
|
- README.md
|