sequel_core 2.2.0 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. metadata +30 -101
  2. data/CHANGELOG +0 -1519
  3. data/COPYING +0 -19
  4. data/README +0 -313
  5. data/Rakefile +0 -158
  6. data/bin/sequel +0 -117
  7. data/doc/cheat_sheet.rdoc +0 -225
  8. data/doc/dataset_filtering.rdoc +0 -182
  9. data/lib/sequel_core.rb +0 -136
  10. data/lib/sequel_core/adapters/adapter_skeleton.rb +0 -68
  11. data/lib/sequel_core/adapters/ado.rb +0 -90
  12. data/lib/sequel_core/adapters/db2.rb +0 -160
  13. data/lib/sequel_core/adapters/dbi.rb +0 -127
  14. data/lib/sequel_core/adapters/informix.rb +0 -89
  15. data/lib/sequel_core/adapters/jdbc.rb +0 -110
  16. data/lib/sequel_core/adapters/mysql.rb +0 -486
  17. data/lib/sequel_core/adapters/odbc.rb +0 -167
  18. data/lib/sequel_core/adapters/odbc_mssql.rb +0 -106
  19. data/lib/sequel_core/adapters/openbase.rb +0 -76
  20. data/lib/sequel_core/adapters/oracle.rb +0 -182
  21. data/lib/sequel_core/adapters/postgres.rb +0 -560
  22. data/lib/sequel_core/adapters/sqlite.rb +0 -270
  23. data/lib/sequel_core/connection_pool.rb +0 -194
  24. data/lib/sequel_core/core_ext.rb +0 -197
  25. data/lib/sequel_core/core_sql.rb +0 -184
  26. data/lib/sequel_core/database.rb +0 -462
  27. data/lib/sequel_core/database/schema.rb +0 -156
  28. data/lib/sequel_core/dataset.rb +0 -457
  29. data/lib/sequel_core/dataset/callback.rb +0 -13
  30. data/lib/sequel_core/dataset/convenience.rb +0 -245
  31. data/lib/sequel_core/dataset/pagination.rb +0 -96
  32. data/lib/sequel_core/dataset/query.rb +0 -41
  33. data/lib/sequel_core/dataset/schema.rb +0 -15
  34. data/lib/sequel_core/dataset/sql.rb +0 -889
  35. data/lib/sequel_core/deprecated.rb +0 -26
  36. data/lib/sequel_core/exceptions.rb +0 -42
  37. data/lib/sequel_core/migration.rb +0 -187
  38. data/lib/sequel_core/object_graph.rb +0 -216
  39. data/lib/sequel_core/pretty_table.rb +0 -71
  40. data/lib/sequel_core/schema.rb +0 -2
  41. data/lib/sequel_core/schema/generator.rb +0 -239
  42. data/lib/sequel_core/schema/sql.rb +0 -326
  43. data/lib/sequel_core/sql.rb +0 -812
  44. data/lib/sequel_core/worker.rb +0 -68
  45. data/spec/adapters/informix_spec.rb +0 -96
  46. data/spec/adapters/mysql_spec.rb +0 -765
  47. data/spec/adapters/oracle_spec.rb +0 -222
  48. data/spec/adapters/postgres_spec.rb +0 -441
  49. data/spec/adapters/sqlite_spec.rb +0 -413
  50. data/spec/connection_pool_spec.rb +0 -363
  51. data/spec/core_ext_spec.rb +0 -156
  52. data/spec/core_sql_spec.rb +0 -427
  53. data/spec/database_spec.rb +0 -963
  54. data/spec/dataset_spec.rb +0 -2933
  55. data/spec/expression_filters_spec.rb +0 -316
  56. data/spec/migration_spec.rb +0 -261
  57. data/spec/object_graph_spec.rb +0 -230
  58. data/spec/pretty_table_spec.rb +0 -58
  59. data/spec/rcov.opts +0 -6
  60. data/spec/schema_generator_spec.rb +0 -122
  61. data/spec/schema_spec.rb +0 -422
  62. data/spec/spec.opts +0 -0
  63. data/spec/spec_config.rb +0 -7
  64. data/spec/spec_config.rb.example +0 -8
  65. data/spec/spec_helper.rb +0 -55
  66. data/spec/worker_spec.rb +0 -96
