duckdb 0.2.9.0 → 0.3.3.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/.github/workflows/test_on_macos.yml +23 -16
- data/.github/workflows/test_on_ubuntu.yml +11 -3
- data/.github/workflows/test_on_windows.yml +16 -9
- data/CHANGELOG.md +22 -0
- data/Gemfile.lock +4 -3
- data/README.md +32 -3
- data/ext/duckdb/appender.c +7 -59
- data/ext/duckdb/appender.h +0 -5
- data/ext/duckdb/blob.c +1 -5
- data/ext/duckdb/blob.h +0 -4
- data/ext/duckdb/column.c +73 -0
- data/ext/duckdb/column.h +14 -0
- data/ext/duckdb/config.c +2 -4
- data/ext/duckdb/connection.c +14 -15
- data/ext/duckdb/database.c +10 -16
- data/ext/duckdb/duckdb.c +2 -11
- data/ext/duckdb/error.c +1 -2
- data/ext/duckdb/extconf.rb +17 -21
- data/ext/duckdb/prepared_statement.c +100 -46
- data/ext/duckdb/result.c +51 -20
- data/ext/duckdb/ruby-duckdb.h +7 -20
- data/ext/duckdb/util.c +45 -0
- data/ext/duckdb/util.h +13 -0
- data/lib/duckdb/appender.rb +213 -272
- data/lib/duckdb/column.rb +55 -0
- data/lib/duckdb/config.rb +1 -4
- data/lib/duckdb/converter.rb +52 -0
- data/lib/duckdb/prepared_statement.rb +111 -8
- data/lib/duckdb/version.rb +1 -1
- data/lib/duckdb.rb +2 -0
- metadata +9 -3
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'date'
|
2
|
+
require_relative './converter'
|
2
3
|
|
3
4
|
module DuckDB
|
4
5
|
# The DuckDB::PreparedStatement encapsulates connection with DuckDB prepared
|
@@ -12,6 +13,7 @@ module DuckDB
|
|
12
13
|
# stmt.bind(1, 'email@example.com')
|
13
14
|
# stmt.execute
|
14
15
|
class PreparedStatement
|
16
|
+
include DuckDB::Converter
|
15
17
|
|
16
18
|
RANGE_INT16 = -32768..32767
|
17
19
|
RANGE_INT32 = -2147483648..2147483647
|
@@ -27,8 +29,113 @@ module DuckDB
|
|
27
29
|
end
|
28
30
|
|
29
31
|
# binds i-th parameter with SQL prepared statement.
|
30
|
-
# The first argument is index of parameter.
|
31
|
-
# 1 not 0.
|
32
|
+
# The first argument is index of parameter.
|
33
|
+
# The index of first parameter is 1 not 0.
|
34
|
+
# The second argument value is to expected date.
|
35
|
+
#
|
36
|
+
# require 'duckdb'
|
37
|
+
# db = DuckDB::Database.open('duckdb_database')
|
38
|
+
# con = db.connect
|
39
|
+
# sql ='SELECT name FROM users WHERE birth_day = ?'
|
40
|
+
# stmt = PreparedStatement.new(con, sql)
|
41
|
+
# stmt.bind(1, Date.today)
|
42
|
+
# # or you can specify date string.
|
43
|
+
# # stmt.bind(1, '2021-02-23')
|
44
|
+
def bind_date(i, value)
|
45
|
+
case value
|
46
|
+
when Date, Time
|
47
|
+
date = value
|
48
|
+
else
|
49
|
+
begin
|
50
|
+
date = Date.parse(value)
|
51
|
+
rescue => e
|
52
|
+
raise(ArgumentError, "Cannot parse argument value to date. #{e.message}")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
_bind_date(i, date.year, date.month, date.day)
|
57
|
+
end
|
58
|
+
|
59
|
+
# binds i-th parameter with SQL prepared statement.
|
60
|
+
# The first argument is index of parameter.
|
61
|
+
# The index of first parameter is 1 not 0.
|
62
|
+
# The second argument value is to expected time value.
|
63
|
+
#
|
64
|
+
# require 'duckdb'
|
65
|
+
# db = DuckDB::Database.open('duckdb_database')
|
66
|
+
# con = db.connect
|
67
|
+
# sql ='SELECT name FROM users WHERE birth_time = ?'
|
68
|
+
# stmt = PreparedStatement.new(con, sql)
|
69
|
+
# stmt.bind(1, Time.now)
|
70
|
+
# # or you can specify time string.
|
71
|
+
# # stmt.bind(1, '07:39:45')
|
72
|
+
def bind_time(i, value)
|
73
|
+
case value
|
74
|
+
when Time
|
75
|
+
time = value
|
76
|
+
else
|
77
|
+
begin
|
78
|
+
time = Time.parse(value)
|
79
|
+
rescue => e
|
80
|
+
raise(ArgumentError, "Cannot parse argument value to time. #{e.message}")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
_bind_time(i, time.hour, time.min, time.sec, time.usec)
|
85
|
+
end
|
86
|
+
|
87
|
+
# binds i-th parameter with SQL prepared statement.
|
88
|
+
# The first argument is index of parameter.
|
89
|
+
# The index of first parameter is 1 not 0.
|
90
|
+
# The second argument value is to expected time value.
|
91
|
+
#
|
92
|
+
# require 'duckdb'
|
93
|
+
# db = DuckDB::Database.open('duckdb_database')
|
94
|
+
# con = db.connect
|
95
|
+
# sql ='SELECT name FROM users WHERE created_at = ?'
|
96
|
+
# stmt = PreparedStatement.new(con, sql)
|
97
|
+
# stmt.bind(1, Time.now)
|
98
|
+
# # or you can specify timestamp string.
|
99
|
+
# # stmt.bind(1, '2022-02-23 07:39:45')
|
100
|
+
def bind_timestamp(i, value)
|
101
|
+
case value
|
102
|
+
when Time
|
103
|
+
time = value
|
104
|
+
else
|
105
|
+
begin
|
106
|
+
time = Time.parse(value)
|
107
|
+
rescue => e
|
108
|
+
raise(ArgumentError, "Cannot parse argument value to time. #{e.message}")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
_bind_timestamp(i, time.year, time.month, time.day, time.hour, time.min, time.sec, time.usec)
|
113
|
+
end
|
114
|
+
|
115
|
+
# binds i-th parameter with SQL prepared statement.
|
116
|
+
# The first argument is index of parameter.
|
117
|
+
# The index of first parameter is 1 not 0.
|
118
|
+
# The second argument value is to expected ISO8601 time interval string.
|
119
|
+
#
|
120
|
+
# require 'duckdb'
|
121
|
+
# db = DuckDB::Database.open('duckdb_database')
|
122
|
+
# con = db.connect
|
123
|
+
# sql ='SELECT value FROM intervals WHERE interval = ?'
|
124
|
+
# stmt = PreparedStatement.new(con, sql)
|
125
|
+
# stmt.bind(1, 'P1Y2D')
|
126
|
+
def bind_interval(i, value)
|
127
|
+
raise ArgumentError, "Argument `#{value}` must be a string." unless value.is_a?(String)
|
128
|
+
|
129
|
+
hash = iso8601_interval_to_hash(value)
|
130
|
+
|
131
|
+
months, days, micros = hash_to__append_interval_args(hash)
|
132
|
+
|
133
|
+
_bind_interval(i, months, days, micros)
|
134
|
+
end
|
135
|
+
|
136
|
+
# binds i-th parameter with SQL prepared statement.
|
137
|
+
# The first argument is index of parameter.
|
138
|
+
# The index of first parameter is 1 not 0.
|
32
139
|
# The second argument value is the value of prepared statement parameter.
|
33
140
|
#
|
34
141
|
# require 'duckdb'
|
@@ -40,7 +147,7 @@ module DuckDB
|
|
40
147
|
def bind(i, value)
|
41
148
|
case value
|
42
149
|
when NilClass
|
43
|
-
|
150
|
+
bind_null(i)
|
44
151
|
when Float
|
45
152
|
bind_double(i, value)
|
46
153
|
when Integer
|
@@ -51,11 +158,7 @@ module DuckDB
|
|
51
158
|
bind_varchar(i, value.to_s)
|
52
159
|
end
|
53
160
|
when String
|
54
|
-
|
55
|
-
blob?(value) ? bind_blob(i, value) : bind_varchar(i, value)
|
56
|
-
else
|
57
|
-
bind_varchar(i, value)
|
58
|
-
end
|
161
|
+
blob?(value) ? bind_blob(i, value) : bind_varchar(i, value)
|
59
162
|
when TrueClass, FalseClass
|
60
163
|
bind_bool(i, value)
|
61
164
|
when Time
|
data/lib/duckdb/version.rb
CHANGED
data/lib/duckdb.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'duckdb/duckdb_native'
|
2
2
|
require 'duckdb/version'
|
3
|
+
require 'duckdb/converter'
|
3
4
|
require 'duckdb/database'
|
4
5
|
require 'duckdb/connection'
|
5
6
|
require 'duckdb/result'
|
6
7
|
require 'duckdb/prepared_statement'
|
7
8
|
require 'duckdb/appender'
|
8
9
|
require 'duckdb/config'
|
10
|
+
require 'duckdb/column'
|
9
11
|
|
10
12
|
# DuckDB provides Ruby interface of DuckDB.
|
11
13
|
module DuckDB
|
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.
|
4
|
+
version: 0.3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Suketa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -93,6 +93,8 @@ files:
|
|
93
93
|
- ext/duckdb/appender.h
|
94
94
|
- ext/duckdb/blob.c
|
95
95
|
- ext/duckdb/blob.h
|
96
|
+
- ext/duckdb/column.c
|
97
|
+
- ext/duckdb/column.h
|
96
98
|
- ext/duckdb/config.c
|
97
99
|
- ext/duckdb/config.h
|
98
100
|
- ext/duckdb/connection.c
|
@@ -108,10 +110,14 @@ files:
|
|
108
110
|
- ext/duckdb/result.c
|
109
111
|
- ext/duckdb/result.h
|
110
112
|
- ext/duckdb/ruby-duckdb.h
|
113
|
+
- ext/duckdb/util.c
|
114
|
+
- ext/duckdb/util.h
|
111
115
|
- lib/duckdb.rb
|
112
116
|
- lib/duckdb/appender.rb
|
117
|
+
- lib/duckdb/column.rb
|
113
118
|
- lib/duckdb/config.rb
|
114
119
|
- lib/duckdb/connection.rb
|
120
|
+
- lib/duckdb/converter.rb
|
115
121
|
- lib/duckdb/database.rb
|
116
122
|
- lib/duckdb/prepared_statement.rb
|
117
123
|
- lib/duckdb/result.rb
|
@@ -138,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
144
|
- !ruby/object:Gem::Version
|
139
145
|
version: '0'
|
140
146
|
requirements: []
|
141
|
-
rubygems_version: 3.
|
147
|
+
rubygems_version: 3.3.10
|
142
148
|
signing_key:
|
143
149
|
specification_version: 4
|
144
150
|
summary: This module is Ruby binding for DuckDB database engine.
|