activerecord-singlestore 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d77662b66894082d8d02b16f90f7304fe01aea347b796c87d420bb5de4049969
4
+ data.tar.gz: 4b980242a1192d23e195bd12a7a15a1e96038ddcdf1effc08e711bbbaff3bc4b
5
+ SHA512:
6
+ metadata.gz: 4ce79be52692e3cb61100be4657de0deda3608f69e271265e6ba54bd8bc14954b68cba53d393c79057a38b75a4a53725885e5c87e7f9885ddb9c63e1a9f40c0b
7
+ data.tar.gz: 55cdd57d80a32191a8d7a0a0d4b7f6a4567b02a6a2dbd031a389c304ba12d785de90ff85ea5abb3527752397663fc9aa99fd5862f9ffdf70c76313d2c9b05532
@@ -0,0 +1,11 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module Singlestore
4
+ class SchemaCreation < SchemaCreation
5
+ def table_modifier_in_create(o)
6
+ " ROWSTORE" if o.rowstore
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module Singlestore
4
+ class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
5
+ attr_reader :rowstore
6
+
7
+ def initialize(
8
+ conn,
9
+ name,
10
+ temporary: false,
11
+ if_not_exists: false,
12
+ options: nil,
13
+ rowstore: nil,
14
+ as: nil,
15
+ comment: nil,
16
+ **
17
+ )
18
+ @conn = conn
19
+ @columns_hash = {}
20
+ @indexes = []
21
+ @foreign_keys = []
22
+ @primary_keys = nil
23
+ @check_constraints = []
24
+ @temporary = temporary
25
+ @if_not_exists = if_not_exists
26
+ @options = options
27
+ @rowstore = rowstore
28
+ @as = as
29
+ @name = name
30
+ @comment = comment
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/abstract_mysql_adapter"
4
+ require "active_record/connection_adapters/mysql2_adapter"
5
+ require "active_record/connection_adapters/mysql/database_statements"
6
+ require "active_record/connection_adapters/singlestore/schema_creation"
7
+ require "active_record/connection_adapters/singlestore/table_definition"
8
+
9
+ gem "mysql2", ">= 0.4.4"
10
+
11
+ module ActiveRecord
12
+ module ConnectionHandling # :nodoc:
13
+ ER_BAD_DB_ERROR = 1049
14
+
15
+ # Establishes a connection to the database that's used by all Active Record objects.
16
+ def singlestore_connection(config)
17
+ config = config.symbolize_keys
18
+
19
+ config[:username] = "root" if config[:username].nil?
20
+ config[:flags] ||= 0
21
+ config[:variables] = {sql_mode: ''} if config[:variables].nil?
22
+
23
+ if config[:flags].kind_of? Array
24
+ config[:flags].push "FOUND_ROWS"
25
+ else
26
+ config[:flags] |= Mysql2::Client::FOUND_ROWS
27
+ end
28
+
29
+ client = Mysql2::Client.new(config)
30
+ ConnectionAdapters::SinglestoreAdapter.new(client, logger, nil, config)
31
+ rescue Mysql2::Error => error
32
+ if error.error_number == ER_BAD_DB_ERROR
33
+ raise ActiveRecord::NoDatabaseError
34
+ else
35
+ raise
36
+ end
37
+ end
38
+ end
39
+
40
+ module ConnectionAdapters
41
+ class SinglestoreAdapter < AbstractMysqlAdapter
42
+ ADAPTER_NAME = "SingleStore"
43
+
44
+ include MySQL::DatabaseStatements
45
+
46
+ def initialize(connection, logger, connection_options, config)
47
+ superclass_config = config.reverse_merge(prepared_statements: false)
48
+ super(connection, logger, connection_options, superclass_config)
49
+ configure_connection
50
+ end
51
+
52
+ def self.database_exists?(config)
53
+ !!ActiveRecord::Base.singlestore_connection(config)
54
+ rescue ActiveRecord::NoDatabaseError
55
+ false
56
+ end
57
+
58
+ def supports_json?
59
+ !mariadb? && database_version >= "5.7.8"
60
+ end
61
+
62
+ def supports_comments?
63
+ true
64
+ end
65
+
66
+ def supports_comments_in_create?
67
+ true
68
+ end
69
+
70
+ def supports_savepoints?
71
+ true
72
+ end
73
+
74
+ def supports_lazy_transactions?
75
+ true
76
+ end
77
+
78
+ def supports_advisory_locks?
79
+ false
80
+ end
81
+
82
+ # HELPER METHODS ===========================================
83
+
84
+ def each_hash(result) # :nodoc:
85
+ if block_given?
86
+ result.each(as: :hash, symbolize_keys: true) do |row|
87
+ yield row
88
+ end
89
+ else
90
+ to_enum(:each_hash, result)
91
+ end
92
+ end
93
+
94
+ def error_number(exception)
95
+ exception.error_number if exception.respond_to?(:error_number)
96
+ end
97
+
98
+ #--
99
+ # QUOTING ==================================================
100
+ #++
101
+
102
+ def quote_string(string)
103
+ @connection.escape(string)
104
+ end
105
+
106
+ #--
107
+ # CONNECTION MANAGEMENT ====================================
108
+ #++
109
+
110
+ def active?
111
+ @connection.ping
112
+ end
113
+
114
+ def reconnect!
115
+ super
116
+ disconnect!
117
+ connect
118
+ end
119
+ alias :reset! :reconnect!
120
+
121
+ # Disconnects from the database if already connected.
122
+ # Otherwise, this method does nothing.
123
+ def disconnect!
124
+ super
125
+ @connection.close
126
+ end
127
+
128
+ def discard! # :nodoc:
129
+ super
130
+ @connection.automatic_close = false
131
+ @connection = nil
132
+ end
133
+
134
+ def schema_creation
135
+ ActiveRecord::ConnectionAdapters::Singlestore::SchemaCreation.new(self)
136
+ end
137
+
138
+ def create_table_definition(name, **options)
139
+ ActiveRecord::ConnectionAdapters::Singlestore::TableDefinition.new(self, name, **options)
140
+ end
141
+
142
+ def extract_table_options!(options)
143
+ options.extract!(:temporary, :if_not_exists, :options, :as, :comment, :charset, :collation, :rowstore)
144
+ end
145
+
146
+ private
147
+
148
+ def connect
149
+ @connection = Mysql2::Client.new(@config)
150
+ configure_connection
151
+ end
152
+
153
+ def configure_connection
154
+ @connection.query_options[:as] = :array
155
+ super
156
+ end
157
+
158
+ def full_version
159
+ schema_cache.database_version.full_version_string
160
+ end
161
+
162
+ def get_full_version
163
+ @connection.server_info[:version]
164
+ end
165
+ end
166
+ end
167
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-singlestore
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jens Dahl Mollerhoj
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-02-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activerecord
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 6.0.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 6.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: mysql2
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.4.4
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.4.4
83
+ description: The ActiveRecod SinglestoreAdapter is an ActiveRecord connection adapter
84
+ based on the Mysql2 adapter.
85
+ email:
86
+ - mollerhoj3@gmail.com
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - lib/active_record/connection_adapters/singlestore/schema_creation.rb
92
+ - lib/active_record/connection_adapters/singlestore/table_definition.rb
93
+ - lib/active_record/connection_adapters/singlestore_adapter.rb
94
+ homepage: https://github.com/mollerhoj/activerecord-single-store
95
+ licenses:
96
+ - MIT
97
+ metadata:
98
+ allowed_push_host: https://rubygems.org
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.4.1
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: ActiveRecord SinglestoreAdapter
118
+ test_files: []