sequel 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,17 @@
1
+ *0.0.6*
2
+
3
+ * Added Dataset#sql as alias to Dataset#select_sql.
4
+
5
+ * Dataset#where and Dataset#exclude can now be used for refining dataset conditions, enabling stuff like posts.where(:title => 'abcdef').exclude(:user_id => 3).
6
+
7
+ * Implemented Dataset#exclude method.
8
+
9
+ * Added Sequel::Schema#auto_primary_key method for setting an automatic primary key to be added to every table definition. Changed the schema generator to not define a primary key by default.
10
+
11
+ * Changed Sequel::Database#table_exists? to rely on the tables method if it is available.
12
+
13
+ * Implemented SQLite::Database#tables.
14
+
1
15
  *0.0.5*
2
16
 
3
17
  * Added Dataset#[] method. Refactored Model#find and Model#[].
data/README CHANGED
@@ -1,4 +1,4 @@
1
- == Serquel: Concise ORM for Ruby
1
+ == Sequel: Concise ORM for Ruby
2
2
 
3
3
  Sequel is an ORM framework for Ruby. Sequel provides thread safety, connection pooling, and a concise DSL for constructing queries and table schemas.
4
4
 
@@ -51,11 +51,11 @@ Note: you don't need to require 'sequel' separately before that, as each adapter
51
51
 
52
52
  There are two ways to create a connection to a database. The easier way is to provide a connection URL:
53
53
 
54
- DB = Sequel.connect("sqlite:///blog.db")
54
+ DB = Sequel.open("sqlite:///blog.db")
55
55
 
56
56
  You can also specify optional parameters, such as the connection pool size:
57
57
 
