view_something 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,33 @@
1
+ require 'digest/md5'
2
+
3
+ module ViewSomething
4
+
5
+ autoload :VERSION, File.dirname(__FILE__) + '/view_something/version'
6
+
7
+ def self.has_known_view?(digest)
8
+ @known_views ||= []
9
+ @known_views.include?(digest)
10
+ end
11
+
12
+ def self.view(query)
13
+ digest = Digest::MD5.hexdigest(sql = query.to_sql)
14
+ ensure_view_exists(digest, sql)
15
+ query.klass.find_by_sql "SELECT * FROM `#{digest}`;"
16
+ end
17
+
18
+ def self.ensure_view_exists(digest, sql)
19
+ unless has_known_view?(digest)
20
+ connection_klass = ActiveRecord::Base.connection.class
21
+ adapter = connection_klass.name.split('::')[-1]
22
+ if ['SQLite3Adapter'].include?(adapter)
23
+ ActiveRecord::Base.connection.execute "DROP VIEW IF EXISTS '#{digest}'"
24
+ ActiveRecord::Base.connection.execute "CREATE VIEW '#{digest}' AS #{sql}"
25
+ elsif ['MysqlAdapter', 'Mysql2Adapter'].include?(adapter)
26
+ ActiveRecord::Base.connection.execute "CREATE OR REPLACE VIEW #{digest} AS #{sql}"
27
+ else
28
+ raise "Database type #{connection_klass.name} not supported by ViewSomething"
29
+ end
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,5 @@
1
+ module ViewSomething
2
+
3
+ VERSION = '0.0.1'
4
+
5
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,7 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+
3
+ create_table :users do |t|
4
+ t.string :name
5
+ end
6
+
7
+ end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'active_record'
3
+ require File.dirname(__FILE__) + '/../lib/view_something'
4
+
5
+ if ENV['adapter'] == 'mysql' || ENV['adapter'] == 'mysql2'
6
+ ActiveRecord::Base.establish_connection(:database => 'holy_shit', :adapter => ENV['adapter'])
7
+ ActiveRecord::Base.connection.execute('drop table users;')
8
+ elsif ENV['adapter'] == 'sqlite3'
9
+ `rm spec/test.sqlite3`
10
+ ActiveRecord::Base.establish_connection(:database => 'spec/test.sqlite3', :adapter => 'sqlite3')
11
+ else
12
+ raise "Please specify an adapter to test with!"
13
+ end
14
+
15
+ ENV['RAILS_ENV'] = 'test'
16
+ load File.dirname(__FILE__) + '/schema.rb'
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: view_something
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - John Crepezzi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-02-08 00:00:00 -08:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :development
26
+ version_requirements: *id001
27
+ description: Easily use SQL views with ActiveRecord
28
+ email: john.crepezzi@gmail.com
29
+ executables: []
30
+
31
+ extensions: []
32
+
33
+ extra_rdoc_files: []
34
+
35
+ files:
36
+ - lib/view_something/version.rb
37
+ - lib/view_something.rb
38
+ - spec/schema.rb
39
+ - spec/spec_helper.rb
40
+ has_rdoc: true
41
+ homepage: http://seejohnrun.github.com/view_something/
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ requirements: []
62
+
63
+ rubyforge_project: ViewSomething
64
+ rubygems_version: 1.5.0
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Use SQL views seamlessly with ActiveRecord
68
+ test_files:
69
+ - spec/schema.rb
70
+ - spec/spec_helper.rb