postgresql_cursor 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.rdoc +24 -14
  2. data/postgresql_cursor.gemspec +7 -7
  3. metadata +16 -9
@@ -9,29 +9,39 @@ For web pages, an application would not want to process a large amount of data,
9
9
  Pagination scheme to present it to the users. Background processes sometimes need to generate a large
10
10
  amount of data, and the ActiveRecord approach to load all data into memory is not the best fit here.
11
11
 
12
- Previous solutions employ pagination to fetch each block,
13
- then re-running the query for the next "page". This gem avoids re-executing
14
- the query by using the PostgreSQL cursors.
12
+ Previous solutions employ pagination to fetch each block, then re-running the query for the next "page".
13
+ This gem avoids re-executing the query by using PostgreSQL's cursor feature.
15
14
 
16
- Like the #find_by_sql method, #find_cursor returns each row as a hash instead of an instantiated
17
- model class. The rationale for this is performance, though an option to return instances is available.
18
- Julian's benchmarks showed returning instances was a factor of 4 slower than return the hash.
15
+ The ActiveRecord methods for the cursor return instances of the model class by default, however you
16
+ can pass in a block to override this strategy. For instance, returning Hashes instead of AR instances
17
+ is faster. Julian's benchmarks showed returning instances was a factor of 4 slower than returning a hash.
18
+
19
+ NOTE: This gem is intended to replace the 'postgresql-cursor' (with hyphen, not underscore) library.
20
+ I also plan on supporing ActiveRecord 3.x in the near future.
19
21
 
20
22
  ==Installation
21
23
  [sudo] gem install postgresql_cursor
22
24
 
23
- This does not require Rails to work, just ActiveRecord < 3.0.0 and the 'pg' gem.
25
+ This does not require Rails to work, just ActiveRecord < 3.0.0 and the 'pg' gem. Rails 3 support is forthcoming.
26
+
27
+ You can then configure your Rails application by adding to the config/environment.rb file
28
+ config.gem 'postgresql_cursor'
29
+ or require the gem on your non-rails application
30
+ require 'rubygems'
31
+ require 'postgresql_cursor'
24
32
 
25
33
  ==Usage
26
34
 
27
- A Rails/ActiveRecord plugin for the PostgreSQL database adapter that will add
28
- cursors to a find_cursor() method to process very large result sets.
35
+ This library is intended to be used via ActiveRecord. It provides two methods on ActiveRecord::Base
36
+ like the find() method, that will return cursor objects instead of an array of model instances.
37
+
38
+ Calling each() the returned cursor will yield a record to the block for each row. It handles a transaction
39
+ block, open, buffering, and closing the cursor. In this way, it operates like an Array object. Note that
40
+ it does not implement Enumerable, so no other methods are available.
29
41
 
30
- the *find_cursor* method uses cursors to pull in one data block (of x records) at a time, and
31
- return each record as a Hash to a procedural block. When each data block is
32
- exhausted, it will fetch the next one.
42
+ * *find_with_cursor*( <i>find options</i>, :cursor=>{<i>cursor options</i>}, &block) returns a cursor for the data matching the find options. It takes an optional block accepting a column=>value hash which returns the object desired via each or next, instead of an instance of the model.
33
43
 
34
- *find_by_sql_with_cursor* takes a custom SQL statement and returns each row.
44
+ * *find_by_sql_with_cursor*(<i>select statement</i>, <i>cursor options</i>, &block) takes a custom SQL statement and returns each row as above.
35
45
 
36
46
  ==Examples
37
47
 
@@ -39,7 +49,7 @@ exhausted, it will fetch the next one.
39
49
  puts row.to_json
40
50
  end
41
51
 
42
- Account.find_by_sql_with_cursor("select ...", :buffer_size=>1000) do |row|
52
+ Account.find_by_sql_with_cursor("select ...", :buffer_size=>1000).each do |row|
43
53
  row.process
44
54
  end
45
55
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{postgresql_cursor}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Allen Fair"]
12
- s.date = %q{2010-05-17}
12
+ s.date = %q{2010-07-29}
13
13
  s.description = %q{PostgreSQL Cursor is an extension to the ActiveRecord PostgreSQLAdapter for very large result sets. It provides a cursor open/fetch/close interface to access data without loading all rows into memory, and instead loads the result rows in "chunks" (default of 10_000 rows), buffers them, and returns the rows one at a time.}
14
14
  s.email = %q{allen.fair@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
31
31
  s.homepage = %q{http://github.com/afair/postgresql_cursor}
32
32
  s.rdoc_options = ["--charset=UTF-8"]
33
33
  s.require_paths = ["lib"]
34
- s.rubygems_version = %q{1.3.6}
34
+ s.rubygems_version = %q{1.3.7}
35
35
  s.summary = %q{ActiveRecord PostgreSQL Adapter extension for using a cursor to return a large result set}
36
36
  s.test_files = [
37
37
  "test/helper.rb",
@@ -42,15 +42,15 @@ Gem::Specification.new do |s|
42
42
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
43
43
  s.specification_version = 3
44
44
 
45
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
46
- s.add_runtime_dependency(%q<activerecord>, ["<= 2.3.5"])
45
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
46
+ s.add_runtime_dependency(%q<activerecord>, [">= 0"])
47
47
  s.add_runtime_dependency(%q<pg>, [">= 0"])
48
48
  else
49
- s.add_dependency(%q<activerecord>, ["<= 2.3.5"])
49
+ s.add_dependency(%q<activerecord>, [">= 0"])
50
50
  s.add_dependency(%q<pg>, [">= 0"])
51
51
  end
52
52
  else
53
- s.add_dependency(%q<activerecord>, ["<= 2.3.5"])
53
+ s.add_dependency(%q<activerecord>, [">= 0"])
54
54
  s.add_dependency(%q<pg>, [">= 0"])
55
55
  end
56
56
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postgresql_cursor
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 2
8
+ - 3
8
9
  - 0
9
- version: 0.2.0
10
+ version: 0.3.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Allen Fair
@@ -14,30 +15,32 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-17 00:00:00 -04:00
18
+ date: 2010-07-29 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: activerecord
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
- - - <=
27
+ - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
- - 2
29
- - 3
30
- - 5
31
- version: 2.3.5
31
+ - 0
32
+ version: "0"
32
33
  type: :runtime
33
34
  version_requirements: *id001
34
35
  - !ruby/object:Gem::Dependency
35
36
  name: pg
36
37
  prerelease: false
37
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
38
40
  requirements:
39
41
  - - ">="
40
42
  - !ruby/object:Gem::Version
43
+ hash: 3
41
44
  segments:
42
45
  - 0
43
46
  version: "0"
@@ -73,23 +76,27 @@ rdoc_options:
73
76
  require_paths:
74
77
  - lib
75
78
  required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
76
80
  requirements:
77
81
  - - ">="
78
82
  - !ruby/object:Gem::Version
83
+ hash: 3
79
84
  segments:
80
85
  - 0
81
86
  version: "0"
82
87
  required_rubygems_version: !ruby/object:Gem::Requirement
88
+ none: false
83
89
  requirements:
84
90
  - - ">="
85
91
  - !ruby/object:Gem::Version
92
+ hash: 3
86
93
  segments:
87
94
  - 0
88
95
  version: "0"
89
96
  requirements: []
90
97
 
91
98
  rubyforge_project:
92
- rubygems_version: 1.3.6
99
+ rubygems_version: 1.3.7
93
100
  signing_key:
94
101
  specification_version: 3
95
102
  summary: ActiveRecord PostgreSQL Adapter extension for using a cursor to return a large result set