Class: PLSQL::Schema

Inherits:
Object
  • Object
show all
Includes:
SQLStatements
Defined in:
lib/plsql/schema.rb

Constant Summary collapse

DBMS_OUTPUT_MAX_LINES =

Maximum line numbers for DBMS_OUTPUT in one PL/SQL call (from DBMSOUTPUT_LINESARRAY type)

2147483647
@@schemas =
{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from SQLStatements

#commit, #execute, #rollback, #rollback_to, #savepoint, #select, #select_all, #select_first, #select_one

Constructor Details

#initialize(raw_conn = nil, schema = nil, original_schema = nil) ⇒ Schema

:nodoc:



18
19
20
21
22
23
# File 'lib/plsql/schema.rb', line 18

def initialize(raw_conn = nil, schema = nil, original_schema = nil) # :nodoc:
  self.connection = raw_conn
  @schema_name = schema ? schema.to_s.upcase : nil
  @original_schema = original_schema
  @dbms_output_stream = nil
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object (private)

Raises:

  • (ArgumentError)


183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/plsql/schema.rb', line 183

def method_missing(method, *args, &block)
  raise ArgumentError, "No database connection" unless connection
  # search in database if not in cache at first
  object = (@schema_objects[method] ||= find_database_object(method) || find_other_schema(method) ||
     find_public_synonym(method) || find_standard_procedure(method))

  raise ArgumentError, "No database object '#{method.to_s.upcase}' found" unless object

  if object.is_a?(Procedure)
    object.exec(*args, &block)
  elsif object.is_a?(Type) && !args.empty?
    object.new(*args, &block)
  else
    object
  end
end

Instance Attribute Details

#connectionObject

Returns connection wrapper object (this is not raw OCI8 or JDBC connection!)



26
27
28
# File 'lib/plsql/schema.rb', line 26

def connection
  @connection
end

Class Method Details

.find_or_new(connection_alias) ⇒ Object

:nodoc:



8
9
10
11
12
13
14
15
# File 'lib/plsql/schema.rb', line 8

def find_or_new(connection_alias) # :nodoc:
  connection_alias ||= :default
  if @@schemas[connection_alias]
    @@schemas[connection_alias]
  else
    @@schemas[connection_alias] = self.new
  end
end

Instance Method Details

#activerecord_class=(ar_class) ⇒ Object

Set connection to current ActiveRecord connection (use in initializer file):

plsql.activerecord_class = ActiveRecord::Base


78
79
80
81
82
# File 'lib/plsql/schema.rb', line 78

def activerecord_class=(ar_class)
  @connection = ar_class ? Connection.create(nil, ar_class) : nil
  reset_instance_variables
  ar_class
end

#connect!(*args) ⇒ Object

Create new OCI8 or JDBC connection using one of the following ways:

plsql.connect! username, password, database_tns_alias
plsql.connect! username, password, :host => host, :port => port, :database => database
plsql.connect! :username => username, :password => password, :database => database_tns_alias
plsql.connect! :username => username, :password => password, :host => host, :port => port, :database => database

Raises:

  • (ArgumentError)


64
65
66
67
68
69
70
71
72
# File 'lib/plsql/schema.rb', line 64

def connect!(*args)
  params = {}
  params[:username] = args.shift if args[0].is_a?(String)
  params[:password] = args.shift if args[0].is_a?(String)
  params[:database] = args.shift if args[0].is_a?(String)
  params.merge!(args.shift) if args[0].is_a?(Hash)
  raise ArgumentError, "Wrong number of arguments" unless args.empty?
  self.connection = Connection.create_new(params)
end

#dbms_output_buffer_sizeObject

DBMS_OUTPUT buffer size (default is 20_000)



132
133
134
135
136
137
138
# File 'lib/plsql/schema.rb', line 132

def dbms_output_buffer_size
  if @original_schema
    @original_schema.dbms_output_buffer_size
  else
    @dbms_output_buffer_size || 20_000
  end
end

#dbms_output_buffer_size=(value) ⇒ Object

Seet DBMS_OUTPUT buffer size (default is 20_000). Example:

plsql.dbms_output_buffer_size = 100_000


144
145
146
# File 'lib/plsql/schema.rb', line 144

def dbms_output_buffer_size=(value)
  @dbms_output_buffer_size = value
end

#dbms_output_streamObject

IO stream where to log DBMS_OUTPUT from PL/SQL procedures.



163
164
165
166
167
168
169
# File 'lib/plsql/schema.rb', line 163

def dbms_output_stream
  if @original_schema
    @original_schema.dbms_output_stream
  else
    @dbms_output_stream
  end
end

#dbms_output_stream=(stream) ⇒ Object

Specify IO stream where to log DBMS_OUTPUT from PL/SQL procedures. Example:

plsql.dbms_output_stream = STDOUT


155
156
157
158
159
160
# File 'lib/plsql/schema.rb', line 155

def dbms_output_stream=(stream)
  @dbms_output_stream = stream
  if @dbms_output_stream.nil? && @connection
    sys.dbms_output.disable
  end
end

#default_timezoneObject

Default timezone to which database values will be converted - :utc or :local



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/plsql/schema.rb', line 97

def default_timezone
  if @original_schema
    @original_schema.default_timezone
  else
    @default_timezone ||
      # Use ActiveRecord default_timezone when ActiveRecord connection is used.
      # Prefer the module-level accessor (AR 7.0+; the only one in AR 8.0+) so
      # that AR 7.0/7.1's deprecation warning for ActiveRecord::Base.default_timezone
      # is not emitted. Fall back to the per-class accessor only on pre-7.0 AR,
      # where ActiveRecord.default_timezone does not exist.
      (@connection && @connection.activerecord_class &&
        (ActiveRecord.respond_to?(:default_timezone) ?
          ActiveRecord.default_timezone :
          @connection.activerecord_class.default_timezone)) ||
      # default to local timezone
      :local
  end
end

#default_timezone=(value) ⇒ Object

Set default timezone to which database values will be converted - :utc or :local



117
118
119
120
121
122
123
# File 'lib/plsql/schema.rb', line 117

def default_timezone=(value)
  if [:local, :utc].include?(value)
    @default_timezone = value
  else
    raise ArgumentError, "default timezone should be :local or :utc"
  end
end

#local_timezone_offsetObject

Same implementation as for ActiveRecord DateTimes aren’t aware of DST rules, so use a consistent non-DST offset when creating a DateTime with an offset in the local zone



127
128
129
# File 'lib/plsql/schema.rb', line 127

def local_timezone_offset # :nodoc:
  ::Time.local(2007).utc_offset.to_r / 86400
end

#logoffObject

Disconnect from Oracle



85
86
87
88
# File 'lib/plsql/schema.rb', line 85

def logoff
  @connection.logoff
  self.connection = nil
end

#raw_connection=(raw_conn) ⇒ Object

:nodoc:



32
33
34
35
# File 'lib/plsql/schema.rb', line 32

def raw_connection=(raw_conn) # :nodoc:
  @connection = raw_conn ? Connection.create(raw_conn) : nil
  reset_instance_variables
end

#root_schemaObject

:nodoc:



28
29
30
# File 'lib/plsql/schema.rb', line 28

def root_schema # :nodoc:
  @original_schema || self
end

#schema_nameObject

Current Oracle schema name



91
92
93
94
# File 'lib/plsql/schema.rb', line 91

def schema_name
  return nil unless connection
  @schema_name ||= select_first("SELECT SYS_CONTEXT('userenv','current_schema') FROM dual")[0]
end