duckdb 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56df52ba6cb0fad781ea353ba7bba30409342ceeb3f19e819b40edab43405b3d
4
- data.tar.gz: b90b227e391ffadce51f01a99115c9aca102ebaf3ef99b78ff674792eb93d6d1
3
+ metadata.gz: 599ebecd3f693be06ff46fec535485d6ac6019cd889405a502d21a2f801c9ba8
4
+ data.tar.gz: '0811911b5f0c3404f8c7ff9c2351d97668013dd576d4f5a98775e9af45df5e52'
5
5
  SHA512:
6
- metadata.gz: f35dd8aaef3fb2533192ad49f890e8c6d79000a485e399ac9ce9eeb7baae3960c15a5d3c0ab46200a9ea2c63b4b159066eae8c02a202364ce782085a92c13f2b
7
- data.tar.gz: 84615e60ca4d5937e7f6f2a9ecdb6c6fd7d23eafcca37e82d29c6fcc417ff0eb50bd14efe6ded62ed4019b5815b87e334ed6293c6d5bfe1c5897342a12f60518
6
+ metadata.gz: b4ca8e956de0edbb9aa9ceed9273a48f3cf847e5ff79732b849465c59fa2030af5cd81c62344e953e96990e11c48ff1b2dd8bd3cd87f3bc8271079aeb69a31bd
7
+ data.tar.gz: 3501865c8c0aa7c70761705e06026aadd95e112d34fd9eed1152ae269407fddc7cdbe6a84f6f3f8cda917022bda45fb0d349b51400b939f43b74ae64bb8e43bf
data/CHANGELOG.md CHANGED
@@ -1,8 +1,19 @@
1
1
  # ChangeLog
2
2
 
3
+ ## 0.0.5
4
+
5
+ - add `DuckDB::Error`
6
+ - `DuckDB::Result#each` convert DuckDB number value to Ruby's number
7
+ - `DuckDB::Result#each` convert DuckDB NULL value to nil
8
+ - `DuckDB::Result#each` returns Enumerator object when block is not given
9
+ - `DuckDB::Result` include `Enumerable`
10
+ - add test for `DuckDB::Result`
11
+ - add test for `DuckDB::Connection`
12
+ - fix description in duckdb.gemspec
13
+
3
14
  ## 0.0.4
4
15
 
5
- - add Test for `DuckDB::Database`
16
+ - add test for `DuckDB::Database`
6
17
  - rename module name to `DuckDB` from `Duckdb`
7
18
 
8
19
  ## 0.0.3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- duckdb (0.0.1)
