avm-oracle 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2f513d5b36afa884c20e99b02b53c422074007838b7ebd5fed34adada19105e2
4
+ data.tar.gz: 9c197d66a729454b652f5e66a8b594050a368fc09f751b29429a1b40dc4fa467
5
+ SHA512:
6
+ metadata.gz: 847b3d4375508af211ee279346749064eb4fe4c08c1139895357b3a5ac2c31b78cb677a6514b9b66d1f506c4f53cc0866f6f0e4d0fa3cd3602ab52bdddb43043
7
+ data.tar.gz: c6d66f355ca37810860db5bf1cf503f37d6442a74799b264cdc5b0a3fe98c7f4e4cca848c926d8aed8d0d3fdf715d8ed75209bba8b5af071725b8b406924eb0c
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module Oracle
5
+ class Connection
6
+ class Cursor < ::SimpleDelegator
7
+ def fetch_hash
8
+ sanitized_fetch_hash
9
+ end
10
+
11
+ def sanitized_fetch_hash
12
+ r = super_fetch_hash
13
+ return nil if r.nil?
14
+
15
+ r.map { |k, v| [k.downcase.to_sym, v] }.to_h
16
+ end
17
+
18
+ def super_fetch_hash
19
+ __getobj__.fetch_hash
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/oracle/query_builder'
4
+ require 'oci8'
5
+
6
+ module Avm
7
+ module Oracle
8
+ class Connection
9
+ require_sub __FILE__
10
+ delegate :exec, to: :connection
11
+
12
+ def initialize(connection_string)
13
+ @connection = ::OCI8.new(connection_string)
14
+ end
15
+
16
+ def first_row(query_sql, query_args = {})
17
+ query(query_sql, query_args) { |row| return row }
18
+ nil
19
+ end
20
+
21
+ def first_value(query_sql, query_args = {})
22
+ first_row(query_sql, query_args).if_present(&:first)
23
+ end
24
+
25
+ def query(query_sql, query_args = {}, &block)
26
+ if block
27
+ query_with_block(query_sql, query_args, block)
28
+ else
29
+ query_without_block(query_sql, query_args)
30
+ end
31
+ end
32
+
33
+ def objects
34
+ @objects ||= ::Avm::Oracle::Objects.new(self)
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :connection
40
+
41
+ # @return [Avm::Oracle::Connection::Cursor]
42
+ def query_without_block(query_sql, query_args)
43
+ query_builder = ::Avm::Oracle::QueryBuilder.new(query_sql, query_args)
44
+ Avm::Oracle::Connection::Cursor.new(
45
+ connection.exec(query_builder.oci8_exec_sql, *query_builder.oci8_exec_bind_vars)
46
+ )
47
+ end
48
+
49
+ def query_with_block(query_sql, query_args, block)
50
+ cursor = query_without_block(query_sql, query_args)
51
+ begin
52
+ while (row = cursor.fetch_hash)
53
+ block.call(row)
54
+ end
55
+ ensure
56
+ cursor.close
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module Oracle
5
+ class ConnectionStringBuilder
6
+ DEFAULT_PORT = 1521
7
+
8
+ FIELDS = %w[user password host port service_name].freeze
9
+
10
+ attr_accessor(*FIELDS)
11
+ attr_accessor :string
12
+
13
+ def initialize(options = nil)
14
+ if options.is_a?(String)
15
+ self.string = options
16
+ elsif options.is_a?(Hash)
17
+ options.each do |k, v|
18
+ send("#{k}=", v)
19
+ end
20
+ end
21
+ end
22
+
23
+ def port
24
+ @port || DEFAULT_PORT
25
+ end
26
+
27
+ def build
28
+ if string
29
+ string
30
+ else
31
+ validate_fields
32
+ "#{user}/#{password}@//#{host}:#{port}/#{service_name}"
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def validate_fields
39
+ FIELDS.each { |f| raise "\"#{f}\" is blank" if send(f).blank? }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/instances/base'
4
+ require 'avm/oracle/connection'
5
+ require 'avm/oracle/connection_string_builder'
6
+ require 'eac_ruby_utils/core_ext'
7
+
8
+ module Avm
9
+ module Oracle
10
+ module Instances
11
+ class Base < ::Avm::Instances::Base
12
+ def database_connection
13
+ ::Avm::Oracle::Connection.new(database_connection_string)
14
+ end
15
+
16
+ def database_connection_string
17
+ ::Avm::Oracle::ConnectionStringBuilder.new(
18
+ host: database_hostname,
19
+ port: database_port,
20
+ user: database_username,
21
+ password: database_password,
22
+ service_name: database_name
23
+ ).build
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module Oracle
5
+ class QueryBuilder
6
+ common_constructor :sql, :bind_vars, default: [{}] do
7
+ self.bind_vars = bind_vars.with_indifferent_access
8
+ end
9
+
10
+ def oci8_exec_sql
11
+ sql
12
+ end
13
+
14
+ def oci8_exec_bind_vars
15
+ bind_vars_in_sql.map { |key| bind_vars.fetch(key) }
16
+ end
17
+
18
+ def bind_vars_in_sql
19
+ sql.scan(/:([a-z][a-z0-9_]*)/i).map(&:first)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module Oracle
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
data/lib/avm/oracle.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Oracle
7
+ require_sub __FILE__
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: avm-oracle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Put here the authors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eac_ruby_utils
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.93'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.93'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-oci8
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.2'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 2.2.11
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '2.2'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.2.11
47
+ - !ruby/object:Gem::Dependency
48
+ name: eac_ruby_gem_support
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.5'
61
+ description:
62
+ email:
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - lib/avm/oracle.rb
68
+ - lib/avm/oracle/connection.rb
69
+ - lib/avm/oracle/connection/cursor.rb
70
+ - lib/avm/oracle/connection_string_builder.rb
71
+ - lib/avm/oracle/instances/base.rb
72
+ - lib/avm/oracle/query_builder.rb
73
+ - lib/avm/oracle/version.rb
74
+ homepage:
75
+ licenses: []
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubygems_version: 3.1.6
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Put here de description.
96
+ test_files: []