imparcial 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/History.txt +5 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +48 -0
  4. data/Rakefile +51 -0
  5. data/lib/imparcial.rb +7 -0
  6. metadata +37 -81
  7. data/lib/imparcial/driver/abstract/expression/base.rb +0 -111
  8. data/lib/imparcial/driver/abstract/expression/column.rb +0 -313
  9. data/lib/imparcial/driver/abstract/expression/constraint.rb +0 -149
  10. data/lib/imparcial/driver/abstract/expression/delete.rb +0 -88
  11. data/lib/imparcial/driver/abstract/expression/index.rb +0 -206
  12. data/lib/imparcial/driver/abstract/expression/insert.rb +0 -49
  13. data/lib/imparcial/driver/abstract/expression/lock.rb +0 -11
  14. data/lib/imparcial/driver/abstract/expression/record.rb +0 -41
  15. data/lib/imparcial/driver/abstract/expression/select.rb +0 -38
  16. data/lib/imparcial/driver/abstract/expression/sequence.rb +0 -260
  17. data/lib/imparcial/driver/abstract/expression/statement.rb +0 -128
  18. data/lib/imparcial/driver/abstract/expression/table.rb +0 -416
  19. data/lib/imparcial/driver/abstract/expression/transaction.rb +0 -143
  20. data/lib/imparcial/driver/abstract/expression/update.rb +0 -50
  21. data/lib/imparcial/driver/abstract/expression.rb +0 -24
  22. data/lib/imparcial/driver/abstract/result.rb +0 -95
  23. data/lib/imparcial/driver/abstract/sql/column.rb +0 -103
  24. data/lib/imparcial/driver/abstract/sql/constraint.rb +0 -42
  25. data/lib/imparcial/driver/abstract/sql/delete.rb +0 -22
  26. data/lib/imparcial/driver/abstract/sql/index.rb +0 -45
  27. data/lib/imparcial/driver/abstract/sql/insert.rb +0 -63
  28. data/lib/imparcial/driver/abstract/sql/record.rb +0 -19
  29. data/lib/imparcial/driver/abstract/sql/select.rb +0 -101
  30. data/lib/imparcial/driver/abstract/sql/sequence.rb +0 -55
  31. data/lib/imparcial/driver/abstract/sql/table.rb +0 -42
  32. data/lib/imparcial/driver/abstract/sql/transaction.rb +0 -43
  33. data/lib/imparcial/driver/abstract/sql/update.rb +0 -29
  34. data/lib/imparcial/driver/abstract/sql.rb +0 -21
  35. data/lib/imparcial/driver/abstract/typemap.rb +0 -168
  36. data/lib/imparcial/driver/abstract/util.rb +0 -53
  37. data/lib/imparcial/driver/abstract.rb +0 -255
  38. data/lib/imparcial/driver/mysql/expression/table.rb +0 -17
  39. data/lib/imparcial/driver/mysql/expression.rb +0 -11
  40. data/lib/imparcial/driver/mysql/result.rb +0 -33
  41. data/lib/imparcial/driver/mysql/sql/column.rb +0 -59
  42. data/lib/imparcial/driver/mysql/sql/constraint.rb +0 -39
  43. data/lib/imparcial/driver/mysql/sql/index.rb +0 -42
  44. data/lib/imparcial/driver/mysql/sql/sequence.rb +0 -39
  45. data/lib/imparcial/driver/mysql/sql/table.rb +0 -67
  46. data/lib/imparcial/driver/mysql/sql.rb +0 -15
  47. data/lib/imparcial/driver/mysql/typemap.rb +0 -13
  48. data/lib/imparcial/driver/mysql/util.rb +0 -13
  49. data/lib/imparcial/driver/mysql.rb +0 -49
  50. data/lib/imparcial/driver/postgre/expression.rb +0 -32
  51. data/lib/imparcial/driver/postgre/result.rb +0 -35
  52. data/lib/imparcial/driver/postgre/sql/column.rb +0 -53
  53. data/lib/imparcial/driver/postgre/sql/constraint.rb +0 -37
  54. data/lib/imparcial/driver/postgre/sql/index.rb +0 -53
  55. data/lib/imparcial/driver/postgre/sql/sequence.rb +0 -30
  56. data/lib/imparcial/driver/postgre/sql/table.rb +0 -46
  57. data/lib/imparcial/driver/postgre/sql.rb +0 -15
  58. data/lib/imparcial/driver/postgre/typemap.rb +0 -29
  59. data/lib/imparcial/driver/postgre/util.rb +0 -19
  60. data/lib/imparcial/driver/postgre.rb +0 -43
  61. data/lib/imparcial/driver.rb +0 -1
  62. data/lib/imparcial/exception.rb +0 -71
  63. data/lib/imparcial/initializer.rb +0 -62
