activerecord-cubrid2-adapter 0.0.1
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 +7 -0
- data/.gitignore +19 -0
- data/LICENSE +21 -0
- data/README.md +63 -0
- data/Rakefile +11 -0
- data/VERSION +1 -0
- data/activerecord-cubrid2-adapter.gemspec +26 -0
- data/lib/active_record/connection_adapters/abstract_cubrid2_adapter.rb +750 -0
- data/lib/active_record/connection_adapters/cubrid2/column.rb +28 -0
- data/lib/active_record/connection_adapters/cubrid2/database_statements.rb +192 -0
- data/lib/active_record/connection_adapters/cubrid2/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/cubrid2/quoting.rb +118 -0
- data/lib/active_record/connection_adapters/cubrid2/schema_creation.rb +98 -0
- data/lib/active_record/connection_adapters/cubrid2/schema_definitions.rb +81 -0
- data/lib/active_record/connection_adapters/cubrid2/schema_dumper.rb +31 -0
- data/lib/active_record/connection_adapters/cubrid2/schema_statements.rb +276 -0
- data/lib/active_record/connection_adapters/cubrid2/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/cubrid2/version.rb +7 -0
- data/lib/active_record/connection_adapters/cubrid2_adapter.rb +169 -0
- data/lib/activerecord-cubrid2-adapter.rb +4 -0
- data/lib/arel/visitors/cubrid.rb +67 -0
- data/lib/cubrid2/client.rb +93 -0
- data/lib/cubrid2/console.rb +5 -0
- data/lib/cubrid2/error.rb +86 -0
- data/lib/cubrid2/field.rb +3 -0
- data/lib/cubrid2/result.rb +7 -0
- data/lib/cubrid2/statement.rb +11 -0
- data/lib/cubrid2/version.rb +3 -0
- data/lib/cubrid2.rb +76 -0
- data/tests/Gemfile +10 -0
- data/tests/test_activerecord.rb +109 -0
- metadata +102 -0
@@ -0,0 +1,86 @@
|
|
1
|
+
module Cubrid2
|
2
|
+
class Error < StandardError
|
3
|
+
ENCODE_OPTS = {
|
4
|
+
undef: :replace,
|
5
|
+
invalid: :replace,
|
6
|
+
replace: '?'.freeze
|
7
|
+
}.freeze
|
8
|
+
|
9
|
+
ConnectionError = Class.new(Error)
|
10
|
+
TimeoutError = Class.new(Error)
|
11
|
+
|
12
|
+
attr_reader :error_number, :sql_state
|
13
|
+
|
14
|
+
######################################
|
15
|
+
# ### CUBRID Error codes
|
16
|
+
# from ext/error.c
|
17
|
+
|
18
|
+
# {-1, "CUBRID database error"},
|
19
|
+
# {-2, "Invalid connection handle"},
|
20
|
+
# {-3, "Memory allocation error"},
|
21
|
+
# {-4, "Communication error"},
|
22
|
+
# {-5, "No more data"},
|
23
|
+
# {-6, "Unknown transaction type"},
|
24
|
+
# {-7, "Invalid string parameter"},
|
25
|
+
# {-8, "Type conversion error"},
|
26
|
+
# {-9, "Parameter binding error"},
|
27
|
+
# {-10, "Invalid type"},
|
28
|
+
# {-11, "Parameter binding error"},
|
29
|
+
# {-12, "Invalid database parameter name"},
|
30
|
+
# {-13, "Invalid column index"},
|
31
|
+
# {-14, "Invalid schema type"},
|
32
|
+
# {-15, "File open error"},
|
33
|
+
# {-16, "Connection error"},
|
34
|
+
# {-17, "Connection handle creation error"},
|
35
|
+
# {-18, "Invalid request handle"},
|
36
|
+
# {-19, "Invalid cursor position"},
|
37
|
+
# {-20, "Object is not valid"},
|
38
|
+
# {-21, "CAS error"},
|
39
|
+
# {-22, "Unknown host name"},
|
40
|
+
# {-99, "Not implemented"},
|
41
|
+
# {-1000, "Database connection error"},
|
42
|
+
# {-1002, "Memory allocation error"},
|
43
|
+
# {-1003, "Communication error"},
|
44
|
+
# {-1004, "Invalid argument"},
|
45
|
+
# {-1005, "Unknown transaction type"},
|
46
|
+
# {-1007, "Parameter binding error"},
|
47
|
+
# {-1008, "Parameter binding error"},
|
48
|
+
# {-1009, "Cannot make DB_VALUE"},
|
49
|
+
# {-1010, "Type conversion error"},
|
50
|
+
# {-1011, "Invalid database parameter name"},
|
51
|
+
# {-1012, "No more data"},
|
52
|
+
# {-1013, "Object is not valid"},
|
53
|
+
# {-1014, "File open error"},
|
54
|
+
# {-1015, "Invalid schema type"},
|
55
|
+
# {-1016, "Version mismatch"},
|
56
|
+
# {-1017, "Cannot process the request. Try again later."},
|
57
|
+
# {-1018, "Authorization error"},
|
58
|
+
# {-1020, "The attribute domain must be the set type."},
|
59
|
+
# {-1021, "The domain of a set must be the same data type."},
|
60
|
+
# {-2001, "Memory allocation error"},
|
61
|
+
# {-2002, "Invalid API call"},
|
62
|
+
# {-2003, "Cannot get column info"},
|
63
|
+
# {-2004, "Array initializing error"},
|
64
|
+
# {-2005, "Unknown column type"},
|
65
|
+
# {-2006, "Invalid parameter"},
|
66
|
+
# {-2007, "Invalid array type"},
|
67
|
+
# {-2008, "Invalid type"},
|
68
|
+
# {-2009, "File open error"},
|
69
|
+
# {-2010, "Temporary file open error"},
|
70
|
+
# {-2011, "Glo transfering error"},
|
71
|
+
# {0, "Unknown Error"}
|
72
|
+
######################################
|
73
|
+
|
74
|
+
# cubrid gem compatibility
|
75
|
+
alias err_code error_number
|
76
|
+
alias err_msg message
|
77
|
+
|
78
|
+
def initialize(msg, server_version = nil, error_number = nil, sql_state = nil)
|
79
|
+
@server_version = server_version
|
80
|
+
@error_number = error_number
|
81
|
+
@sql_state = sql_state ? sql_state.encode(**ENCODE_OPTS) : nil
|
82
|
+
|
83
|
+
super msg
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/cubrid2.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'bigdecimal'
|
3
|
+
|
4
|
+
# Load libcubrid.dll before requiring cubrid/cubrid.so
|
5
|
+
# This gives a chance to be flexible about the load path
|
6
|
+
# Or to bomb out with a clear error message instead of a linker crash
|
7
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
8
|
+
dll_path = if ENV['RUBY_CUBRID_LIBCUBRID_DLL']
|
9
|
+
# If this environment variable is set, it overrides any other paths
|
10
|
+
# The user is advised to use backslashes not forward slashes
|
11
|
+
ENV['RUBY_CUBRID_LIBCUBRID_DLL']
|
12
|
+
elsif File.exist?(File.expand_path('../vendor/libcubrid.dll', File.dirname(__FILE__)))
|
13
|
+
# Use vendor/libcubrid.dll if it exists, convert slashes for Win32 LoadLibrary
|
14
|
+
File.expand_path('../vendor/libcubrid.dll', File.dirname(__FILE__))
|
15
|
+
# elsif defined?(RubyInstaller)
|
16
|
+
# RubyInstaller-2.4+ native build doesn't need DLL preloading
|
17
|
+
# else
|
18
|
+
# This will use default / system library paths
|
19
|
+
'../vendor/libcubrid.dll'
|
20
|
+
end
|
21
|
+
|
22
|
+
if dll_path
|
23
|
+
require 'fiddle'
|
24
|
+
kernel32 = Fiddle.dlopen 'kernel32'
|
25
|
+
load_library = Fiddle::Function.new(
|
26
|
+
kernel32['LoadLibraryW'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT
|
27
|
+
)
|
28
|
+
abort "Failed to load libcubrid.dll from #{dll_path}" if load_library.call(dll_path.encode('utf-16le')).zero?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# load c extension
|
33
|
+
gem 'cubrid', '>= 10.0'
|
34
|
+
require 'cubrid'
|
35
|
+
|
36
|
+
require 'cubrid2/version' unless defined? Cubrid2::VERSION
|
37
|
+
require 'cubrid2/error'
|
38
|
+
require 'cubrid2/result'
|
39
|
+
require 'cubrid2/client'
|
40
|
+
require 'cubrid2/field'
|
41
|
+
require 'cubrid2/statement'
|
42
|
+
|
43
|
+
# = cubrid
|
44
|
+
#
|
45
|
+
# A modern, simple and very fast Cubrid library for Ruby - binding to libcubrid
|
46
|
+
module Cubrid2
|
47
|
+
end
|
48
|
+
|
49
|
+
# For holding utility methods
|
50
|
+
module Cubrid2
|
51
|
+
module Util
|
52
|
+
#
|
53
|
+
# Rekey a string-keyed hash with equivalent symbols.
|
54
|
+
#
|
55
|
+
def self.key_hash_as_symbols(hash)
|
56
|
+
return nil unless hash
|
57
|
+
|
58
|
+
Hash[hash.map { |k, v| [k.to_sym, v] }]
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# In Cubrid2::Client#query and Cubrid2::Statement#execute,
|
63
|
+
# Thread#handle_interrupt is used to prevent Timeout#timeout
|
64
|
+
# from interrupting query execution.
|
65
|
+
#
|
66
|
+
# Timeout::ExitException was removed in Ruby 2.3.0, 2.2.3, and 2.1.8,
|
67
|
+
# but is present in earlier 2.1.x and 2.2.x, so we provide a shim.
|
68
|
+
#
|
69
|
+
require 'timeout'
|
70
|
+
TIMEOUT_ERROR_CLASS = if defined?(::Timeout::ExitException)
|
71
|
+
::Timeout::ExitException
|
72
|
+
else
|
73
|
+
::Timeout::Error
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/tests/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# I cloned from original cubrid-ruby git repository to test
|
4
|
+
# git clone https://github.com/CUBRID/cubrid-ruby.git
|
5
|
+
gem 'cubrid', path: '/opt/cubrid/cubrid-ruby'
|
6
|
+
|
7
|
+
gem 'activerecord', '~> 6.0'
|
8
|
+
gem 'activerecord-cubrid2-adapter', path: '../'
|
9
|
+
gem 'test-unit'
|
10
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require 'active_record'
|
5
|
+
require 'activerecord-cubrid2-adapter'
|
6
|
+
|
7
|
+
require 'benchmark'
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
TABLE_NAME = 'cubrid_tests'
|
11
|
+
|
12
|
+
class CubridTest < ActiveRecord::Base
|
13
|
+
self.table_name = TABLE_NAME
|
14
|
+
end
|
15
|
+
|
16
|
+
class CUBRID_ActiveRecordTest < Test::Unit::TestCase
|
17
|
+
def setup
|
18
|
+
puts '### setup '
|
19
|
+
puts "-- activerecord-cubrid2-adapter version: #{ActiveRecord::ConnectionAdapters::Cubrid2::VERSION}"
|
20
|
+
|
21
|
+
adapter = ActiveRecord::Base.establish_connection(
|
22
|
+
adapter: 'cubrid2',
|
23
|
+
host: 'localhost',
|
24
|
+
username: 'dba',
|
25
|
+
password: '',
|
26
|
+
database: 'testdb'
|
27
|
+
)
|
28
|
+
|
29
|
+
@con = adapter.connection
|
30
|
+
|
31
|
+
puts "-- cubrid server version: #{@con.server_version}"
|
32
|
+
puts "-- charset: #{@con.charset}"
|
33
|
+
puts "-- collation: #{@con.collation}"
|
34
|
+
|
35
|
+
ActiveRecord::Base.connection.drop_table TABLE_NAME if ActiveRecord::Base.connection.table_exists?(TABLE_NAME)
|
36
|
+
|
37
|
+
ActiveRecord::Base.connection.create_table TABLE_NAME do |t|
|
38
|
+
t.string :name
|
39
|
+
t.text :body
|
40
|
+
t.timestamps
|
41
|
+
end
|
42
|
+
|
43
|
+
exists = ActiveRecord::Base.connection.table_exists?(TABLE_NAME)
|
44
|
+
assert(exists, 'Table not found')
|
45
|
+
end
|
46
|
+
|
47
|
+
def teardown
|
48
|
+
puts '### teardown '
|
49
|
+
|
50
|
+
@con.close
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_insert
|
54
|
+
puts '### test_insert'
|
55
|
+
|
56
|
+
cnt = CubridTest.count
|
57
|
+
|
58
|
+
p = CubridTest.new
|
59
|
+
p.name = 'test11'
|
60
|
+
p.save!
|
61
|
+
|
62
|
+
test1 = CubridTest.create!(name: 'test1', body: 'test1')
|
63
|
+
puts "inserted id: #{test1.id}"
|
64
|
+
|
65
|
+
test2 = CubridTest.create!(name: 'test2', body: '한글2')
|
66
|
+
puts "inserted id: #{test2.id}"
|
67
|
+
|
68
|
+
test3 = CubridTest.create!(name: 'test3', body: '中文3')
|
69
|
+
puts "inserted id: #{test3.id}"
|
70
|
+
|
71
|
+
test2_1 = CubridTest.where("name = 'test2'").first
|
72
|
+
pp test2_1
|
73
|
+
|
74
|
+
test3_1 = CubridTest.where("name = 'test3'").first
|
75
|
+
pp test3_1
|
76
|
+
|
77
|
+
assert(CubridTest.count == (cnt + 4), 'Table row count mismatch')
|
78
|
+
|
79
|
+
CubridTest.destroy_all
|
80
|
+
|
81
|
+
assert(CubridTest.count == 0, 'Table row count mismatch')
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_benchmark_insert
|
85
|
+
puts '### test_benchmark_insert'
|
86
|
+
|
87
|
+
@max_insert = 10
|
88
|
+
|
89
|
+
count1 = CubridTest.count
|
90
|
+
|
91
|
+
Benchmark.bm do |x|
|
92
|
+
x.report do
|
93
|
+
(1..@max_insert).each do |i|
|
94
|
+
puts "#{i}th test"
|
95
|
+
p = CubridTest.new
|
96
|
+
p.name = 'test11'
|
97
|
+
p.save!
|
98
|
+
puts "inserted id: #{p.id}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
count2 = CubridTest.count
|
104
|
+
inserted_count = (count2 - count1)
|
105
|
+
|
106
|
+
puts "### #{inserted_count} rows inserted"
|
107
|
+
assert(inserted_count == @max_insert, 'inserted rows mismatch!')
|
108
|
+
end
|
109
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activerecord-cubrid2-adapter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eui-Taik Na
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-01-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: cubrid
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: ActiveRecord Cubrid Adapter. Cubrid 9 and upward. Based on cubrid gem.
|
42
|
+
email:
|
43
|
+
- damulhan@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- LICENSE
|
50
|
+
- README.md
|
51
|
+
- Rakefile
|
52
|
+
- VERSION
|
53
|
+
- activerecord-cubrid2-adapter.gemspec
|
54
|
+
- lib/active_record/connection_adapters/abstract_cubrid2_adapter.rb
|
55
|
+
- lib/active_record/connection_adapters/cubrid2/column.rb
|
56
|
+
- lib/active_record/connection_adapters/cubrid2/database_statements.rb
|
57
|
+
- lib/active_record/connection_adapters/cubrid2/explain_pretty_printer.rb
|
58
|
+
- lib/active_record/connection_adapters/cubrid2/quoting.rb
|
59
|
+
- lib/active_record/connection_adapters/cubrid2/schema_creation.rb
|
60
|
+
- lib/active_record/connection_adapters/cubrid2/schema_definitions.rb
|
61
|
+
- lib/active_record/connection_adapters/cubrid2/schema_dumper.rb
|
62
|
+
- lib/active_record/connection_adapters/cubrid2/schema_statements.rb
|
63
|
+
- lib/active_record/connection_adapters/cubrid2/type_metadata.rb
|
64
|
+
- lib/active_record/connection_adapters/cubrid2/version.rb
|
65
|
+
- lib/active_record/connection_adapters/cubrid2_adapter.rb
|
66
|
+
- lib/activerecord-cubrid2-adapter.rb
|
67
|
+
- lib/arel/visitors/cubrid.rb
|
68
|
+
- lib/cubrid2.rb
|
69
|
+
- lib/cubrid2/client.rb
|
70
|
+
- lib/cubrid2/console.rb
|
71
|
+
- lib/cubrid2/error.rb
|
72
|
+
- lib/cubrid2/field.rb
|
73
|
+
- lib/cubrid2/result.rb
|
74
|
+
- lib/cubrid2/statement.rb
|
75
|
+
- lib/cubrid2/version.rb
|
76
|
+
- tests/Gemfile
|
77
|
+
- tests/test_activerecord.rb
|
78
|
+
homepage: https://github.com/damulhan/activerecord-cubrid2-adapter
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
- GPL-2.0
|
82
|
+
metadata: {}
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 2.5.0
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubygems_version: 3.3.7
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: ActiveRecord Cubrid Adapter.
|
102
|
+
test_files: []
|