diff --git a/README.md b/README.md index 65c517c..dc40dcc 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ end statement = Ilios::Cassandra.session.prepare(<<~CQL) SELECT * FROM ilios.example CQL +statement.idempotent = true statement.page_size = 25 result = Ilios::Cassandra.session.execute(statement) result.each do |row| diff --git a/ext/ilios/statement.c b/ext/ilios/statement.c index 36fa539..d5685ce 100644 --- a/ext/ilios/statement.c +++ b/ext/ilios/statement.c @@ -187,6 +187,23 @@ static VALUE statement_page_size(VALUE self, VALUE page_size) return self; } +/** + * Sets whether the statement is idempotent. Idempotent statements are able to be + * automatically retried after timeouts/errors and can be speculatively executed. + * The default is +false+. + * + * @param idempotent [Boolean] Whether the statement is idempotent. + * @return [Cassandra::Statement] self. + */ +static VALUE statement_idempotent(VALUE self, VALUE idempotent) +{ + CassandraStatement *cassandra_statement; + + GET_STATEMENT(self, cassandra_statement); + cass_statement_set_is_idempotent(cassandra_statement->statement, RTEST(idempotent) ? cass_true : cass_false); + return self; +} + static void statement_mark(void *ptr) { CassandraStatement *cassandra_statement = (CassandraStatement *)ptr; @@ -225,4 +242,5 @@ void Init_statement(void) rb_define_method(cStatement, "bind", statement_bind, 1); rb_define_method(cStatement, "page_size=", statement_page_size, 1); + rb_define_method(cStatement, "idempotent=", statement_idempotent, 1); } diff --git a/sig/ilios.rbs b/sig/ilios.rbs index 8f98333..bb8adec 100644 --- a/sig/ilios.rbs +++ b/sig/ilios.rbs @@ -17,6 +17,7 @@ module Ilios class Statement def bind: (Hash[Symbol, untyped] | Hash[String, untyped]) -> self def page_size: (Integer) -> self + def idempotent: (true | false) -> self end class Future diff --git a/test/test_statement.rb b/test/test_statement.rb index f788fd0..a6a2610 100644 --- a/test/test_statement.rb +++ b/test/test_statement.rb @@ -270,6 +270,10 @@ def test_page_size assert_equal(5, results.to_a.size) end + def test_idempotent + assert_kind_of(Ilios::Cassandra::Statement, @insert_statement.idempotent = true) + end + private def insert_and_get_results