4
+ duckdb (0.0.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/duckdb.gemspec CHANGED
@@ -9,13 +9,13 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ["masaki.suketa@nifty.ne.jp"]
10
10
 
11
11
  spec.summary = %q{This module is Ruby binding for DuckDB database engine.}
12
- spec.description = %q{This module is Ruby binding for DuckDB database engine.\nYou must have the DuckDB engine installed to build/use this module.}
12
+ spec.description = "This module is Ruby binding for DuckDB database engine. You must have the DuckDB engine installed to build/use this module."
13
13
  spec.homepage = "https://github.com/suketa/ruby-duckdb"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = "https://github.com/suketa/ruby-duckdb"
18
- spec.metadata["changelog_uri"] = "https://github.com/suketa/ruby-duckdb/CHANGELOG.md"
18
+ spec.metadata["changelog_uri"] = "https://github.com/suketa/ruby-duckdb/blob/master/CHANGELOG.md"
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -27,7 +27,7 @@ VALUE create_connection(VALUE oDuckDBDatabase) {
27
27
  Data_Get_Struct(obj, rubyDuckDBConnection, ctxcon);
28
28
 
29
29
  if (duckdb_connect(ctxdb->db, &(ctxcon->con)) == DuckDBError) {
30
- rb_raise(rb_eRuntimeError, "connection error");
30
+ rb_raise(eDuckDBError, "connection error");
31
31
  }
32
32
 
33
33
  // rb_ivar_set(obj, rb_intern("database"), oDuckDBDatabase);
@@ -45,7 +45,7 @@ static VALUE duckdb_connection_query(VALUE self, VALUE str) {
45
45
  Data_Get_Struct(result, rubyDuckDBResult, ctxr);
46
46
 
47
47
  if (duckdb_query(ctx->con, StringValueCStr(str), &(ctxr->result)) == DuckDBError) {
48
- rb_raise(rb_eRuntimeError, "%s", ctxr->result.error_message);
48
+ rb_raise(eDuckDBError, "%s", ctxr->result.error_message);
49
49
  }
50
50
  return result;
51
51
  }
@@ -31,7 +31,7 @@ static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase
31
31
  Data_Get_Struct(obj, rubyDuckDB, ctx);
32
32
  if (duckdb_open(pfile, &(ctx->db)) == DuckDBError)
33
33
  {
34
- rb_raise(rb_eRuntimeError, "Failed to open database"); /* FIXME */
34
+ rb_raise(eDuckDBError, "Failed to open database"); /* FIXME */
35
35
  }
36
36
  return obj;
37
37
  }
data/ext/duckdb/duckdb.c CHANGED
@@ -6,6 +6,7 @@ void
6
6
  Init_duckdb_native(void) {
7
7
  mDuckDB = rb_define_module("DuckDB");
8
8
 
9
+ init_duckdb_error();
9
10
  init_duckdb_database();
10
11
  init_duckdb_connection();
11
12
  init_duckdb_result();
@@ -0,0 +1,5 @@
1
+ #include "ruby-duckdb.h"
2
+
3
+ void init_duckdb_error(void) {
4
+ eDuckDBError = rb_define_class_under(mDuckDB, "Error", rb_eStandardError);
5
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef RUBY_DUCKDB_ERROR_H
2
+ #define RUBY_DUCKDB_ERROR_H
3
+
4
+ VALUE eDuckDBError;
5
+
6
+ void init_duckdb_error(void);
7
+
8
+ #endif
9
+
10
+
data/ext/duckdb/result.c CHANGED
@@ -16,23 +16,84 @@ static VALUE allocate(VALUE klass)
16
16
  return Data_Wrap_Struct(klass, NULL, deallocate, ctx);
17
17
  }
18
18
 
19
+ static VALUE to_ruby_obj_boolean(duckdb_result *result, size_t col_idx, size_t row_idx) {
20
+ bool bval = duckdb_value_boolean(result, col_idx, row_idx);
21
+ return bval ? Qtrue : Qnil;
22
+ }
23
+
24
+ static VALUE to_ruby_obj_smallint(duckdb_result *result, size_t col_idx, size_t row_idx) {
25
+ int16_t i16val = duckdb_value_int16(result, col_idx, row_idx);
26
+ return INT2FIX(i16val);
27
+ }
28
+
29
+ static VALUE to_ruby_obj_integer(duckdb_result *result, size_t col_idx, size_t row_idx) {
30
+ int32_t i32val = duckdb_value_int32(result, col_idx, row_idx);
31
+ return INT2NUM(i32val);
32
+ }
33
+
34
+ static VALUE to_ruby_obj_bigint(duckdb_result *result, size_t col_idx, size_t row_idx) {
35
+ int64_t i64val = duckdb_value_int64(result, col_idx, row_idx);
36
+ return rb_int2big(i64val);
37
+ }
38
+
39
+ static VALUE to_ruby_obj_float(duckdb_result *result, size_t col_idx, size_t row_idx) {
40
+ float fval = duckdb_value_float(result, col_idx, row_idx);
41
+ return DBL2NUM(fval);
42
+ }
43
+
44
+ static VALUE to_ruby_obj_double(duckdb_result *result, size_t col_idx, size_t row_idx) {
45
+ double dval = duckdb_value_double(result, col_idx, row_idx);
46
+ return DBL2NUM(dval);
47
+ }
48
+
49
+ static VALUE to_ruby_obj(duckdb_result *result, size_t col_idx, size_t row_idx) {
50
+ char *p;
51
+ VALUE obj = Qnil;
52
+ if (result->columns[col_idx].nullmask[row_idx]) {
53
+ return obj;
54
+ }
55
+ switch(result->columns[col_idx].type) {
56
+ case DUCKDB_TYPE_BOOLEAN:
57
+ return to_ruby_obj_boolean(result, col_idx, row_idx);
58
+ case DUCKDB_TYPE_SMALLINT:
59
+ return to_ruby_obj_smallint(result, col_idx, row_idx);
60
+ case DUCKDB_TYPE_INTEGER:
61
+ return to_ruby_obj_integer(result, col_idx, row_idx);
62
+ case DUCKDB_TYPE_BIGINT:
63
+ return to_ruby_obj_bigint(result, col_idx, row_idx);
64
+ case DUCKDB_TYPE_FLOAT:
65
+ return to_ruby_obj_float(result, col_idx, row_idx);
66
+ case DUCKDB_TYPE_DOUBLE:
67
+ return to_ruby_obj_double(result, col_idx, row_idx);
68
+ default:
69
+ p = duckdb_value_varchar(result, col_idx, row_idx);
70
+ obj = rb_str_new2(p);
71
+ free(p);
72
+ }
73
+ return obj;
74
+ }
75
+
19
76
  static VALUE row_array(rubyDuckDBResult *ctx, size_t row_idx) {
20
77
  size_t col_idx;
21
78
  VALUE ary = rb_ary_new2(ctx->result.column_count);
22
79
  for(col_idx = 0; col_idx < ctx->result.column_count; col_idx++) {
23
- char *p = duckdb_value_varchar(&(ctx->result), col_idx, row_idx);
24
- rb_ary_store(ary, col_idx, rb_str_new2(p));
25
-
26
- free(p);
80
+ rb_ary_store(ary, col_idx, to_ruby_obj(&(ctx->result), col_idx, row_idx));
27
81
  }
28
82
  return ary;
29
83
  }
30
84
 
85
+ static VALUE duckdb_result_row_size(VALUE oDuckDBResult, VALUE args, VALUE obj) {
86
+ rubyDuckDBResult *ctx;
87
+ Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx);
88
+
89
+ return LONG2FIX(ctx->result.row_count);
90
+ }
91
+
31
92
  static VALUE duckdb_result_each(VALUE oDuckDBResult) {
32
93
  rubyDuckDBResult *ctx;
33
94
  size_t row_idx = 0;
34
95
 
35
- // RETURN_ENUMERATOR(oDuckDBResult, 0, 0);
96
+ RETURN_SIZED_ENUMERATOR(oDuckDBResult, 0, 0, duckdb_result_row_size);
36
97
 
37
98
  Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx);
38
99
  for (row_idx = 0; row_idx < ctx->result.row_count; row_idx++) {
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "ruby.h"
5
5
  #include <duckdb.h>
6
+ #include "./error.h"
6
7
  #include "./database.h"
7
8
  #include "./connection.h"
8
9
  #include "./result.h"
data/lib/duckdb.rb CHANGED
@@ -1,5 +1,6 @@
1
- require "duckdb/version"
2
- require "duckdb/duckdb_native"
1
+ require 'duckdb/version'
2
+ require 'duckdb/duckdb_native'
3
+ require 'duckdb/result'
3
4
 
4
5
  module DuckDB
5
6
  end
@@ -0,0 +1,5 @@
1
+ module DuckDB
2
+ class Result
3
+ include Enumerable
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module DuckDB
2
- VERSION = '0.0.4'.freeze
2
+ VERSION = '0.0.5'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duckdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Suketa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-02 00:00:00.000000000 Z
11
+ date: 2019-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,7 +66,7 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '5.0'
69
- description: This module is Ruby binding for DuckDB database engine.\nYou must have
69
+ description: This module is Ruby binding for DuckDB database engine. You must have
70
70
  the DuckDB engine installed to build/use this module.
71
71
  email:
72
72
  - masaki.suketa@nifty.ne.jp
@@ -91,11 +91,14 @@ files:
91
91
  - ext/duckdb/database.c
92
92
  - ext/duckdb/database.h
93
93
  - ext/duckdb/duckdb.c
94
+ - ext/duckdb/error.c
95
+ - ext/duckdb/error.h
94
96
  - ext/duckdb/extconf.rb
95
97
  - ext/duckdb/result.c
96
98
  - ext/duckdb/result.h
97
99
  - ext/duckdb/ruby-duckdb.h
98
100
  - lib/duckdb.rb
101
+ - lib/duckdb/result.rb
99
102
  - lib/duckdb/version.rb
100
103
  homepage: https://github.com/suketa/ruby-duckdb
101
104
  licenses:
@@ -103,7 +106,7 @@ licenses:
103
106
  metadata:
104
107
  homepage_uri: https://github.com/suketa/ruby-duckdb
105
108
  source_code_uri: https://github.com/suketa/ruby-duckdb
106
- changelog_uri: https://github.com/suketa/ruby-duckdb/CHANGELOG.md
109
+ changelog_uri: https://github.com/suketa/ruby-duckdb/blob/master/CHANGELOG.md
107
110
  post_install_message:
108
111
  rdoc_options: []
109
112
  require_paths: