avm-oracle 0.1.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: 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: []