@@ -1,26 +0,0 @@
1
- module Sequel
2
- # This module makes it easy to add deprecation functionality to other classes.
3
- module Deprecation # :nodoc:
4
- # This sets the output stream for the deprecation messages. Set it to an IO
5
- # (or any object that responds to puts) and it will call puts on that
6
- # object with the deprecation message. Set to nil to ignore deprecation messages.
7
- def self.deprecation_message_stream=(file)
8
- @dms = file
9
- end
10
-
11
- # Set this to true to print tracebacks with every deprecation message,
12
- # so you can see exactly where in your code the deprecated methods are
13
- # being called.
14
- def self.print_tracebacks=(pt)
15
- @pt = pt
16
- end
17
-
18
- # Puts the messages unaltered to the deprecation message stream
19
- def self.deprecate(message)
20
- if @dms
21
- @dms.puts(message)
22
- caller.each{|c| @dms.puts(c)} if @pt
23
- end
24
- end
25
- end
26
- end
@@ -1,42 +0,0 @@
1
- module Sequel
2
- # Represents an error raised in Sequel code.
3
- class Error < ::StandardError
4
-
5
- # Raised when Sequel is unable to load a specified adapter.
6
- class AdapterNotFound < Error ; end
7
-
8
- # Raise when an invalid expression is encountered inside a block filter.
9
- class InvalidExpression < Error; end
10
-
11
- # Represents an Invalid filter.
12
- class InvalidFilter < Error ; end
13
-
14
- # Represents an invalid join type.
15
- class InvalidJoinType < Error ; end
16
-
17
- # Raised on an invalid operation.
18
- class InvalidOperation < Error; end
19
-
20
- # Error raised when an invalid statement is executed.
21
- class InvalidStatement < Error; end
22
-
23
- # Represents an Invalid transform.
24
- class InvalidTransform < Error ; end
25
-
26
- # Represents an invalid value stored in the database.
27
- class InvalidValue < Error ; end
28
-
29
- # Represents an attempt to performing filter operations when no filter has been specified yet.
30
- class NoExistingFilter < Error ; end
31
-
32
- # There was an error while waiting on a connection from the connection pool
33
- class PoolTimeoutError < Error ; end
34
-
35
- # Rollback is a special error used to rollback a transactions.
36
- # A transaction block will catch this error and won't pass further up the stack.
37
- class Rollback < Error ; end
38
-
39
- # Should be raised inside a worker loop to tell it to stop working.
40
- class WorkerStop < RuntimeError ; end
41
- end
42
- end
@@ -1,187 +0,0 @@
1
- module Sequel
2
- # The Migration class describes a database migration that can be reversed.
3
- # The migration looks very similar to ActiveRecord (Rails) migrations, e.g.:
4
- #
5
- # class CreateSessions < Sequel::Migration
6
- # def up
7
- # create_table :sessions do
8
- # primary_key :id
9
- # varchar :session_id, :size => 32, :unique => true
10
- # timestamp :created_at
11
- # text :data
12
- # end
13
- # end
14
- #
15
- # def down
16
- # execute 'DROP TABLE sessions'
17
- # end
18
- # end
19
- #
20
- # To apply a migration to a database, you can invoke the #apply with
21
- # the target database instance and the direction :up or :down, e.g.:
22
- #
23
- # DB = Sequel.open ('sqlite://mydb')
24
- # CreateSessions.apply(DB, :up)
25
- #
26
- # See Sequel::Schema::Generator for the syntax to use for creating tables,
27
- # and Sequel::Schema::AlterTableGenerator for the syntax to use when
28
- # altering existing tables.
29
- class Migration
30
- # Creates a new instance of the migration and sets the @db attribute.
31
- def initialize(db)
32
- @db = db
33
- end
34
-
35
- # Applies the migration to the supplied database in the specified
36
- # direction.
37
- def self.apply(db, direction)
38
- obj = new(db)
39
- case direction
40
- when :up
41
- obj.up
42
- when :down
43
- obj.down
44
- else
45
- raise ArgumentError, "Invalid migration direction specified (#{direction.inspect})"
46
- end
47
- end
48
-
49
- # Returns the list of Migration descendants.
50
- def self.descendants
51
- @descendants ||= []
52
- end
53
-
54
- # Adds the new migration class to the list of Migration descendants.
55
- def self.inherited(base)
56
- descendants << base
57
- end
58
-
59
- # The default down action does nothing
60
- def down
61
- end
62
-
63
- # Intercepts method calls intended for the database and sends them along.
64
- def method_missing(method_sym, *args, &block)
65
- @db.send(method_sym, *args, &block)
66
- end
67
-
68
- # The default up action does nothing
69
- def up
70
- end
71
- end
72
-
73
- # The Migrator module performs migrations based on migration files in a
74
- # specified directory. The migration files should be named using the
75
- # following pattern (in similar fashion to ActiveRecord migrations):
76
- #
77
- # <version>_<title>.rb
78
- #
79
- # For example, the following files are considered migration files:
80
- #
81
- # 001_create_sessions.rb
82
- # 002_add_data_column.rb
83
- # ...
84
- #
85
- # The migration files should contain one or more migration classes based
86
- # on Sequel::Migration.
87
- #
88
- # To apply a migration, the #apply method must be invoked with the database
89
- # instance, the directory of migration files and the target version. If
90
- # no current version is supplied, it is read from the database. The migrator
91
- # automatically creates a schema_info table in the database to keep track
92
- # of the current migration version. If no migration version is stored in the
93
- # database, the version is considered to be 0. If no target version is
94
- # specified, the database is migrated to the latest version available in the
95
- # migration directory.
96
- #
97
- # For example, to migrate the database to the latest version:
98
- #
99
- # Sequel::Migrator.apply(DB, '.')
100
- #
101
- # To migrate the database from version 1 to version 5:
102
- #
103
- # Sequel::Migrator.apply(DB, '.', 5, 1)
104
- module Migrator
105
- MIGRATION_FILE_PATTERN = /\A\d+_.+\.rb\z/.freeze
106
-
107
- # Migrates the supplied database in the specified directory from the
108
- # current version to the target version. If no current version is
109
- # supplied, it is extracted from a schema_info table. The schema_info
110
- # table is automatically created and maintained by the apply function.
111
- def self.apply(db, directory, target = nil, current = nil)
112
- # determine current and target version and direction
113
- current ||= get_current_migration_version(db)
114
- target ||= latest_migration_version(directory)
115
- raise Error, "No current version available" if current.nil?
116
- raise Error, "No target version available" if target.nil?
117
-
118
- direction = current < target ? :up : :down
119
-
120
- classes = migration_classes(directory, target, current, direction)
121
-
122
- db.transaction do
123
- classes.each {|c| c.apply(db, direction)}
124
- set_current_migration_version(db, target)
125
- end
126
-
127
- target
128
- end
129
-
130
- # Gets the current migration version stored in the database. If no version
131
- # number is stored, 0 is returned.
132
- def self.get_current_migration_version(db)
133
- r = schema_info_dataset(db).first
134
- r ? r[:version] : 0
135
- end
136
-
137
- # Returns the latest version available in the specified directory.
138
- def self.latest_migration_version(directory)
139
- l = migration_files(directory).last
140
- l ? File.basename(l).to_i : nil
141
- end
142
-
143
- # Returns a list of migration classes filtered for the migration range and
144
- # ordered according to the migration direction.
145
- def self.migration_classes(directory, target, current, direction)
146
- range = direction == :up ?
147
- (current + 1)..target : (target + 1)..current
148
-
149
- # Remove class definitions
150
- Migration.descendants.each do |c|
151
- Object.send(:remove_const, c.to_s) rescue nil
152
- end
153
- Migration.descendants.clear # remove any defined migration classes
154
-
155
- # load migration files
156
- migration_files(directory, range).each {|fn| load(fn)}
157
-
158
- # get migration classes
159
- classes = Migration.descendants
160
- classes.reverse! if direction == :down
161
- classes
162
- end
163
-
164
- # Returns any found migration files in the supplied directory.
165
- def self.migration_files(directory, range = nil)
166
- files = []
167
- Dir.new(directory).each do |file|
168
- files[file.to_i] = File.join(directory, file) if MIGRATION_FILE_PATTERN.match(file)
169
- end
170
- filtered = range ? files[range] : files
171
- filtered ? filtered.compact : []
172
- end
173
-
174
- # Returns the dataset for the schema_info table. If no such table
175
- # exists, it is automatically created.
176
- def self.schema_info_dataset(db)
177
- db.create_table(:schema_info) {integer :version} unless db.table_exists?(:schema_info)
178
- db[:schema_info]
179
- end
180
-
181
- # Sets the current migration version stored in the database.
182
- def self.set_current_migration_version(db, version)
183
- dataset = schema_info_dataset(db)
184
- dataset.send(dataset.first ? :update : :<<, :version => version)
185
- end
186
- end
187
- end
@@ -1,216 +0,0 @@
1
- module Sequel
2
- class Dataset
3
- # Allows you to join multiple datasets/tables and have the result set
4
- # split into component tables.
5
- #
6
- # This differs from the usual usage of join, which returns the result set
7
- # as a single hash. For example:
8
- #
9
- # # CREATE TABLE artists (id INTEGER, name TEXT);
10
- # # CREATE TABLE albums (id INTEGER, name TEXT, artist_id INTEGER);
11
- # DB[:artists].left_outer_join(:albums, :artist_id=>:id).first
12
- # => {:id=>(albums.id||artists.id), :name=>(albums.name||artist.names), :artist_id=>albums.artist_id}
13
- # DB[:artists].graph(:albums, :artist_id=>:id).first
14
- # => {:artists=>{:id=>artists.id, :name=>artists.name}, :albums=>{:id=>albums.id, :name=>albums.name, :artist_id=>albums.artist_id}}
15
- #
16
- # Using a join such as left_outer_join, the attribute names that are shared between
17
- # the tables are combined in the single return hash. You can get around that by
18
- # using .select with correct aliases for all of the columns, but it is simpler to
19
- # use graph and have the result set split for you. In addition, graph respects
20
- # any row_proc or transform attributes of the current dataset and the datasets
21
- # you use with graph.
22
- #
23
- # If you are graphing a table and all columns for that table are nil, this
24
- # indicates that no matching rows existed in the table, so graph will return nil
25
- # instead of a hash with all nil values:
26
- #
27
- # # If the artist doesn't have any albums
28
- # DB[:artists].graph(:albums, :artist_id=>:id).first
29
- # => {:artists=>{:id=>artists.id, :name=>artists.name}, :albums=>nil}
30
- #
31
- # Arguments:
32
- # * dataset - Can be a symbol (specifying a table), another dataset,
33
- # or an object that responds to .dataset and yields a symbol or a dataset
34
- # * join_conditions - Any condition(s) allowed by join_table.
35
- # * options - A hash of graph options. The following options are currently used:
36
- # * :table_alias - The alias to use for the table. If not specified, doesn't
37
- # alias the table. You will get an error if the the alias (or table) name is
38
- # used more than once.
39
- # * :join_type - The type of join to use (passed to join_table). Defaults to
40
- # :left_outer.
41
- # * :select - An array of columns to select. When not used, selects
42
- # all columns in the given dataset. When set to false, selects no
43
- # columns and is like simply joining the tables, though graph keeps
44
- # some metadata about join that makes it important to use graph instead
45
- # of join.
46
- # * block - A block that is passed to join_table.
47
- def graph(dataset, join_conditions = nil, options = {}, &block)
48
- # Allow the use of a model, dataset, or symbol as the first argument
49
- # Find the table name/dataset based on the argument
50
- dataset = dataset.dataset if dataset.respond_to?(:dataset)
51
- case dataset
52
- when Symbol
53
- table = dataset
54
- dataset = @db[dataset]
55
- when ::Sequel::Dataset
56
- table = dataset.first_source
57
- else
58
- raise Error, "The dataset argument should be a symbol, dataset, or model"
59
- end
60
-
61
- # Raise Sequel::Error with explanation that the table alias has been used
62
- raise_alias_error = lambda do
63
- raise(Error, "this #{options[:table_alias] ? 'alias' : 'table'} has already been been used, please specify " \
64
- "#{options[:table_alias] ? 'a different alias' : 'an alias via the :table_alias option'}")
65
- end
66
-
67
- # Only allow table aliases that haven't been used
68
- table_alias = options[:table_alias] || table
69
- raise_alias_error.call if @opts[:graph] && @opts[:graph][:table_aliases] && @opts[:graph][:table_aliases].include?(table_alias)
70
-
71
- # Join the table early in order to avoid cloning the dataset twice
72
- ds = join_table(options[:join_type] || :left_outer, table, join_conditions, table_alias, &block)
73
- opts = ds.opts
74
-
75
- # Whether to include the table in the result set
76
- add_table = options[:select] == false ? false : true
77
- # Whether to add the columns to the list of column aliases
78
- add_columns = !ds.opts.include?(:graph_aliases)
79
-
80
- # Setup the initial graph data structure if it doesn't exist
81
- unless graph = opts[:graph]
82
- master = ds.first_source
83
- raise_alias_error.call if master == table_alias
84
- # Master hash storing all .graph related information
85
- graph = opts[:graph] = {}
86
- # Associates column aliases back to tables and columns
87
- column_aliases = graph[:column_aliases] = {}
88
- # Associates table alias (the master is never aliased)
89
- table_aliases = graph[:table_aliases] = {master=>self}
90
- # Keep track of the alias numbers used
91
- ca_num = graph[:column_alias_num] = Hash.new(0)
92
- # All columns in the master table are never
93
- # aliased, but are not included if set_graph_aliases
94
- # has been used.
95
- if add_columns
96
- select = opts[:select] = []
97
- columns.each do |column|
98
- column_aliases[column] = [master, column]
99
- select.push(column.qualify(master))
100
- end
101
- end
102
- end
103
-
104
- # Add the table alias to the list of aliases
105
- # Even if it isn't been used in the result set,
106
- # we add a key for it with a nil value so we can check if it
107
- # is used more than once
108
- table_aliases = graph[:table_aliases]
109
- table_aliases[table_alias] = add_table ? dataset : nil
110
-
111
- # Add the columns to the selection unless we are ignoring them
112
- if add_table && add_columns
113
- select = opts[:select]
114
- column_aliases = graph[:column_aliases]
115
- ca_num = graph[:column_alias_num]
116
- # Which columns to add to the result set
117
- cols = options[:select] || dataset.columns
118
- # If the column hasn't been used yet, don't alias it.
119
- # If it has been used, try table_column.
120
- # If that has been used, try table_column_N
121
- # using the next value of N that we know hasn't been
122
- # used
123
- cols.each do |column|
124
- col_alias, identifier = if column_aliases[column]
125
- column_alias = :"#{table_alias}_#{column}"
126
- if column_aliases[column_alias]
127
- column_alias_num = ca_num[column_alias]
128
- column_alias = :"#{column_alias}_#{column_alias_num}"
129
- ca_num[column_alias] += 1
130
- end
131
- [column_alias, column.qualify(table_alias).as(column_alias)]
132
- else
133
- [column, column.qualify(table_alias)]
134
- end
135
- column_aliases[col_alias] = [table_alias, column]
136
- select.push(identifier)
137
- end
138
- end
139
- ds
140
- end
141
-
142
- # This allows you to manually specify the graph aliases to use
143
- # when using graph. You can use it to only select certain
144
- # columns, and have those columns mapped to specific aliases
145
- # in the result set. This is the equivalent of .select for a
146
- # graphed dataset, and must be used instead of .select whenever
147
- # graphing is used. Example:
148
- #
149
- # DB[:artists].graph(:albums, :artist_id=>:id).set_graph_aliases(:artist_name=>[:artists, :name], :album_name=>[:albums, :name]).first
150
- # => {:artists=>{:name=>artists.name}, :albums=>{:name=>albums.name}}
151
- #
152
- # Arguments:
153
- # * graph_aliases - Should be a hash with keys being symbols of
154
- # column aliases, and values being arrays with two symbol elements.
155
- # The first element of the array should be the table alias,
156
- # and the second should be the actual column name.
157
- def set_graph_aliases(graph_aliases)
158
- cols = graph_aliases.collect do |col_alias, tc|
159
- identifier = tc[1].qualify(tc[0])
160
- identifier = identifier.as(col_alias) unless tc[1] == col_alias
161
- identifier
162
- end
163
- ds = select(*cols)
164
- ds.opts[:graph_aliases] = graph_aliases
165
- ds
166
- end
167
-
168
- private
169
-
170
- # Fetch the rows, split them into component table parts,
171
- # tranform and run the row_proc on each part (if applicable),
172
- # and yield a hash of the parts.
173
- def graph_each(opts, &block)
174
- # Reject tables with nil datasets, as they are excluded from
175
- # the result set
176
- datasets = @opts[:graph][:table_aliases].to_a.reject{|ta,ds| ds.nil?}
177
- # Get just the list of table aliases into a local variable, for speed
178
- table_aliases = datasets.collect{|ta,ds| ta}
179
- # Get an array of arrays, one for each dataset, with
180
- # the necessary information about each dataset, for speed
181
- datasets = datasets.collect do |ta, ds|
182
- [ta, ds, ds.instance_variable_get(:@transform), ds.row_proc]
183
- end
184
- # Use the manually set graph aliases, if any, otherwise
185
- # use the ones automatically created by .graph
186
- column_aliases = @opts[:graph_aliases] || @opts[:graph][:column_aliases]
187
- fetch_rows(select_sql(opts)) do |r|
188
- graph = {}
189
- # Create the sub hashes, one per table
190
- table_aliases.each{|ta| graph[ta]={}}
191
- # Split the result set based on the column aliases
192
- # If there are columns in the result set that are
193
- # not in column_aliases, they are ignored
194
- column_aliases.each do |col_alias, tc|
195
- ta, column = tc
196
- graph[ta][column] = r[col_alias]
197
- end
198
- # For each dataset, transform and run the row
199
- # row_proc if applicable
200
- datasets.each do |ta,ds,tr,rp|
201
- g = graph[ta]
202
- graph[ta] = if g.values.any?
203
- g = ds.transform_load(g) if tr
204
- g = rp[g] if rp
205
- g
206
- else
207
- nil
208
- end
209
- end
210
-
211
- yield graph
212
- end
213
- self
214
- end
215
- end
216
- end