oldmoe-activerecord-neverblock-postgresql-adapter 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,8 @@
1
+ == ActiveRecord NeverBlock PostgreSQL Adapter
2
+
3
+ An ActiveRecord Adapter for the NeverBlock::PostgreSQL database driver. It is able to run async SQL queries.
4
+
5
+ The adapter supports transactions in a Fiber context.
6
+
7
+ === License
8
+ Ruby License, http://www.ruby-lang.org/en/LICENSE.txt.
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "activerecord-neverblock-postgresql-adapter"
3
+ s.version = "0.1.0"
4
+ s.date = "2008-08-13"
5
+ s.summary = "Fibered ActiveRecord PostgreSQL adapter"
6
+ s.email = "oldmoe@gmail.com"
7
+ s.homepage = "http://github.com/oldmoe/neverblock-pg"
8
+ s.description = "Fibered ActiveRecord PostgreSQL adapter."
9
+ s.has_rdoc = true
10
+ s.authors = ["Muhammad A. Ali", "Ahmed Sobhi"]
11
+ s.files = [
12
+ "activerecord-neverblock-postgresql-adapter.gemspec",
13
+ "README",
14
+ "lib/active_record/connection_adapters/neverblock_postgresql_adapter.rb"]
15
+ s.rdoc_options = ["--main", "README"]
16
+ s.extra_rdoc_files = ["README"]
17
+ #s.add_dependency("neverblock")
18
+ #s.add_dependency("neverblock-pg")
19
+ end
20
+
@@ -0,0 +1,90 @@
1
+ require 'active_record/connection_adapters/postgresql_adapter'
2
+ require 'neverblock-pg'
3
+ require 'never_block/frameworks/activerecord'
4
+
5
+
6
+ class ActiveRecord::ConnectionAdapters::NeverBlockPostgreSQLAdapter < ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
7
+ # Returns 'FiberedPostgreSQL' as adapter name for identification purposes.
8
+ def adapter_name
9
+ 'NeverBlockPostgreSQL'
10
+ end
11
+
12
+ def begin_db_transaction
13
+ @connection.begin_db_transaction
14
+ end
15
+
16
+ def commit_db_transaction
17
+ @connection.commit_db_transaction
18
+ end
19
+
20
+ def rollback_db_transaction
21
+ @connection.rollback_db_transaction
22
+ end
23
+ # Executes an INSERT query and returns the new record's ID, this wont
24
+ # work on earlier versions of PostgreSQL but they don't suppor the async
25
+ # interface anyway
26
+ def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
27
+ @connection.exec(sql << " returning id ")
28
+ end
29
+
30
+ def connect
31
+ size = @connection_parameters.shift
32
+ @connection = ::NB::DB::PooledFiberedPostgresConnection.new(@connection_parameters, size)
33
+
34
+ PGconn.translate_results = false if PGconn.respond_to?(:translate_results=)
35
+
36
+ # Ignore async_exec and async_query when using postgres-pr.
37
+ @async = @config[:allow_concurrency] && @connection.respond_to?(:async_exec)
38
+
39
+ # Use escape string syntax if available. We cannot do this lazily when encountering
40
+ # the first string, because that could then break any transactions in progress.
41
+ # See: http://www.postgresql.org/docs/current/static/runtime-config-compatible.html
42
+ # If PostgreSQL doesn't know the standard_conforming_strings parameter then it doesn't
43
+ # support escape string syntax. Don't override the inherited quoted_string_prefix.
44
+ @connection.begin_db_transaction
45
+ if supports_standard_conforming_strings?
46
+ self.class.instance_eval do
47
+ define_method(:quoted_string_prefix) { 'E' }
48
+ end
49
+ end
50
+
51
+ # Money type has a fixed precision of 10 in PostgreSQL 8.2 and below, and as of
52
+ # PostgreSQL 8.3 it has a fixed precision of 19. PostgreSQLColumn.extract_precision
53
+ # should know about this but can't detect it there, so deal with it here.
54
+ money_precision = (postgresql_version >= 80300) ? 19 : 10
55
+ ::ActiveRecord::ConnectionAdapters::PostgreSQLColumn.module_eval(<<-end_eval)
56
+ def extract_precision(sql_type)
57
+ if sql_type =~ /^money$/
58
+ #{money_precision}
59
+ else
60
+ super
61
+ end
62
+ end
63
+ end_eval
64
+
65
+ configure_connection
66
+ @connection.commit_db_transaction
67
+ end
68
+ end
69
+
70
+ class ActiveRecord::Base
71
+ # Establishes a connection to the database that's used by all Active Record objects
72
+ def self.neverblock_postgresql_connection(config) # :nodoc:
73
+ config = config.symbolize_keys
74
+ host = config[:host]
75
+ port = config[:port] || 5432
76
+ username = config[:username].to_s
77
+ password = config[:password].to_s
78
+ size = config[:connections] || 4
79
+
80
+ if config.has_key?(:database)
81
+ database = config[:database]
82
+ else
83
+ raise ArgumentError, "No database specified. Missing argument: database."
84
+ end
85
+
86
+ # The postgres drivers don't allow the creation of an unconnected PGconn object,
87
+ # so just pass a nil connection object for the time being.
88
+ ::ActiveRecord::ConnectionAdapters::NeverBlockPostgreSQLAdapter.new(nil, logger, [size, host, port, nil, nil, database, username, password], config)
89
+ end
90
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oldmoe-activerecord-neverblock-postgresql-adapter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Muhammad A. Ali
8
+ - Ahmed Sobhi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2008-08-13 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Fibered ActiveRecord PostgreSQL adapter.
18
+ email: oldmoe@gmail.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files:
24
+ - README
25
+ files:
26
+ - activerecord-neverblock-postgresql-adapter.gemspec
27
+ - README
28
+ - lib/active_record/connection_adapters/neverblock_postgresql_adapter.rb
29
+ has_rdoc: true
30
+ homepage: http://github.com/oldmoe/neverblock-pg
31
+ post_install_message:
32
+ rdoc_options:
33
+ - --main
34
+ - README
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ version:
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ requirements: []
50
+
51
+ rubyforge_project:
52
+ rubygems_version: 1.2.0
53
+ signing_key:
54
+ specification_version: 2
55
+ summary: Fibered ActiveRecord PostgreSQL adapter
56
+ test_files: []
57
+