@@ -234,6 +234,43 @@ static VALUE rbduckdb_memory_helper_write_float(VALUE self, VALUE ptr, VALUE ind
234234 return Qnil ;
235235}
236236
237+ /*
238+ * call-seq:
239+ * DuckDB::MemoryHelper.write_timestamp(ptr, index, value) -> nil
240+ *
241+ * Writes a DuckDB timestamp to raw memory.
242+ * +value+ must be a Ruby Time object.
243+ *
244+ * ptr = vector.get_data
245+ * DuckDB::MemoryHelper.write_timestamp(ptr, 0, Time.new(2024, 3, 15, 10, 30, 45))
246+ */
247+ static VALUE rbduckdb_memory_helper_write_timestamp (VALUE self , VALUE ptr , VALUE index , VALUE value ) {
248+ duckdb_timestamp * data ;
249+ idx_t idx ;
250+
251+ (void )self ;
252+
253+ if (!rb_obj_is_kind_of (value , rb_cTime )) {
254+ rb_raise (rb_eTypeError , "Expected Time object for TIMESTAMP" );
255+ }
256+
257+ data = (duckdb_timestamp * )NUM2ULL (ptr );
258+ idx = (idx_t )NUM2ULL (index );
259+
260+ VALUE local_time = rb_funcall (value , rb_intern ("getlocal" ), 0 );
261+ data [idx ] = rbduckdb_to_duckdb_timestamp_from_value (
262+ rb_funcall (local_time , rb_intern ("year" ), 0 ),
263+ rb_funcall (local_time , rb_intern ("month" ), 0 ),
264+ rb_funcall (local_time , rb_intern ("day" ), 0 ),
265+ rb_funcall (local_time , rb_intern ("hour" ), 0 ),
266+ rb_funcall (local_time , rb_intern ("min" ), 0 ),
267+ rb_funcall (local_time , rb_intern ("sec" ), 0 ),
268+ rb_funcall (local_time , rb_intern ("usec" ), 0 )
269+ );
270+
271+ return Qnil ;
272+ }
273+
237274void rbduckdb_init_memory_helper (void ) {
238275 mDuckDBMemoryHelper = rb_define_module_under (mDuckDB , "MemoryHelper" );
239276
@@ -248,4 +285,5 @@ void rbduckdb_init_memory_helper(void) {
248285 rb_define_singleton_method (mDuckDBMemoryHelper , "write_uinteger" , rbduckdb_memory_helper_write_uinteger , 3 );
249286 rb_define_singleton_method (mDuckDBMemoryHelper , "write_ubigint" , rbduckdb_memory_helper_write_ubigint , 3 );
250287 rb_define_singleton_method (mDuckDBMemoryHelper , "write_float" , rbduckdb_memory_helper_write_float , 3 );
288+ rb_define_singleton_method (mDuckDBMemoryHelper , "write_timestamp" , rbduckdb_memory_helper_write_timestamp , 3 );
251289}
0 commit comments