drysql 0.1.3 → 0.1.4
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.
data/lib/associations.rb
CHANGED
@@ -16,6 +16,11 @@ module ActiveRecord
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def clear_cached_associations
|
20
|
+
@associations = nil
|
21
|
+
logger.info("Cleared cached schema for: #{self}")
|
22
|
+
end
|
23
|
+
|
19
24
|
def is_associated_with(class_name_symbol)
|
20
25
|
!(reflections.detect {|key, reflection| key.to_s.singularize == class_name_symbol.to_s.singularize}).nil?
|
21
26
|
end
|
data/lib/base.rb
CHANGED
@@ -48,8 +48,10 @@ module ActiveRecord
|
|
48
48
|
# ---------------------------------------------------------------------------------------------------
|
49
49
|
def primary_key
|
50
50
|
primary = table_constraints.detect {|constraint| constraint.primary_key?}
|
51
|
+
if primary.nil? then logger.error("No primary key defined for table #{table_name}") end
|
51
52
|
primary_name = primary.column_name
|
52
53
|
set_primary_key(primary_name)
|
54
|
+
logger.info("Identified PRIMARY KEY for #{self}: #{primary_name}")
|
53
55
|
primary_name
|
54
56
|
end
|
55
57
|
|
@@ -91,12 +93,23 @@ module ActiveRecord
|
|
91
93
|
end
|
92
94
|
|
93
95
|
def table_exists?(table_name=nil)
|
94
|
-
|
95
|
-
connection.tables.include?
|
96
|
+
if connection.respond_to?(:tables)
|
97
|
+
connection.tables.include? table_name
|
96
98
|
else
|
97
99
|
false
|
98
100
|
end
|
99
101
|
end
|
102
|
+
|
103
|
+
def regenerate_cached_schema
|
104
|
+
clear_cached_associations
|
105
|
+
clear_cached_validations
|
106
|
+
@constraints = nil
|
107
|
+
@columns = nil
|
108
|
+
primary = table_constraints.detect {|constraint| constraint.primary_key?}
|
109
|
+
primary_name = primary.column_name
|
110
|
+
set_primary_key(primary_name)
|
111
|
+
logger.info("Reset PRIMARY KEY for #{self}: #{primary_name}")
|
112
|
+
end
|
100
113
|
|
101
114
|
|
102
115
|
private
|
@@ -121,10 +134,6 @@ module ActiveRecord
|
|
121
134
|
def pluralized_symbolized_class_name_from_table_name(table_name)
|
122
135
|
(class_name(table_name)).downcaseFirstLetter.pluralize.to_sym
|
123
136
|
end
|
124
|
-
|
125
|
-
def construct_table_name_from_class_name(class_name)
|
126
|
-
name = "#{table_name_prefix}#{undecorated_table_name(class_name)}#{table_name_suffix}"
|
127
|
-
end
|
128
137
|
|
129
138
|
end #end class << self (Class Methods)
|
130
139
|
|
@@ -6,10 +6,10 @@ module ActiveRecord
|
|
6
6
|
# databases compatible with the ISO SQL:2003 information schema standard
|
7
7
|
class AbstractTableConstraint
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
PRIMARY_KEY_TYPE = "PRIMARY KEY"
|
10
|
+
FOREIGN_KEY_TYPE = "FOREIGN KEY"
|
11
|
+
UNIQUE_KEY_TYPE = "UNIQUE"
|
12
|
+
CHECK_CONSTRAINT_TYPE = "CHECK"
|
13
13
|
|
14
14
|
attr_reader :constraint_catalog, :constraint_schema, :constraint_name, :constraint_type,
|
15
15
|
:table_catalog, :table_schema, :table_name, :column_name,
|
@@ -24,15 +24,15 @@ module ActiveRecord
|
|
24
24
|
alias :initialize :raise_subclass_responsibility_error
|
25
25
|
|
26
26
|
def primary_key?
|
27
|
-
constraint_type ==
|
27
|
+
constraint_type == PRIMARY_KEY_TYPE
|
28
28
|
end
|
29
29
|
|
30
30
|
def foreign_key?
|
31
|
-
constraint_type ==
|
31
|
+
constraint_type == FOREIGN_KEY_TYPE
|
32
32
|
end
|
33
33
|
|
34
34
|
def component_of_unique_key?
|
35
|
-
constraint_type ==
|
35
|
+
constraint_type == UNIQUE_KEY_TYPE
|
36
36
|
end
|
37
37
|
|
38
38
|
def unique_key?
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
|
3
|
+
module ConnectionAdapters
|
4
|
+
|
5
|
+
class OracleColumn < Column
|
6
|
+
|
7
|
+
attr_accessor :primary_key
|
8
|
+
|
9
|
+
def default_specified?
|
10
|
+
!default.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
# The only means that Oracle currently provides for auto-generating a column
|
14
|
+
# is to define a sequence and a trigger on insert that inserts sequence.nextval
|
15
|
+
#
|
16
|
+
# As a result of this, there is no reliable way to determine whether a particular
|
17
|
+
# column is generated by the DB.
|
18
|
+
#
|
19
|
+
# DrySQL currently makes the assumption that a column is auto-generated
|
20
|
+
# if the column is of type integer and is the primary key for the table
|
21
|
+
#
|
22
|
+
# Ideally a future release of Oracle will support declaring a default value
|
23
|
+
# of sequence.nextval for a column, which will eliminate this problem.
|
24
|
+
def generated?
|
25
|
+
@type == :integer && @primary_key == true
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
class OracleConstraint < AbstractTableConstraint
|
31
|
+
|
32
|
+
PRIMARY_KEY_TYPE = "P"
|
33
|
+
FOREIGN_KEY_TYPE = "R"
|
34
|
+
UNIQUE_KEY_TYPE = "U"
|
35
|
+
CHECK_CONSTRAINT_TYPE = "C"
|
36
|
+
|
37
|
+
def initialize(constraint_catalog, constraint_schema, constraint_name, table_schema, table_name, constraint_type,
|
38
|
+
column_name, referenced_table_schema, referenced_table_name, referenced_column_name)
|
39
|
+
@constraint_catalog = constraint_catalog
|
40
|
+
@constraint_schema = constraint_schema
|
41
|
+
@constraint_name = constraint_name
|
42
|
+
@table_schema = table_schema
|
43
|
+
@table_name = table_name
|
44
|
+
@constraint_type = constraint_type
|
45
|
+
@column_name = column_name
|
46
|
+
@referenced_table_schema = referenced_table_schema
|
47
|
+
@referenced_table_name = referenced_table_name
|
48
|
+
@referenced_column_name = referenced_column_name
|
49
|
+
end
|
50
|
+
|
51
|
+
def primary_key?
|
52
|
+
constraint_type == PRIMARY_KEY_TYPE
|
53
|
+
end
|
54
|
+
|
55
|
+
def foreign_key?
|
56
|
+
constraint_type == FOREIGN_KEY_TYPE
|
57
|
+
end
|
58
|
+
|
59
|
+
def component_of_unique_key?
|
60
|
+
constraint_type == UNIQUE_KEY_TYPE
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
class OracleAdapter < AbstractAdapter
|
66
|
+
|
67
|
+
alias :base_columns :columns
|
68
|
+
def columns(table_name, name = nil) #:nodoc:
|
69
|
+
columns = base_columns(table_name)
|
70
|
+
|
71
|
+
# This is a hack. Once Oracle offers a better means of auto-generating IDs,
|
72
|
+
# this will be fixed
|
73
|
+
# FIXME must be fixed once composite primary keys are supported
|
74
|
+
sql = "select t1.column_name from all_cons_columns t1 inner join all_constraints t2 on \
|
75
|
+
(t1.owner = t2.owner AND t1.constraint_name = t2.constraint_name) where t1.table_name='#{table_name}' and t2.constraint_type='P'"
|
76
|
+
primary_key_column_name = select_one(sql, "Primary Key")['column_name']
|
77
|
+
|
78
|
+
columns.each do |column|
|
79
|
+
column.primary_key=(oracle_downcase(primary_key_column_name) == column.name)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def constraints(table_name, name = nil)#:nodoc:
|
84
|
+
constraints = []
|
85
|
+
sql = "select t1.owner, t1.constraint_name, t1.constraint_type, t1.table_name, t1.r_owner, t1.r_constraint_name, \
|
86
|
+
t1.delete_rule, t2.column_name, t3.table_name as r_table_name, t3.column_name as r_column_name from all_constraints t1 \
|
87
|
+
inner join all_cons_columns t2 on ( t1.owner = t2.owner AND t1.constraint_name = t2.constraint_name) left outer join \
|
88
|
+
all_cons_columns t3 on (t1.r_owner = t3.owner AND t1.r_constraint_name = t3.constraint_name) where \
|
89
|
+
t1.table_name='#{table_name}' or t3.table_name='#{table_name}'"
|
90
|
+
|
91
|
+
results = select_all(sql, name)
|
92
|
+
constraint_name_hash = {}
|
93
|
+
results.each do |row|
|
94
|
+
|
95
|
+
# The author(s) of the Oracle adapter chose to selectively downcase column names for
|
96
|
+
# "cleanliness" within our Rails code. I had to follow suit with constraint column names
|
97
|
+
# so that model objects could look up their data values using the generated column accessor methods
|
98
|
+
row['column_name'] = oracle_downcase(row['column_name'])
|
99
|
+
unless row['r_column_name'].nil? then row['r_column_name'] = oracle_downcase(row['r_column_name']) end
|
100
|
+
|
101
|
+
constraints << OracleConstraint.new(nil, row['owner'], row['constraint_name'], row['owner'], row['table_name'],
|
102
|
+
row['constraint_type'], row['column_name'], row['r_owner'], row['r_table_name'], row['r_column_name'])
|
103
|
+
comparable_constraint_name = row['constraint_name'].upcase
|
104
|
+
constraint_name_count = constraint_name_hash[comparable_constraint_name]
|
105
|
+
constraint_name_count ?
|
106
|
+
constraint_name_hash[comparable_constraint_name] = constraint_name_count + 1 :
|
107
|
+
constraint_name_hash[comparable_constraint_name] = 1
|
108
|
+
end
|
109
|
+
|
110
|
+
constraints.each do | constraint|
|
111
|
+
constraint.member_of_composite=(constraint_name_hash[constraint.constraint_name.upcase] > 1)
|
112
|
+
end
|
113
|
+
constraints
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
@@ -38,6 +38,9 @@ module ActiveRecord
|
|
38
38
|
|
39
39
|
class PostgreSQLAdapter < AbstractAdapter
|
40
40
|
|
41
|
+
# FIXME
|
42
|
+
# patch postgresql_adapter so I don't need to re-define columns here in order
|
43
|
+
# to get sufficient column metadata
|
41
44
|
def columns(table_name, name = nil) #:nodoc:
|
42
45
|
columns = []
|
43
46
|
column_definitions(table_name).each do |name, type, default, notnull, typmod|
|
data/lib/drysql.rb
CHANGED
@@ -7,6 +7,7 @@ require 'connection_adapters/abstract_adapter'
|
|
7
7
|
require 'connection_adapters/mysql_adapter'
|
8
8
|
require 'connection_adapters/postgresql_adapter'
|
9
9
|
require 'connection_adapters/sqlserver_adapter'
|
10
|
+
require 'connection_adapters/oracle_adapter'
|
10
11
|
require 'connection_adapters/abstract/schema_definitions'
|
11
12
|
require 'associations'
|
12
13
|
require 'validations'
|
data/lib/validations.rb
CHANGED
@@ -99,7 +99,11 @@ module ActiveRecord
|
|
99
99
|
@validations=true
|
100
100
|
end
|
101
101
|
|
102
|
-
|
102
|
+
def clear_cached_validations
|
103
|
+
@validations = nil
|
104
|
+
logger.info("Cleared cached validations for: #{self}")
|
105
|
+
end
|
106
|
+
|
103
107
|
end # end of class methods
|
104
108
|
|
105
109
|
end # end of class Base
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: drysql
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-11-
|
6
|
+
version: 0.1.4
|
7
|
+
date: 2006-11-26 00:00:00 -05:00
|
8
8
|
summary: Dynamic, Reflective, Invisible Object-Relational Mapping for Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -28,16 +28,17 @@ cert_chain:
|
|
28
28
|
authors:
|
29
29
|
- Bryan Evans
|
30
30
|
files:
|
31
|
-
- lib/validations.rb
|
32
|
-
- lib/dependencies.rb
|
33
31
|
- lib/associations.rb
|
34
|
-
- lib/drysql.rb
|
35
32
|
- lib/base.rb
|
33
|
+
- lib/dependencies.rb
|
34
|
+
- lib/drysql.rb
|
35
|
+
- lib/validations.rb
|
36
36
|
- lib/helpers/string.rb
|
37
|
-
- lib/connection_adapters/
|
37
|
+
- lib/connection_adapters/abstract_adapter.rb
|
38
38
|
- lib/connection_adapters/mysql_adapter.rb
|
39
|
+
- lib/connection_adapters/oracle_adapter.rb
|
40
|
+
- lib/connection_adapters/postgresql_adapter.rb
|
39
41
|
- lib/connection_adapters/sqlserver_adapter.rb
|
40
|
-
- lib/connection_adapters/abstract_adapter.rb
|
41
42
|
- lib/connection_adapters/abstract/schema_definitions.rb
|
42
43
|
- README
|
43
44
|
test_files: []
|