rails-ext 0.2.17 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.git/index +0 -0
- data/.git/logs/HEAD +4 -0
- data/.git/logs/refs/heads/master +4 -0
- data/.git/logs/refs/remotes/origin/master +1 -0
- data/.git/objects/04/cd62e7f8158fe54d21e6f63617c43b593b8b59 +0 -0
- data/.git/objects/06/c2384aa5f8b5614038b48a726d1d4f98a00f3b +0 -0
- data/.git/objects/11/9db1e92a2d4c7ff2c6d9a58940aa25d8bd4bc3 +0 -0
- data/.git/objects/15/8eef048d128710bfc0cb60114f7405e45f9b6c +2 -0
- data/.git/objects/1b/d7d8887251e9bd43d88a5da5115ff4f1f5f10d +0 -0
- data/.git/objects/1c/14e28ef05892ccfe61da3dc28e16f87040fe43 +0 -0
- data/.git/objects/24/62bd996e6c1b78d669a9eb3303c74217260f4b +0 -0
- data/.git/objects/25/ad912bcedeb900c551388c8d4f062812848af2 +0 -0
- data/.git/objects/27/f8a63386b8acf5edba3ed9334644455045acd8 +0 -0
- data/.git/objects/3d/5b84167d35cb75647f38a6d475a452ba3c6178 +0 -0
- data/.git/objects/44/c96e2a778dcc62c10b3c329ab0211115a9f546 +0 -0
- data/.git/objects/46/3353505eed0c799d05f025788437decbabafec +0 -0
- data/.git/objects/47/afb623cc9949394fc403bc977671307c1a9eda +0 -0
- data/.git/objects/49/ca132451f70ee989ff7a7cf487b029fe706b28 +0 -0
- data/.git/objects/53/b8187421c09e55e44b8d6fb3c4cd7feb0a51b2 +0 -0
- data/.git/objects/65/e77ca17328dfeb3477287af40fb834284c8f61 +0 -0
- data/.git/objects/66/95d9ac4648cdadd9922d3b355a1d6f56547f4c +0 -0
- data/.git/objects/6b/779e60dfa44ba3daa26badf65b3422f30c7b9b +2 -0
- data/.git/objects/6c/e5f7ee8ecbaa20a264bb2f2fb2fd821b5ad478 +0 -0
- data/.git/objects/6f/72c276ac50a5731aa5f7e7e01dd2793113fe5b +0 -0
- data/.git/objects/74/4d46a654ae9e0867055184f2011668c7e1acd2 +0 -0
- data/.git/objects/75/c64796b5ffb6107b861cfa77fa28e8e43a1156 +1 -0
- data/.git/objects/82/0190b802ed213aab7a56a928a09db06e2a90a2 +0 -0
- data/.git/objects/86/23de615f686de621ca23cbbff6a07885101df9 +0 -0
- data/.git/objects/8a/d2c8f5ee0627cf48aa39d5f10578f929bfc2c5 +0 -0
- data/.git/objects/8f/5465ea782955ad019122d92a0f162945339f8e +0 -0
- data/.git/objects/94/afd196cc89d60f0a06d4cad619eaa79921a9ae +0 -0
- data/.git/objects/97/5b5b662b4c712668b3fe5dfe917000338e6b3e +0 -0
- data/.git/objects/99/a23df6dd9c448928b25f2e749871c6fc696a32 +0 -0
- data/.git/objects/9c/20b1616810e3d1d5951ea6251ff2d28322dc16 +0 -0
- data/.git/objects/9d/9f28ff50236f1e7f78cbd17b8aa25a0bf8b6fc +4 -0
- data/.git/objects/9f/91a2fdd59ecdfb4f8f5025fdbe590eb536e96f +0 -0
- data/.git/objects/a0/90ab2a9e739787b6090c187acf95fdd763afef +0 -0
- data/.git/objects/a2/d43a3a789e655cc306618d480193709d580c30 +2 -0
- data/.git/objects/a4/c75ead5dcfe97a67d302464584be205e8c48b1 +0 -0
- data/.git/objects/ad/66aac16165dd71456e4488069248d6f10ebb8f +0 -0
- data/.git/objects/b8/aaaf4949881600102a72a60f17fd58918dbd7b +0 -0
- data/.git/objects/b8/efcaff7f11cc584ac44303449d96592853c528 +2 -0
- data/.git/objects/b9/ecca04b12de69ffab2cc5d22cb52d5babef24f +2 -0
- data/.git/objects/be/29c116694d85d48cf177cf30816aa159189536 +0 -0
- data/.git/objects/df/f63029f32b25c2bf18d0f3f4e7907daa7c1bca +0 -0
- data/.git/objects/e9/46302310acac8a7a6b64a58b47062934765ede +0 -0
- data/.git/objects/f1/9154fc5093f2fd56f2660f386975b2a79be76f +0 -0
- data/.git/refs/heads/master +1 -1
- data/.git/refs/remotes/origin/master +1 -1
- data/Rakefile +1 -1
- data/lib/mongo_mapper_ext/db_config.rb +76 -0
- data/lib/mongo_mapper_ext/fixes.rb +9 -6
- data/lib/mongo_mapper_ext/migration.rb +33 -52
- data/lib/mongo_mapper_ext/mongo_mapper.rb +1 -150
- data/lib/mongo_mapper_ext/plugins/attributes_cache.rb +22 -0
- data/lib/mongo_mapper_ext/plugins/default_scope.rb +40 -0
- data/lib/mongo_mapper_ext/plugins/micelaneous.rb +17 -0
- data/lib/mongo_mapper_ext/spec_helper.rb +2 -6
- data/lib/mongo_mapper_ext/view_helpers.rb +2 -0
- data/lib/mongo_mapper_ext.rb +22 -2
- data/lib/rails_ext/config_files/safe_hash.rb +10 -2
- data/spec/mongo_mapper_ext/default_scope_spec.rb +62 -0
- data/spec/mongo_mapper_ext/mongo_mapper_migration_spec.rb +74 -0
- data/spec/{safe_hash_spec.rb → rails_ext/safe_hash_spec.rb} +2 -2
- metadata +53 -7
- data/lib/mongo_mapper_ext/multitenant.rb +0 -8
- data/lib/mongo_mapper_ext/object_id.rb +0 -12
- data/spec/mongo_mapper_migration_spec.rb +0 -137
data/.git/index
CHANGED
|
Binary file
|
data/.git/logs/HEAD
CHANGED
|
@@ -32,3 +32,7 @@ a59472e8ecb5d06647adeec11ae931b956508191 08f5dafa9123b7f8d1f22a796c4cba4a4063ad0
|
|
|
32
32
|
08f5dafa9123b7f8d1f22a796c4cba4a4063ad0d b533c1c1bca9eae5b7e75c639fff8ec2c2f9fea1 alex <alex@amac.local> 1267048597 +0300 commit: refactor mongo connections and add multitenant migration with specs
|
|
33
33
|
b533c1c1bca9eae5b7e75c639fff8ec2c2f9fea1 288e20f19c6662b1425e0a0797ae443f7eddcc4a alex <alex@amac.local> 1267051247 +0300 commit: upd
|
|
34
34
|
288e20f19c6662b1425e0a0797ae443f7eddcc4a 480602886685e84f2a257eb8e95acfc8af1166b6 alex <alex@amac.local> 1268137298 +0300 commit: upd
|
|
35
|
+
480602886685e84f2a257eb8e95acfc8af1166b6 158eef048d128710bfc0cb60114f7405e45f9b6c alex <alex@amac.local> 1268680881 +0300 commit: add default_scope to MM
|
|
36
|
+
158eef048d128710bfc0cb60114f7405e45f9b6c b8efcaff7f11cc584ac44303449d96592853c528 alex <alex@amac.local> 1268692589 +0300 commit: refactor MM and switch to single DB for accounts
|
|
37
|
+
b8efcaff7f11cc584ac44303449d96592853c528 1c14e28ef05892ccfe61da3dc28e16f87040fe43 alex <alex@amac.local> 1268699329 +0300 commit: update mongo-mapper migrations
|
|
38
|
+
1c14e28ef05892ccfe61da3dc28e16f87040fe43 94afd196cc89d60f0a06d4cad619eaa79921a9ae alex <alex@amac.local> 1268706470 +0300 commit: upd
|
data/.git/logs/refs/heads/master
CHANGED
|
@@ -32,3 +32,7 @@ a59472e8ecb5d06647adeec11ae931b956508191 08f5dafa9123b7f8d1f22a796c4cba4a4063ad0
|
|
|
32
32
|
08f5dafa9123b7f8d1f22a796c4cba4a4063ad0d b533c1c1bca9eae5b7e75c639fff8ec2c2f9fea1 alex <alex@amac.local> 1267048597 +0300 commit: refactor mongo connections and add multitenant migration with specs
|
|
33
33
|
b533c1c1bca9eae5b7e75c639fff8ec2c2f9fea1 288e20f19c6662b1425e0a0797ae443f7eddcc4a alex <alex@amac.local> 1267051247 +0300 commit: upd
|
|
34
34
|
288e20f19c6662b1425e0a0797ae443f7eddcc4a 480602886685e84f2a257eb8e95acfc8af1166b6 alex <alex@amac.local> 1268137298 +0300 commit: upd
|
|
35
|
+
480602886685e84f2a257eb8e95acfc8af1166b6 158eef048d128710bfc0cb60114f7405e45f9b6c alex <alex@amac.local> 1268680881 +0300 commit: add default_scope to MM
|
|
36
|
+
158eef048d128710bfc0cb60114f7405e45f9b6c b8efcaff7f11cc584ac44303449d96592853c528 alex <alex@amac.local> 1268692589 +0300 commit: refactor MM and switch to single DB for accounts
|
|
37
|
+
b8efcaff7f11cc584ac44303449d96592853c528 1c14e28ef05892ccfe61da3dc28e16f87040fe43 alex <alex@amac.local> 1268699329 +0300 commit: update mongo-mapper migrations
|
|
38
|
+
1c14e28ef05892ccfe61da3dc28e16f87040fe43 94afd196cc89d60f0a06d4cad619eaa79921a9ae alex <alex@amac.local> 1268706470 +0300 commit: upd
|
|
@@ -30,3 +30,4 @@ a59472e8ecb5d06647adeec11ae931b956508191 08f5dafa9123b7f8d1f22a796c4cba4a4063ad0
|
|
|
30
30
|
08f5dafa9123b7f8d1f22a796c4cba4a4063ad0d b533c1c1bca9eae5b7e75c639fff8ec2c2f9fea1 alex <alex@amac.local> 1267048616 +0300 update by push
|
|
31
31
|
b533c1c1bca9eae5b7e75c639fff8ec2c2f9fea1 288e20f19c6662b1425e0a0797ae443f7eddcc4a alex <alex@amac.local> 1267051254 +0300 update by push
|
|
32
32
|
288e20f19c6662b1425e0a0797ae443f7eddcc4a 480602886685e84f2a257eb8e95acfc8af1166b6 alex <alex@amac.local> 1268137307 +0300 update by push
|
|
33
|
+
480602886685e84f2a257eb8e95acfc8af1166b6 94afd196cc89d60f0a06d4cad619eaa79921a9ae alex <alex@amac.local> 1268706480 +0300 update by push
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
xmM=�0u�W��v!F�B$88JLgS� M���~,�xK%���ww�^�L��~�*��M!��l�(�ܝ^B�548R��@��:(��d�,=�V��b3��>��fZ*��ۤ�6g�@
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
x�TK��0�9�b�H���^Z )ͩ�V���c�B��wLmHZE���!��� b�y}��x�����_���+P�Y��e���(�-�X|<=)�,Q6�{�8~���k�C��G+Z����wJ��j�d�B�S�3��l���V ��O�~#!�<���Y�$f�JX��T:��9��P�Aj,��
|
|
2
|
+
�s�^ �u�v�r<B�a�"A�e|üC�qi+�rї�\��Qo�r���_
|
|
3
|
+
�֪/��f���q���,�-���B�0G�5��A��ވ��5%m���\�����9��V�J'ۈT_�5�|��ф�w��`B%�6�]W�xr� &�Q��px&A�J'|o���:��Q'$�A;ڙ��r��5V�ˁI�q�ѡf�O�(�����x��ݜ3O�fy��X��%pX��eP)̡r��K4:PD=R�H^&k��`t��9.�����{��S�^��
|
|
4
|
+
t{ƴc�.�g45��.m��u�m$éE��ŅF(
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/.git/refs/heads/master
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
94afd196cc89d60f0a06d4cad619eaa79921a9ae
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
94afd196cc89d60f0a06d4cad619eaa79921a9ae
|
data/Rakefile
CHANGED
|
@@ -18,7 +18,7 @@ require 'fileutils'
|
|
|
18
18
|
|
|
19
19
|
spec = Gem::Specification.new do |s|
|
|
20
20
|
s.name = "rails-ext"
|
|
21
|
-
s.version = "0.2.
|
|
21
|
+
s.version = "0.2.18"
|
|
22
22
|
s.summary = "Set of common Ruby on Rails extensions"
|
|
23
23
|
s.description = "Set of common Ruby on Rails extensions"
|
|
24
24
|
s.author = "Alexey Petrushin"
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module MongoMapper
|
|
2
|
+
class ConnectionsPool < Hash
|
|
3
|
+
attr_accessor :mongo_mapper
|
|
4
|
+
def initialize mongo_mapper
|
|
5
|
+
self.mongo_mapper = mongo_mapper
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def [](database_alias)
|
|
9
|
+
database_alias = database_alias.to_s
|
|
10
|
+
unless connection = super(database_alias)
|
|
11
|
+
mongo_mapper.db_config.should! :include, database_alias
|
|
12
|
+
db_options = mongo_mapper.db_config[database_alias]
|
|
13
|
+
connection = Mongo::Connection.new(db_options['host'], db_options['port'], :logger => mongo_mapper.logger)
|
|
14
|
+
|
|
15
|
+
if defined?(PhusionPassenger)
|
|
16
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
|
17
|
+
connection.connect_to_master if forked
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
self[database_alias] = connection
|
|
22
|
+
end
|
|
23
|
+
return connection
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class DatabasesPool < Hash
|
|
28
|
+
attr_accessor :mongo_mapper
|
|
29
|
+
def initialize mongo_mapper
|
|
30
|
+
self.mongo_mapper = mongo_mapper
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def [](database_alias)
|
|
34
|
+
database_alias = database_alias.to_s
|
|
35
|
+
unless db = super(database_alias)
|
|
36
|
+
mongo_mapper.db_config.should! :include, database_alias
|
|
37
|
+
db_options = mongo_mapper.db_config[database_alias]
|
|
38
|
+
db = mongo_mapper.connections[database_alias].db db_options['name'].should!(:be_a, String)
|
|
39
|
+
self[database_alias] = db
|
|
40
|
+
end
|
|
41
|
+
return db
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class << self
|
|
46
|
+
attr_accessor :db_config
|
|
47
|
+
|
|
48
|
+
def db_config
|
|
49
|
+
unless @db_config
|
|
50
|
+
if defined?(::Rails) and defined?(DATABASE)
|
|
51
|
+
@db_config = {}
|
|
52
|
+
DATABASE["#{::Rails.env}!"].to_h.each do |db_alias, options|
|
|
53
|
+
@db_config[db_alias.to_s] = {
|
|
54
|
+
'name' => options.name!,
|
|
55
|
+
'host' => options.host(nil),
|
|
56
|
+
'port' => options.port(nil)
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
else
|
|
60
|
+
@db_config = {}
|
|
61
|
+
# raise "If you don't using Rails you must override this method and provide your own config!"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
@db_config
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def connections
|
|
68
|
+
@connections ||= ConnectionsPool.new(self)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def databases
|
|
72
|
+
@databases ||= DatabasesPool.new(self)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
#
|
|
2
|
+
# ObjectID
|
|
3
|
+
#
|
|
4
|
+
Mongo::ObjectID.class_eval do
|
|
5
|
+
def == other
|
|
6
|
+
self.to_s == other.to_s
|
|
7
|
+
end
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
def to_yaml *args
|
|
10
|
+
to_s.to_yaml *args
|
|
8
11
|
end
|
|
9
12
|
end
|
|
@@ -20,90 +20,71 @@ module MongoMapper::Migration
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
class << self
|
|
23
|
-
def
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
block.call definition
|
|
27
|
-
migration_definitions[version] = definition
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def define_global_migration version, &block
|
|
23
|
+
def define database_alias, version, &block
|
|
24
|
+
database_alias = database_alias.to_s
|
|
25
|
+
|
|
31
26
|
version.should! :be_a, Integer
|
|
32
27
|
definition = MigrationDefinition.new
|
|
33
28
|
block.call definition
|
|
34
|
-
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def update_global_database_to version
|
|
38
|
-
puts "Migration for Global Database:"
|
|
39
|
-
update_database MongoMapper.global_database, global_migration_definitions, version
|
|
29
|
+
definitions[database_alias][version] = definition
|
|
40
30
|
end
|
|
41
|
-
|
|
42
|
-
def
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
31
|
+
|
|
32
|
+
def update database_alias, version
|
|
33
|
+
database_alias = database_alias.to_s
|
|
34
|
+
db = MongoMapper.databases[database_alias]
|
|
35
|
+
|
|
36
|
+
if metadata(db).version == version
|
|
37
|
+
MongoMapper.logger.info "Database #{database_alias} already is of #{version} version, no migration needed."
|
|
38
|
+
return false
|
|
39
|
+
else
|
|
40
|
+
MongoMapper.logger.info "Migration for '#{database_alias}' Database:"
|
|
50
41
|
end
|
|
51
|
-
|
|
42
|
+
|
|
43
|
+
increase_db_version database_alias, db while metadata(db).version < version
|
|
44
|
+
decrease_db_version database_alias, db while metadata(db).version > version
|
|
45
|
+
true
|
|
52
46
|
end
|
|
53
|
-
|
|
47
|
+
|
|
54
48
|
def metadata db
|
|
55
49
|
col = db.collection 'db_metadata'
|
|
56
50
|
metadata = (col.find_one || {:version => 0}).to_openobject
|
|
57
51
|
end
|
|
58
52
|
|
|
59
|
-
def
|
|
60
|
-
|
|
53
|
+
def definitions
|
|
54
|
+
@definitions ||= Hash.new{|h, k| h[k] = []}
|
|
55
|
+
end
|
|
61
56
|
|
|
62
57
|
protected
|
|
63
|
-
def increase_db_version
|
|
58
|
+
def increase_db_version database_alias, db
|
|
64
59
|
m = metadata(db)
|
|
65
|
-
migration =
|
|
66
|
-
raise "No upgrade for version #{m.version + 1}" unless migration and migration.up
|
|
60
|
+
migration = definitions[database_alias][m.version + 1]
|
|
61
|
+
raise "No upgrade for version #{m.version + 1} of #{database_alias} Database!" unless migration and migration.up
|
|
67
62
|
|
|
68
|
-
migration.up.call
|
|
63
|
+
migration.up.call db
|
|
69
64
|
|
|
70
|
-
m.version += 1
|
|
65
|
+
m.version += 1
|
|
71
66
|
update_metadata db, m
|
|
72
67
|
|
|
73
|
-
|
|
68
|
+
MongoMapper.logger.info "Database #{database_alias} upgraded to version #{m.version}."
|
|
74
69
|
end
|
|
75
70
|
|
|
76
|
-
def decrease_db_version
|
|
71
|
+
def decrease_db_version database_alias, db
|
|
77
72
|
m = metadata(db)
|
|
78
|
-
migration =
|
|
79
|
-
raise "No downgrade for version #{m.version}" unless migration and migration.down
|
|
73
|
+
migration = definitions[database_alias][m.version]
|
|
74
|
+
raise "No downgrade for version #{m.version} of #{database_alias} Database!" unless migration and migration.down
|
|
80
75
|
|
|
81
|
-
migration.down.call
|
|
76
|
+
migration.down.call db
|
|
82
77
|
|
|
83
78
|
m.version -= 1
|
|
84
79
|
update_metadata db, m
|
|
85
80
|
|
|
86
|
-
|
|
81
|
+
MongoMapper.logger.info "Database #{database_alias} downgraded to version #{m.version}."
|
|
87
82
|
end
|
|
88
|
-
|
|
89
|
-
def update_database db, migrations, version
|
|
90
|
-
if metadata(db).version == version
|
|
91
|
-
puts "Database #{db.name} already is of #{version} version, no migration needed"
|
|
92
|
-
return false
|
|
93
|
-
end
|
|
94
83
|
|
|
95
|
-
increase_db_version migrations, db while metadata(db).version < version
|
|
96
|
-
decrease_db_version migrations, db while metadata(db).version > version
|
|
97
|
-
true
|
|
98
|
-
end
|
|
99
84
|
|
|
100
85
|
def update_metadata db, metadata
|
|
101
86
|
col = db.collection 'db_metadata'
|
|
102
87
|
col.save metadata.to_hash
|
|
103
88
|
end
|
|
104
|
-
|
|
105
|
-
def reset
|
|
106
|
-
[global_migration_definitions, migration_definitions].every.clear
|
|
107
|
-
end
|
|
108
89
|
end
|
|
109
90
|
end
|
|
@@ -1,160 +1,11 @@
|
|
|
1
1
|
MongoMapper.class_eval do
|
|
2
|
-
const_set :ACCOUNT_TOKEN, ':account'
|
|
3
2
|
class << self
|
|
4
|
-
#
|
|
5
|
-
# Config
|
|
6
|
-
#
|
|
7
|
-
attr_accessor :custom_config
|
|
8
|
-
|
|
9
|
-
def config
|
|
10
|
-
unless @config
|
|
11
|
-
@config = if defined?(Rails) and defined?(DATABASE)
|
|
12
|
-
global_database = DATABASE["#{Rails.env}!"].global_database!
|
|
13
|
-
accounts_database = DATABASE["#{Rails.env}!"].accounts_database!
|
|
14
|
-
config = {
|
|
15
|
-
:global_database => {
|
|
16
|
-
:name => global_database.name!,
|
|
17
|
-
:host => global_database.host(nil),
|
|
18
|
-
:port => global_database.port(nil)
|
|
19
|
-
}.to_openobject,
|
|
20
|
-
:accounts_database => {
|
|
21
|
-
:name => accounts_database.name!,
|
|
22
|
-
:host => accounts_database.host(nil),
|
|
23
|
-
:port => accounts_database.port(nil)
|
|
24
|
-
}.to_openobject
|
|
25
|
-
}.to_openobject
|
|
26
|
-
else
|
|
27
|
-
raise "If you don't using Rails you must override this method and provide your own custom_config!" if custom_config.blank?
|
|
28
|
-
custom_config
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Global database should't looks the same as Account database. We need to distinguish it by names!
|
|
32
|
-
db_pattern = accounts_database.name
|
|
33
|
-
re = Regexp.new(db_pattern.gsub(MongoMapper::ACCOUNT_TOKEN, '.+'))
|
|
34
|
-
raise "Global Database Name shouldn't be similar to Account Database Name!" if global_database.name =~ re
|
|
35
|
-
end
|
|
36
|
-
@config
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
#
|
|
40
|
-
# Global Database
|
|
41
|
-
#
|
|
42
|
-
def global_connection
|
|
43
|
-
unless @global_connection
|
|
44
|
-
@global_connection = Mongo::Connection.new(config.global_database.host, config.global_database.port, :logger => logger)
|
|
45
|
-
|
|
46
|
-
if defined?(PhusionPassenger)
|
|
47
|
-
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
|
48
|
-
@global_connection.connect_to_master if forked
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
@global_connection
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def global_database
|
|
56
|
-
@global_database ||= global_connection.db config.global_database.name
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def current_global_database
|
|
60
|
-
global_database
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
#
|
|
65
|
-
# Accounts Database
|
|
66
|
-
#
|
|
67
|
-
def account_connection
|
|
68
|
-
unless @account_connection
|
|
69
|
-
@account_connection = Mongo::Connection.new(config.accounts_database.host, config.accounts_database.port, :logger => logger)
|
|
70
|
-
|
|
71
|
-
if defined?(PhusionPassenger)
|
|
72
|
-
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
|
73
|
-
@account_connection.connect_to_master if forked
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
@account_connection
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
attr_accessor :multitenant_mode
|
|
81
|
-
def multitenant_mode?; !!@multitenant_mode end
|
|
82
|
-
|
|
83
|
-
def account_database_name account_name
|
|
84
|
-
db_name_template = config.accounts_database.name
|
|
85
|
-
db_name_template.should! :include, MongoMapper::ACCOUNT_TOKEN
|
|
86
|
-
db_name = db_name_template.gsub(MongoMapper::ACCOUNT_TOKEN, account_name)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def account_database account_name, &block
|
|
90
|
-
self.logger.warn "Previous database #{self.database.name} has note be closed!" if multitenant_mode?
|
|
91
|
-
|
|
92
|
-
db_name = account_database_name account_name
|
|
93
|
-
|
|
94
|
-
begin
|
|
95
|
-
self.connection = account_connection
|
|
96
|
-
self.database = db_name
|
|
97
|
-
self.multitenant_mode = true
|
|
98
|
-
block.call self.database if block
|
|
99
|
-
ensure
|
|
100
|
-
if block
|
|
101
|
-
self.multitenant_mode = false
|
|
102
|
-
self.database = nil
|
|
103
|
-
self.connection = nil
|
|
104
|
-
else
|
|
105
|
-
self.logger.warn "Account Database #{self.database.name} will not be closed automatically!"
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def current_account_database
|
|
111
|
-
multitenant_mode? ? database : nil
|
|
112
|
-
end
|
|
113
3
|
|
|
114
4
|
def logger
|
|
115
5
|
return @logger ||= Logger.new(nil) if defined?(Spec)
|
|
116
|
-
|
|
6
|
+
|
|
117
7
|
@logger ||= ("irb" == $0) ? Logger.new(STDOUT) : (defined?(Rails) ? Rails.logger : Logger.new(STDOUT))
|
|
118
8
|
end
|
|
119
9
|
|
|
120
|
-
def accounts_names
|
|
121
|
-
accounts_names = []
|
|
122
|
-
db_pattern = MongoMapper.config.accounts_database.name
|
|
123
|
-
re = Regexp.new(db_pattern.gsub(MongoMapper::ACCOUNT_TOKEN, '.+'))
|
|
124
|
-
|
|
125
|
-
token_start = db_pattern.index MongoMapper::ACCOUNT_TOKEN
|
|
126
|
-
token_size = MongoMapper::ACCOUNT_TOKEN.size
|
|
127
|
-
|
|
128
|
-
prefix_size = token_start
|
|
129
|
-
postfix_size = db_pattern.size - prefix_size - token_size
|
|
130
|
-
|
|
131
|
-
MongoMapper.account_connection.database_names.each do |name|
|
|
132
|
-
if name =~ re
|
|
133
|
-
account_name = name[prefix_size..-(postfix_size + 1)]
|
|
134
|
-
accounts_names << account_name
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
accounts_names
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
#
|
|
144
|
-
# cache
|
|
145
|
-
#
|
|
146
|
-
MongoMapper::Document::InstanceMethods.class_eval do
|
|
147
|
-
def cache
|
|
148
|
-
@cache ||= {}
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def clear_cache
|
|
152
|
-
@cache = {}
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def reload_with_cache
|
|
156
|
-
@cache.clear if @cache
|
|
157
|
-
reload_without_cache
|
|
158
10
|
end
|
|
159
|
-
alias_method_chain :reload, :cache
|
|
160
11
|
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module MongoMapper
|
|
2
|
+
module Plugins
|
|
3
|
+
module AttributesCache
|
|
4
|
+
|
|
5
|
+
module InstanceMethods
|
|
6
|
+
def cache
|
|
7
|
+
@cache ||= {}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def clear_cache
|
|
11
|
+
@cache = {}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def reload
|
|
15
|
+
@cache.clear if @cache
|
|
16
|
+
super
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module MongoMapper
|
|
2
|
+
module Plugins
|
|
3
|
+
module DefaultScope
|
|
4
|
+
|
|
5
|
+
module ClassMethods
|
|
6
|
+
def default_scope options = nil, &block
|
|
7
|
+
options.should! :be_a, [NilClass, Hash]
|
|
8
|
+
self.write_inheritable_attribute(:default_scope, (options || block))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def find_one options = {}
|
|
12
|
+
super default_scope_options.merge(options)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def find_many options = {}
|
|
16
|
+
super default_scope_options.merge(options)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def count options={}
|
|
20
|
+
super default_scope_options.merge(options)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
def default_scope_options
|
|
25
|
+
default_scope = self.read_inheritable_attribute(:default_scope)
|
|
26
|
+
if default_scope
|
|
27
|
+
if default_scope.respond_to? :call
|
|
28
|
+
default_scope.call self
|
|
29
|
+
else
|
|
30
|
+
default_scope
|
|
31
|
+
end
|
|
32
|
+
else
|
|
33
|
+
{}
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module MongoMapper
|
|
2
|
+
module Plugins
|
|
3
|
+
module Micelaneous
|
|
4
|
+
|
|
5
|
+
module ClassMethods
|
|
6
|
+
def use_database database_alias
|
|
7
|
+
database_alias = database_alias.to_s
|
|
8
|
+
MongoMapper.db_config.should! :include, database_alias
|
|
9
|
+
|
|
10
|
+
self.connection MongoMapper.connections[database_alias]
|
|
11
|
+
set_database_name MongoMapper.db_config[database_alias]['name']
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
MongoMapper.account_database 'development'
|
|
2
|
-
|
|
3
1
|
Spec::Runner.configure do |config|
|
|
4
2
|
config.before(:each) do
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
dbs.each do |db|
|
|
3
|
+
MongoMapper.db_config.each do |db_alias, opt|
|
|
4
|
+
db = MongoMapper.databases[db_alias]
|
|
9
5
|
db.collection_names.each do |name|
|
|
10
6
|
db.collection(name).drop
|
|
11
7
|
end
|