58
- DB = Sequel.connect("postgres://postgres:postgres@localhost/my_db",
58
+ DB = Sequel.open("postgres://postgres:postgres@localhost/my_db",
59
59
  :max_connections => 10)
60
60
 
61
61
  The second, more verbose, way is to create an instance of a database class:
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  include FileUtils
7
7
 
8
8
  NAME = "sequel"
9
- VERS = "0.0.5"
9
+ VERS = "0.0.6"
10
10
  CLEAN.include ['**/.*.sw?', 'pkg/*', '.config', 'doc/*', 'coverage/*']
11
11
  RDOC_OPTS = ['--quiet', '--title', "Sequel: Concise ORM for Ruby",
12
12
  "--opname", "index.html",
@@ -24,7 +24,7 @@ Rake::RDocTask.new do |rdoc|
24
24
  rdoc.rdoc_dir = 'doc/rdoc'
25
25
  rdoc.options += RDOC_OPTS
26
26
  rdoc.main = "README"
27
- rdoc.title = "Sequel Documentation"
27
+ rdoc.title = "Sequel: Concise ORM for Ruby"
28
28
  rdoc.rdoc_files.add ['README', 'COPYING', 'lib/sequel.rb', 'lib/sequel/**/*.rb']
29
29
  end
30
30
 
@@ -36,7 +36,7 @@ spec = Gem::Specification.new do |s|
36
36
  s.extra_rdoc_files = ["README", "CHANGELOG", "COPYING"]
37
37
  s.rdoc_options += RDOC_OPTS +
38
38
  ['--exclude', '^(examples|extras)\/', '--exclude', 'lib/sequel.rb']
39
- s.summary = "ORM framework for Ruby."
39
+ s.summary = "Concise ORM for Ruby."
40
40
  s.description = s.summary
41
41
  s.author = "Sharon Rosner"
42
42
  s.email = 'ciconia@gmail.com'
@@ -93,11 +93,43 @@ module Sequel
93
93
  # Performs a brute-force check for the existance of a table. This method is
94
94
  # usually overriden in descendants.
95
95
  def table_exists?(name)
96
- from(name).first && true
96
+ if respond_to?(:tables)
97
+ tables.include?(name.to_sym)
98
+ else
99
+ from(name).first && true
100
+ end
97
101
  rescue
98
102
  false
99
103
  end
100
104
 
105
+ SQL_BEGIN = 'BEGIN'.freeze
106
+ SQL_COMMIT = 'COMMIT'.freeze
107
+ SQL_ROLLBACK = 'ROLLBACK'.freeze
108
+
109
+ def transaction
110
+ @pool.hold do |conn|
111
+ @transactions ||= []
112
+ if @transactions.include? Thread.current
113
+ return yield(conn)
114
+ end
115
+ # ServerSide.info('BEGIN')
116
+ conn.execute(SQL_BEGIN)
117
+ begin
118
+ @transactions << Thread.current
119
+ result = yield(conn)
120
+ # ServerSide.info('COMMIT')
121
+ conn.execute(SQL_COMMIT)
122
+ result
123
+ rescue => e
124
+ # ServerSide.info('ROLLBACK')
125
+ conn.execute(SQL_ROLLBACK)
126
+ raise e
127
+ ensure
128
+ @transactions.delete(Thread.current)
129
+ end
130
+ end
131
+ end
132
+
101
133
  @@adapters = Hash.new
102
134
 
103
135
  # Sets the adapter scheme for the database class. Call this method in
@@ -178,15 +178,26 @@ module Sequel
178
178
  end
179
179
  end
180
180
 
181
+ AND_WHERE = "%s AND %s".freeze
182
+
181
183
  # Returns a copy of the dataset with the where conditions changed.
182
- def where(*where)
183
- if where.size == 1
184
- where = where.first
185
- if @opts[:where] && @opts[:where].is_a?(Hash) && where.is_a?(Hash)
186
- where = @opts[:where].merge(where)
184
+ def where(*cond)
185
+ cond = cond.first if cond.size == 1
186
+ if @opts[:where]
187
+ if @opts[:where].is_a?(Hash) && cond.is_a?(Hash)
188
+ cond = @opts[:where].merge(cond)
189
+ else
190
+ cond = AND_WHERE % [where_list(@opts[:where]), where_list(cond)]
187
191
  end
188
192
  end
189
- dup_merge(:where => where)
193
+ dup_merge(:where => cond)
194
+ end
195
+
196
+ NOT_WHERE = "NOT %s".freeze
197
+
198
+ def exclude(*cond)
199
+ cond = cond.first if cond.size == 1
200
+ where(NOT_WHERE % where_list(cond))
190
201
  end
191
202
 
192
203
  LEFT_OUTER_JOIN = 'LEFT OUTER JOIN'.freeze
@@ -201,9 +212,8 @@ module Sequel
201
212
 
202
213
  alias_method :filter, :where
203
214
  alias_method :all, :to_a
204
- alias_method :enum_map, :map
205
215
 
206
- #
216
+ alias_method :enum_map, :map
207
217
  def map(field_name = nil, &block)
208
218
  if block
209
219
  enum_map(&block)
@@ -272,6 +282,8 @@ module Sequel
272
282
  sql
273
283
  end
274
284
 
285
+ alias_method :sql, :select_sql
286
+
275
287
  INSERT = "INSERT INTO %s (%s) VALUES (%s)".freeze
276
288
  INSERT_EMPTY = "INSERT INTO %s DEFAULT VALUES".freeze
277
289
 
@@ -154,10 +154,6 @@ module Sequel
154
154
  def transaction(&block)
155
155
  @pool.hold {|conn| conn.transaction(&block)}
156
156
  end
157
-
158
- def table_exists?(name)
159
- from(:pg_class).filter(:relname => name, :relkind => 'r').count > 0
160
- end
161
157
  end
162
158
 
163
159
  class Dataset < Sequel::Dataset
@@ -83,9 +83,9 @@ module Sequel
83
83
  class Generator
84
84
  attr_reader :table_name
85
85
 
86
- def initialize(table_name, &block)
86
+ def initialize(table_name, auto_primary_key, &block)
87
87
  @table_name = table_name
88
- @primary_key = {:name => :id, :type => :serial, :primary_key => true}
88
+ @primary_key = auto_primary_key
89
89
  @columns = []
90
90
  @indexes = []
91
91
  instance_eval(&block)
@@ -140,8 +140,16 @@ module Sequel
140
140
  instance_eval(&block) if block
141
141
  end
142
142
 
143
+ def auto_primary_key(name, type = nil, opts = nil)
144
+ @auto_primary_key = {
145
+ :name => name,
146
+ :type => type || :serial,
147
+ :primary_key => true
148
+ }.merge(opts || {})
149
+ end
150
+
143
151
  def create_table(table_name, &block)
144
- @instructions << Generator.new(table_name, &block)
152
+ @instructions << Generator.new(table_name, @auto_primary_key, &block)
145
153
  end
146
154
 
147
155
  def create(db)
@@ -22,9 +22,11 @@ module Sequel
22
22
  def dataset(opts = nil)
23
23
  SQLite::Dataset.new(self, opts)
24
24
  end
25
+
26
+ TABLES_FILTER = "type = 'table' AND NOT name = 'sqlite_sequence'"
25
27
 
26
28
  def tables
27
- # return a list of tables
29
+ self[:sqlite_master].filter(TABLES_FILTER).map {|r| r[:name].to_sym}
28
30
  end
29
31
 
30
32
  def execute(sql)
metadata CHANGED
@@ -3,15 +3,15 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: sequel
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.5
7
- date: 2007-03-21 00:00:00 +02:00
8
- summary: ORM framework for Ruby.
6
+ version: 0.0.6
7
+ date: 2007-03-22 00:00:00 +02:00
8
+ summary: Concise ORM for Ruby.
9
9
  require_paths:
10
10
  - lib
11
11
  email: ciconia@gmail.com
12
12
  homepage: http://sequel.rubyforge.org
13
13
  rubyforge_project:
14
- description: ORM framework for Ruby.
14
+ description: Concise ORM for Ruby.
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
@@ -33,7 +33,6 @@ files:
33
33
  - README
34
34
  - Rakefile
35
35
  - bin/sequel
36
- - doc/rdoc
37
36
  - lib/sequel
38
37
  - lib/sequel.rb
39
38
  - lib/sequel/dataset.rb