drysql 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
@@ -5,25 +5,43 @@ module ActiveRecord
|
|
5
5
|
# This is abstract class serves as the template for table constraints from all
|
6
6
|
# databases compatible with the ISO SQL:2003 information schema standard
|
7
7
|
class AbstractTableConstraint
|
8
|
+
|
9
|
+
@@PRIMARY_KEY_TYPE = "PRIMARY KEY"
|
10
|
+
@@FOREIGN_KEY_TYPE = "FOREIGN KEY"
|
11
|
+
@@UNIQUE_KEY_TYPE = "UNIQUE"
|
12
|
+
@@CHECK_CONSTRAINT_TYPE = "CHECK"
|
13
|
+
|
14
|
+
attr_reader :constraint_catalog, :constraint_schema, :constraint_name, :constraint_type,
|
15
|
+
:table_catalog, :table_schema, :table_name, :column_name,
|
16
|
+
:referenced_table_catalog, :referenced_table_schema, :referenced_table_name, :referenced_column_name
|
17
|
+
|
18
|
+
attr_writer :member_of_composite
|
8
19
|
|
9
20
|
def raise_subclass_responsibility_error
|
10
21
|
raise NotImplementedError, "AbstractTableConstraint subclass #{self.class} did not implement this method"
|
11
22
|
end
|
12
23
|
|
13
|
-
alias :
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
alias :initialize :raise_subclass_responsibility_error
|
25
|
+
|
26
|
+
def primary_key?
|
27
|
+
constraint_type == @@PRIMARY_KEY_TYPE
|
28
|
+
end
|
29
|
+
|
30
|
+
def foreign_key?
|
31
|
+
constraint_type == @@FOREIGN_KEY_TYPE
|
32
|
+
end
|
33
|
+
|
34
|
+
def component_of_unique_key?
|
35
|
+
constraint_type == @@UNIQUE_KEY_TYPE
|
36
|
+
end
|
37
|
+
|
38
|
+
def unique_key?
|
39
|
+
component_of_unique_key? and !is_member_of_composite?
|
40
|
+
end
|
41
|
+
|
42
|
+
def is_member_of_composite?
|
43
|
+
@member_of_composite ? @member_of_composite : false
|
44
|
+
end
|
27
45
|
|
28
46
|
end
|
29
47
|
|
@@ -35,14 +35,6 @@ module ActiveRecord
|
|
35
35
|
# A representation of a referential constraint or key in MySQL
|
36
36
|
# Specifically: Primary, Foreign, Unique Key definitions
|
37
37
|
class MysqlConstraint < AbstractTableConstraint
|
38
|
-
@@PRIMARY_KEY_TYPE='PRIMARY KEY'
|
39
|
-
@@FOREIGN_KEY_TYPE='FOREIGN KEY'
|
40
|
-
@@UNIQUE_KEY_TYPE='UNIQUE'
|
41
|
-
|
42
|
-
attr_reader :constraint_schema, :constraint_name, :constraint_type, :table_schema, :table_name, :column_name,
|
43
|
-
:referenced_table_schema, :referenced_table_name, :referenced_column_name
|
44
|
-
|
45
|
-
attr_writer :member_of_composite
|
46
38
|
|
47
39
|
def initialize(constraint_catalog, constraint_schema, constraint_name, table_schema, table_name, constraint_type,
|
48
40
|
column_name, referenced_table_schema, referenced_table_name, referenced_column_name)
|
@@ -58,27 +50,6 @@ module ActiveRecord
|
|
58
50
|
@referenced_column_name = referenced_column_name
|
59
51
|
end
|
60
52
|
|
61
|
-
def primary_key?
|
62
|
-
constraint_type == @@PRIMARY_KEY_TYPE
|
63
|
-
end
|
64
|
-
|
65
|
-
def foreign_key?
|
66
|
-
constraint_type == @@FOREIGN_KEY_TYPE
|
67
|
-
end
|
68
|
-
|
69
|
-
def component_of_unique_key?
|
70
|
-
constraint_type == @@UNIQUE_KEY_TYPE
|
71
|
-
end
|
72
|
-
|
73
|
-
def unique_key?
|
74
|
-
component_of_unique_key? and !is_member_of_composite?
|
75
|
-
end
|
76
|
-
|
77
|
-
def is_member_of_composite?
|
78
|
-
@member_of_composite ? @member_of_composite : false
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
53
|
end
|
83
54
|
|
84
55
|
# The purpose of this extension to MysqlAdapter is to exploit the referential constraints offered in MySQL >=5.0, and
|
@@ -15,17 +15,7 @@ module ActiveRecord
|
|
15
15
|
|
16
16
|
|
17
17
|
class PostgreSQLConstraint < AbstractTableConstraint
|
18
|
-
|
19
|
-
@@FOREIGN_KEY_TYPE = "FOREIGN KEY"
|
20
|
-
@@UNIQUE_KEY_TYPE = "UNIQUE"
|
21
|
-
@@CHECK_CONSTRAINT_TYPE = "CHECK"
|
22
|
-
|
23
|
-
attr_reader :constraint_catalog, :constraint_schema, :constraint_name, :constraint_type,
|
24
|
-
:table_catalog, :table_schema, :table_name, :column_name,
|
25
|
-
:referenced_table_catalog, :referenced_table_schema, :referenced_table_name, :referenced_column_name
|
26
|
-
|
27
|
-
attr_writer :member_of_composite
|
28
|
-
|
18
|
+
|
29
19
|
def initialize(table_catalog, table_schema, table_name, column_name, constraint_catalog, constraint_schema,
|
30
20
|
constraint_name, referenced_table_catalog, referenced_table_schema, referenced_table_name, constraint_type,
|
31
21
|
referenced_column_name)
|
@@ -43,30 +33,6 @@ module ActiveRecord
|
|
43
33
|
@referenced_column_name = referenced_column_name
|
44
34
|
end
|
45
35
|
|
46
|
-
def primary_key?
|
47
|
-
constraint_type == @@PRIMARY_KEY_TYPE
|
48
|
-
end
|
49
|
-
|
50
|
-
def foreign_key?
|
51
|
-
constraint_type == @@FOREIGN_KEY_TYPE
|
52
|
-
end
|
53
|
-
|
54
|
-
def check_constraint?
|
55
|
-
constraint_type == @@CHECK_CONSTRAINT_TYPE
|
56
|
-
end
|
57
|
-
|
58
|
-
def component_of_unique_key?
|
59
|
-
constraint_type == @@UNIQUE_KEY_TYPE
|
60
|
-
end
|
61
|
-
|
62
|
-
def unique_key?
|
63
|
-
component_of_unique_key? and !is_member_of_composite?
|
64
|
-
end
|
65
|
-
|
66
|
-
def is_member_of_composite?
|
67
|
-
@member_of_composite ? @member_of_composite : false
|
68
|
-
end
|
69
|
-
|
70
36
|
end
|
71
37
|
|
72
38
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
|
3
|
+
module ConnectionAdapters
|
4
|
+
|
5
|
+
class SQLServerColumn < Column# :nodoc:
|
6
|
+
alias :generated? :identity
|
7
|
+
|
8
|
+
def default_specified?
|
9
|
+
!default.nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class SQLServerConstraint < AbstractTableConstraint
|
15
|
+
|
16
|
+
def initialize(table_catalog, table_schema, table_name, column_name,
|
17
|
+
referenced_table_catalog, referenced_table_schema, referenced_table_name, referenced_column_name,
|
18
|
+
constraint_catalog, constraint_schema, constraint_name, constraint_type)
|
19
|
+
@table_catalog = table_catalog
|
20
|
+
@table_schema = table_schema
|
21
|
+
@table_name = table_name
|
22
|
+
@column_name = column_name
|
23
|
+
@referenced_table_catalog = referenced_table_catalog
|
24
|
+
@referenced_table_schema = referenced_table_schema
|
25
|
+
@referenced_table_name = referenced_table_name
|
26
|
+
@referenced_column_name = referenced_column_name
|
27
|
+
@constraint_catalog = constraint_catalog
|
28
|
+
@constraint_schema = constraint_schema
|
29
|
+
@constraint_name = constraint_name
|
30
|
+
@constraint_type = constraint_type
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
class SQLServerAdapter < AbstractAdapter
|
36
|
+
|
37
|
+
def constraints(table_name, name = nil)#:nodoc:
|
38
|
+
constraints = []
|
39
|
+
sql = "select t2.*, t1.COLUMN_NAME, t3.UNIQUE_CONSTRAINT_CATALOG, t3.UNIQUE_CONSTRAINT_SCHEMA, t3.UNIQUE_CONSTRAINT_NAME, t4.table_catalog as REFERENCED_TABLE_CATALOG, t4.table_schema as REFERENCED_TABLE_SCHEMA, t4.table_name as REFERENCED_TABLE_NAME, t4.column_name as REFERENCED_COLUMN_NAME from ar.information_schema.constraint_column_usage as t1 inner join
|
40
|
+
ar.information_schema.table_constraints as t2 on (t2.constraint_name=t1.constraint_name AND t2.table_catalog=t1.table_catalog AND t2.table_schema=t1.table_schema AND t2.table_name=t1.table_name) left outer join
|
41
|
+
ar.information_schema.referential_constraints as t3 on (t3.constraint_name=t2.constraint_name AND t3.constraint_catalog=t2.constraint_catalog AND t3.constraint_schema=t2.constraint_schema) left outer join
|
42
|
+
ar.information_schema.constraint_column_usage as t4 on (t4.constraint_name=t3.unique_constraint_name AND t4.constraint_catalog=t3.unique_constraint_catalog AND t4.constraint_schema=t3.unique_constraint_schema)
|
43
|
+
where t4.table_name='#{table_name}' or t2.table_name='#{table_name}'"
|
44
|
+
results = select_all(sql, name)
|
45
|
+
constraint_name_hash = {}
|
46
|
+
results.each do |row|
|
47
|
+
constraints << SQLServerConstraint.new(row['TABLE_CATALOG'], row['TABLE_SCHEMA'], row['TABLE_NAME'], row['COLUMN_NAME'],
|
48
|
+
row['REFERENCED_TABLE_CATALOG'], row['REFERENCED_TABLE_SCHEMA'], row['REFERENCED_TABLE_NAME'], row['REFERENCED_COLUMN_NAME'],
|
49
|
+
row['CONSTRAINT_CATALOG'], row['CONSTRAINT_SCHEMA'], row['CONSTRAINT_NAME'], row['CONSTRAINT_TYPE'])
|
50
|
+
comparable_constraint_name = row['CONSTRAINT_NAME'].upcase
|
51
|
+
constraint_name_count = constraint_name_hash[comparable_constraint_name]
|
52
|
+
constraint_name_count ?
|
53
|
+
constraint_name_hash[comparable_constraint_name] = constraint_name_count + 1 :
|
54
|
+
constraint_name_hash[comparable_constraint_name] = 1
|
55
|
+
end
|
56
|
+
|
57
|
+
constraints.each do |constraint|
|
58
|
+
constraint.member_of_composite=(constraint_name_hash[constraint.constraint_name.upcase] > 1)
|
59
|
+
end
|
60
|
+
constraints
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
data/lib/drysql.rb
CHANGED
@@ -6,6 +6,7 @@ end
|
|
6
6
|
require 'connection_adapters/abstract_adapter'
|
7
7
|
require 'connection_adapters/mysql_adapter'
|
8
8
|
require 'connection_adapters/postgresql_adapter'
|
9
|
+
require 'connection_adapters/sqlserver_adapter'
|
9
10
|
require 'connection_adapters/abstract/schema_definitions'
|
10
11
|
require 'associations'
|
11
12
|
require 'validations'
|
metadata
CHANGED
@@ -3,15 +3,15 @@ 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-
|
8
|
-
summary:
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2006-11-16 00:00:00 -05:00
|
8
|
+
summary: Dynamic, Reflective, Invisible Object-Relational Mapping for Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: bsevans@rubyforge.org
|
12
12
|
homepage: http://drysql.rubyforge.org
|
13
13
|
rubyforge_project: drysql
|
14
|
-
description: DrySQL uses your DB's information schema to identify keys, and generate associations and validations for ActiveRecord objects. You defined the schema on your DB
|
14
|
+
description: DrySQL uses your DB's information schema to identify keys, and generate associations and validations for ActiveRecord objects. You defined the schema on your DB ... don't re-define it in your application code. Legacy DB Tables, Ruby Desktop apps, Rails apps...DrySQL's got all your databases covered
|
15
15
|
autorequire: drysql
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- lib/helpers/string.rb
|
37
37
|
- lib/connection_adapters/postgresql_adapter.rb
|
38
38
|
- lib/connection_adapters/mysql_adapter.rb
|
39
|
+
- lib/connection_adapters/sqlserver_adapter.rb
|
39
40
|
- lib/connection_adapters/abstract_adapter.rb
|
40
41
|
- lib/connection_adapters/abstract/schema_definitions.rb
|
41
42
|
- README
|