@@ -1,67 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module MysqlSQL
4
- module Table
5
-
6
- private
7
-
8
- def sql_for_creating_table ( options = {} )
9
-
10
- syntax = super
11
-
12
- syntax += 'ENGINE = '
13
-
14
- # If any engine has not been specified, we make INNODB as default.
15
-
16
- if options[:engine]
17
-
18
- syntax += options[:engine].to_s
19
-
20
- else
21
-
22
- syntax += 'INNODB'
23
-
24
- end
25
-
26
- syntax
27
-
28
- end
29
-
30
- private
31
-
32
- # Generate SQL statement for retrieving tables.
33
-
34
- def sql_for_getting_tables
35
-
36
- 'SHOW TABLES'
37
-
38
- end
39
-
40
- # Generate SQL statement for retrieving columns.
41
- =begin
42
- def sql_for_retrieving_columns ( options = {} )
43
-
44
- %{
45
- SELECT
46
- A.column_name, A.data_type, A.character_maximum_length as size,
47
- (A.is_nullable = 'YES') as allow_null,
48
- (A.column_name = B.column_name) as pk,
49
- A.column_default,
50
- A.extra = 'auto_increment' as auto_inc,
51
- A.column_name in (
52
- SELECT s.COLUMN_NAME FROM INFORMATION_SCHEMA.statistics s
53
- WHERE s.COLUMN_NAME = A.column_name
54
- ) as indexed
55
-
56
- FROM information_schema.columns A
57
- LEFT JOIN information_schema.key_column_usage B ON A.table_name = B.table_name
58
- WHERE A.table_name = #{quote_value(options[:table_name])}
59
-
60
- }
61
-
62
- end
63
- =end
64
- end
65
- end
66
- end
67
- end
@@ -1,15 +0,0 @@
1
- FileList[File.dirname(__FILE__) + '/sql/*.rb'].each do |f|
2
- require f
3
- end
4
-
5
- module Imparcial
6
- module Driver
7
- module MysqlSQL
8
- include Table
9
- include Sequence
10
- include Index
11
- include Constraint
12
- include Column
13
- end
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module MysqlTypemap
4
-
5
- def sql_types
6
-
7
- super.dup.merge!('INT' => :integer)
8
-
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module MysqlUtil
4
-
5
- def quote ( val )
6
-
7
- "`#{val}`"
8
-
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,49 +0,0 @@
1
- require 'mysql'
2
-
3
- require 'imparcial/driver/mysql/util'
4
- require 'imparcial/driver/mysql/result'
5
- require 'imparcial/driver/mysql/typemap'
6
- require 'imparcial/driver/mysql/sql'
7
- require 'imparcial/driver/mysql/expression'
8
-
9
- module Imparcial
10
- module Driver
11
- class MysqlAdapter < AbstractAdapter
12
-
13
- include MysqlUtil
14
- include MysqlTypemap
15
- include MysqlSQL
16
- include MysqlExpression
17
-
18
- def adapter_specific_exception
19
-
20
- Mysql::Error
21
-
22
- end
23
-
24
- def connect
25
-
26
- @conn = Mysql.real_connect @host, @username, @password, @database, @port, @socket
27
-
28
- rescue adapter_specific_exception => ex
29
-
30
- raise AdapterConnectionError.new(ex.message)
31
-
32
- end
33
-
34
- def query ( sql )
35
-
36
- result = conn.query sql
37
- @result = MysqlResult.new result
38
-
39
- end
40
-
41
- def last_insert_id
42
-
43
- conn.last_insert_id
44
-
45
- end
46
-
47
- end
48
- end
49
- end
@@ -1,32 +0,0 @@
1
- FileList[File.dirname(__FILE__) + '/expression/*.rb'].each do |f|
2
- require f
3
- end
4
-
5
- module Imparcial
6
- module Driver
7
- module PostgreExpression
8
-
9
- def insert ( options = {} )
10
-
11
- super options
12
-
13
- begin
14
-
15
- seq_name = 'seq_' + options[:table_name].to_s + '_id'
16
- id = conn.query "SELECT currval('#{seq_name}')"
17
-
18
- @last_insert_id = id[0][0].to_i
19
-
20
- rescue adapter_specific_exception; end
21
-
22
- end
23
-
24
- def last_insert_id
25
-
26
- @last_insert_id
27
-
28
- end
29
-
30
- end
31
- end
32
- end
@@ -1,35 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- class PostgreResult < AbstractResult
4
-
5
- def rows
6
-
7
- @specific.result.length
8
-
9
- end
10
-
11
- def fetch
12
-
13
- fields = @specific.fields
14
- rows = @specific.result
15
-
16
- rows.each do |row|
17
-
18
- v = []
19
-
20
- row.each_with_index do |value, index|
21
-
22
- v << Row.new(fields[index], value)
23
-
24
- end
25
-
26
- yield(*v)
27
-
28
- end
29
-
30
-
31
- end
32
-
33
- end
34
- end
35
- end
@@ -1,53 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreSQL
4
- module Column
5
-
6
- private
7
-
8
- def sql_for_renaming_column ( options )
9
-
10
- syntax = ''
11
-
12
- syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
13
-
14
- options[:field].each do |old_name, new_name|
15
-
16
- syntax += "RENAME COLUMN #{old_name} TO #{new_name}"
17
-
18
- end
19
-
20
- logger.warn(syntax) if @table_logging
21
-
22
- syntax
23
-
24
- end
25
-
26
- def sql_for_modifying_columns ( options )
27
-
28
- syntax = ''
29
-
30
- syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
31
-
32
- options[:fields].each do |field|
33
-
34
- column = field_to_column field
35
-
36
- syntax += "ALTER COLUMN #{column[:name]} TYPE #{column[:type]}"
37
- syntax += "(#{column[:size]})" if column[:size]
38
- syntax += ","
39
-
40
- end
41
-
42
- syntax.chop!
43
-
44
- logger.warn(syntax) if @table_logging
45
-
46
- syntax
47
-
48
- end
49
-
50
- end
51
- end
52
- end
53
- end
@@ -1,37 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreSQL
4
- module Constraint
5
-
6
- private
7
-
8
- def sql_for_adding_auto_increment ( options )
9
-
10
- seq_name = 'seq_' + options[:table_name].to_s + '_' + options[:field].to_s
11
- drop_sequence_if_necessary :sequence_name => seq_name
12
- create_sequence :sequence_name => seq_name
13
- sql_for_adding_default_value :table_name => options[:table_name], :fields => {options[:field] => "nextval('#{seq_name}')"}
14
-
15
- end
16
-
17
- def sql_for_adding_default_value ( options )
18
-
19
- syntax = 'ALTER TABLE ' + quote(options[:table_name]) + ' '
20
-
21
- for field, value in options[:fields]
22
-
23
- value = quote_value(value) if not value.to_s.match('nextval')
24
- syntax += "ALTER COLUMN #{quote(field)} SET DEFAULT #{value},"
25
-
26
- end
27
-
28
- syntax.chop!
29
-
30
- syntax
31
-
32
- end
33
-
34
- end
35
- end
36
- end
37
- end
@@ -1,53 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreSQL
4
- module Index
5
-
6
- private
7
-
8
- # Generate SQL statement for verifying if a given index exists.
9
-
10
- def sql_for_index_exists? ( options )
11
-
12
- %{SELECT
13
- c2.relname as "table",
14
- (select attname from pg_attribute where attrelid = i.indexrelid AND attnum > 0) as "column" ,
15
- c.relname as "index"
16
- FROM pg_class c
17
- JOIN pg_roles r ON r.oid = c.relowner
18
- LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
19
- LEFT JOIN pg_index i ON i.indexrelid = c.oid
20
- LEFT JOIN pg_class c2 ON i.indrelid = c2.oid
21
- WHERE c.relkind = 'i'
22
- AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
23
- c2.relname = #{quote_value(options[:table_name])} AND
24
- c.relname = #{quote_value(options[:index_name])}
25
- }
26
-
27
- end
28
-
29
- # Generate SQL statement for retrieving all indexes.
30
-
31
- def sql_for_getting_indexes ( options )
32
-
33
- %{SELECT
34
- c2.relname as "table",
35
- (select attname from pg_attribute where attrelid = i.indexrelid AND attnum > 0) as "column" ,
36
- c.relname as "index"
37
- FROM pg_class c
38
- JOIN pg_roles r ON r.oid = c.relowner
39
- LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
40
- LEFT JOIN pg_index i ON i.indexrelid = c.oid
41
- LEFT JOIN pg_class c2 ON i.indrelid = c2.oid
42
- WHERE c.relkind = 'i'
43
- AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
44
- c2.relname = #{quote_value(options[:table_name])}
45
- }
46
-
47
- end
48
-
49
-
50
- end
51
- end
52
- end
53
- end
@@ -1,30 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreSQL
4
- module Sequence
5
-
6
- private
7
-
8
- def sql_for_sequence_exists? ( options )
9
-
10
- %{
11
- SELECT 1 FROM pg_class WHERE relkind = 'S' AND
12
- relname = #{quote_value(options[:sequence_name])}
13
- }
14
-
15
- end
16
-
17
- # Generate SQL statement for retrieving sequences.
18
-
19
- def sql_for_getting_sequences
20
-
21
- %{
22
- SELECT relname FROM pg_class WHERE relkind = 'S'
23
- }
24
-
25
- end
26
-
27
- end
28
- end
29
- end
30
- end
@@ -1,46 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreSQL
4
- module Table
5
-
6
- private
7
-
8
- # Generate SQL statement for retrieving tables.
9
-
10
- def sql_for_getting_tables
11
-
12
- %{
13
- SELECT table_name FROM information_schema.tables
14
- WHERE table_schema = 'public'
15
- }
16
-
17
- end
18
-
19
- # Generate SQL statement for retrieving columns.
20
- =begin
21
- def sql_for_retrieving_columns ( options )
22
-
23
- %{
24
- SELECT
25
- A.column_name, A.data_type, A.character_maximum_length,
26
- (A.is_nullable = 'YES') as allow_null,
27
- (A.column_name = B.column_name) as pk,
28
- A.column_default,
29
- A.column_default LIKE 'nextval%' as auto_inc,
30
- A.column_name in (SELECT sa.attname from pg_class sc
31
- JOIN pg_index si ON sc.oid = si.indexrelid
32
- JOIN pg_class sc2 ON sc2.oid = si.indrelid
33
- JOIN pg_attribute sa ON sc.oid = sa.attrelid
34
- WHERE sc2.relname = #{quote_value(options[:table_name])} AND sa.attname = A.column_name
35
- ) as column_indexed
36
- FROM information_schema.columns A
37
- LEFT JOIN information_schema.key_column_usage B ON A.table_name = B.table_name
38
- WHERE A.table_name = #{quote_value(options[:table_name])};
39
- }
40
-
41
- end
42
- =end
43
- end
44
- end
45
- end
46
- end
@@ -1,15 +0,0 @@
1
- FileList[File.dirname(__FILE__) + '/sql/*.rb'].each do |f|
2
- require f
3
- end
4
-
5
- module Imparcial
6
- module Driver
7
- module PostgreSQL
8
- include Table
9
- include Sequence
10
- include Index
11
- include Constraint
12
- include Column
13
- end
14
- end
15
- end
@@ -1,29 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreTypemap
4
-
5
- def sql_types
6
-
7
- super.dup.merge!('CHARACTER VARYING' => :string, 'DOUBLE PRECISION' => :float)
8
-
9
- end
10
-
11
- private
12
-
13
- # Due to nextval, we have to format the default value
14
-
15
- def parse_column ( column )
16
-
17
- super
18
-
19
- if column[:default_value]
20
-
21
- column[:default_value].gsub!(/::.*/,'')
22
-
23
- end
24
-
25
- end
26
-
27
- end
28
- end
29
- end
@@ -1,19 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module PostgreUtil
4
-
5
- def quote_value ( val )
6
-
7
- conn.class.quote val
8
-
9
- end
10
-
11
- def quote ( val )
12
-
13
- "\"#{val}\""
14
-
15
- end
16
-
17
- end
18
- end
19
- end
@@ -1,43 +0,0 @@
1
- require 'postgres'
2
-
3
- require 'imparcial/driver/postgre/util'
4
- require 'imparcial/driver/postgre/result'
5
- require 'imparcial/driver/postgre/typemap'
6
- require 'imparcial/driver/postgre/sql'
7
- require 'imparcial/driver/postgre/expression'
8
-
9
- module Imparcial
10
- module Driver
11
- class PostgreAdapter < AbstractAdapter
12
-
13
- include PostgreUtil
14
- include PostgreTypemap
15
- include PostgreSQL
16
- include PostgreExpression
17
-
18
- def adapter_specific_exception
19
-
20
- PGError
21
-
22
- end
23
-
24
- def connect
25
-
26
- @conn = PGconn.connect @host, @port, '', '', @database, @username, @password
27
-
28
- rescue adapter_specific_exception => ex
29
-
30
- raise AdapterConnectionError.new(ex.message)
31
-
32
- end
33
-
34
- def query ( sql )
35
-
36
- result = conn.exec sql
37
- @result = PostgreResult.new result
38
-
39
- end
40
-
41
- end
42
- end
43
- end
@@ -1 +0,0 @@
1
- require 'imparcial/driver/abstract'
@@ -1,71 +0,0 @@
1
- module Imparcial
2
-
3
- # Main class
4
-
5
- class ImparcialError < StandardError; end
6
-
7
- # Adapter
8
-
9
- class AdapterError < ImparcialError; end
10
- class AdapterNotFound < AdapterError; end
11
- class AdapterConnectionError < AdapterError; end
12
-
13
- # Expression
14
-
15
- class ExpressionError < ImparcialError; end
16
-
17
- class FeatureNotFound < ExpressionError; end
18
- class ConditionError < ExpressionError; end
19
- class OptionError < ExpressionError; end
20
- class ResultError < ExpressionError; end
21
-
22
- # Table
23
-
24
- class TableError < ExpressionError; end
25
- class TableCreateError < TableError; end
26
- class TableDropError < TableError; end
27
- class TableListError < TableError; end
28
- class TableUpdateError < TableError; end
29
-
30
- # Column
31
-
32
- class ColumnError < ExpressionError; end
33
- class ColumnListError < ColumnError; end
34
- class ColumnUpdateError < ColumnError; end
35
- class ColumnCreateError < ColumnError; end
36
- class ColumnDropError < ColumnError; end
37
- class ColumnConstraintError < ColumnError; end
38
- class ColumnRenameError < ColumnError; end
39
-
40
- # Crud
41
-
42
- class SelectError < ExpressionError; end
43
- class InsertError < ExpressionError; end
44
- class DeleteError < ExpressionError; end
45
- class UpdateError < ExpressionError; end
46
-
47
- # Sequence
48
-
49
- class SequenceError < ExpressionError; end
50
- class SequenceCreateError < SequenceError; end
51
- class SequenceDropError < SequenceError; end
52
- class SequenceListError < SequenceError; end
53
- class SequenceUpdateError < SequenceError; end
54
-
55
- # Transaction
56
-
57
- class TransactionError < ExpressionError; end
58
-
59
- # Lock
60
-
61
- class LockError < ExpressionError; end
62
-
63
- # Index
64
-
65
- class IndexError < ExpressionError; end
66
- class IndexCreateError < IndexError; end
67
- class IndexDropError < IndexError; end
68
- class IndexListError < IndexError; end
69
- class IndexUpdateError < IndexError; end
70
-
71
- end