Skip to content

Commit 84e6ba8

Browse files
committed
logical_type: define DuckDB::LogicalType class
GitHub: GH-690 This PR is the first step to support duckdb_logical_column_type C API. At the following PRs, we will implement it step by step. In this PR, we adds `DuckDB::LogicalType` class which will handle duckdb_logical_column_type C API.
1 parent 575dbd0 commit 84e6ba8

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-0
lines changed

ext/duckdb/duckdb.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Init_duckdb_native(void) {
3131
rbduckdb_init_duckdb_connection();
3232
rbduckdb_init_duckdb_result();
3333
rbduckdb_init_duckdb_column();
34+
rbduckdb_init_duckdb_logical_type();
3435
rbduckdb_init_duckdb_prepared_statement();
3536
rbduckdb_init_duckdb_pending_result();
3637
rbduckdb_init_duckdb_blob();

ext/duckdb/logical_type.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "ruby-duckdb.h"
2+
3+
static VALUE cDuckDBLogicalType;
4+
5+
static void deallocate(void *ctx);
6+
static VALUE allocate(VALUE klass);
7+
static size_t memsize(const void *p);
8+
9+
static const rb_data_type_t logical_type_data_type = {
10+
"DuckDB/LogicalType",
11+
{NULL, deallocate, memsize,},
12+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
13+
};
14+
15+
static void deallocate(void *ctx) {
16+
rubyDuckDBLogicalType *p = (rubyDuckDBLogicalType *)ctx;
17+
18+
if (p->logical_type) {
19+
duckdb_destroy_logical_type(&(p->logical_type));
20+
}
21+
22+
xfree(p);
23+
}
24+
25+
static VALUE allocate(VALUE klass) {
26+
rubyDuckDBLogicalType *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBLogicalType));
27+
return TypedData_Wrap_Struct(klass, &logical_type_data_type, ctx);
28+
}
29+
30+
static size_t memsize(const void *p) {
31+
return sizeof(rubyDuckDBLogicalType);
32+
}
33+
34+
void rbduckdb_init_duckdb_logical_type(void) {
35+
#if 0
36+
VALUE mDuckDB = rb_define_module("DuckDB");
37+
#endif
38+
cDuckDBLogicalType = rb_define_class_under(mDuckDB, "LogicalType", rb_cObject);
39+
rb_define_alloc_func(cDuckDBLogicalType, allocate);
40+
}

ext/duckdb/logical_type.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef RUBY_DUCKDB_LOGICAL_TYPE_H
2+
#define RUBY_DUCKDB_LOGICAL_TYPE_H
3+
4+
struct _rubyDuckDBLogicalType {
5+
duckdb_logical_type logical_type;
6+
};
7+
8+
typedef struct _rubyDuckDBLogicalType rubyDuckDBLogicalType;
9+
10+
void rbduckdb_init_duckdb_logical_type(void);
11+
#endif

ext/duckdb/ruby-duckdb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "./connection.h"
2525
#include "./result.h"
2626
#include "./column.h"
27+
#include "./logical_type.h"
2728
#include "./prepared_statement.h"
2829
#include "./extracted_statements.h"
2930
#include "./pending_result.h"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# frozen_string_literal: true
2+
3+
require 'test_helper'
4+
5+
module DuckDBTest
6+
class LogicalTypeTest < Minitest::Test
7+
def test_defined_klass
8+
assert(DuckDB.const_defined?(:LogicalType))
9+
end
10+
end
11+
end

0 commit comments

Comments
 (0)