iudex-da 1.2.1-java → 1.3.0-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +30 -0
- data/Manifest.txt +10 -16
- data/bin/iudex-migrate +7 -3
- data/db/20111012173757_base.rb +117 -0
- data/db/{0070_add_created_at.rb → 20120930173600_uhash_collation_order.rb} +16 -10
- data/db/{simhash/0085_add_simhash_index.rb → index_next_visit/21500000000101_add_index_next_visit.rb} +5 -9
- data/db/{0081_remove_simhash_index.rb → simhash/21500000000001_add_simhash_index.rb} +5 -9
- data/lib/iudex-da.rb +3 -1
- data/lib/iudex-da/base.rb +1 -1
- data/lib/iudex-da/config.rb +3 -3
- data/lib/iudex-da/iudex-da-1.3.0.jar +0 -0
- data/lib/iudex-da/models.rb +66 -0
- data/lib/iudex-da/orm.rb +183 -0
- data/lib/iudex-da/work_poller.rb +307 -0
- data/pom.xml +2 -2
- data/test/setup.rb +7 -5
- data/test/test_migrate.rb +8 -22
- data/test/test_pool_factory.rb +24 -13
- data/test/test_url_model.rb +52 -0
- data/test/test_work_poller.rb +157 -0
- metadata +210 -185
- data/db/0010_base_urls.rb +0 -84
- data/db/0020_add_feed_metadata.rb +0 -37
- data/db/0021_more_feed_text.rb +0 -29
- data/db/0030_add_priority.rb +0 -28
- data/db/0040_add_visit_after.rb +0 -30
- data/db/0050_add_cache_location.rb +0 -32
- data/db/0060_url_indexes.rb +0 -41
- data/db/0080_add_simhash.rb +0 -33
- data/db/0110_host_to_domain.rb +0 -36
- data/db/index_next_visit/0100_add_index_next_visit.rb +0 -27
- data/lib/iudex-da/ar.rb +0 -66
- data/lib/iudex-da/iudex-da-1.2.1.jar +0 -0
- data/test/test_poll_work.rb +0 -132
data/History.rdoc
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
=== 1.3.0 (2012-10-4)
|
2
|
+
* Expand to iudex-core [1.2.1,1.4)
|
3
|
+
* Rewrite of WorkPoller:
|
4
|
+
* Now in Ruby, for ease of customization.
|
5
|
+
* max_priority_urls now defaults off for common cases
|
6
|
+
* do_domain_group now selectable (default off, commonly unneeded)
|
7
|
+
* domain_depth_coef (deprecated host_depth_divisor reciprocal) now
|
8
|
+
defaults nil (domain window partitioning off)
|
9
|
+
* Added new priority aging feature (priority increases with current
|
10
|
+
age of next_visit_after), on by default.
|
11
|
+
* Added new domain_union feature, which allows domain filtering,
|
12
|
+
independent size control, and faster polling, as compared with
|
13
|
+
general domain depth prioritization, when a limited set of domains
|
14
|
+
is used.
|
15
|
+
* Added new uhash_slice feature, which allows selecting a specific
|
16
|
+
segment of the overall uhash space, and scaling to multiple worker
|
17
|
+
instances (and IPs) with a shared database. This form of sharding
|
18
|
+
offers best pseudo-random balancing of URLs at the expense of
|
19
|
+
single-domain-instance politeness control.
|
20
|
+
* Replace use of Activerecord (for migrations and tests) with Sequel:
|
21
|
+
* Smaller deps, faster load times (particularly under jruby)
|
22
|
+
* Better Primary Key, composite VisitURL, type field support (models
|
23
|
+
Url).
|
24
|
+
* Provide Activerecord -> Sequel migration support (from a complete
|
25
|
+
iudex-da 1.2.1 db); consolidate prior migrations to a single base
|
26
|
+
and profile migrations.
|
27
|
+
* Add new (Sequel) migration to set "C" locale collate (aka ASCII sort
|
28
|
+
order) for uhash (required for uhash_slice, see above.) iudex-da now
|
29
|
+
depends on PostgreSQL 9.1 for COLLATE support.
|
30
|
+
|
1
31
|
=== 1.2.1 (2012-9-15)
|
2
32
|
* Upgrade to logback ~> 1.2 (dev)
|
3
33
|
|
data/Manifest.txt
CHANGED
@@ -8,29 +8,23 @@ bin/iudex-da-import
|
|
8
8
|
bin/iudex-da-simhash-dump
|
9
9
|
bin/iudex-migrate
|
10
10
|
config/config.rb
|
11
|
-
db/
|
12
|
-
db/
|
13
|
-
db/
|
14
|
-
db/
|
15
|
-
db/0040_add_visit_after.rb
|
16
|
-
db/0050_add_cache_location.rb
|
17
|
-
db/0060_url_indexes.rb
|
18
|
-
db/0070_add_created_at.rb
|
19
|
-
db/0080_add_simhash.rb
|
20
|
-
db/0081_remove_simhash_index.rb
|
21
|
-
db/0110_host_to_domain.rb
|
22
|
-
db/index_next_visit/0100_add_index_next_visit.rb
|
23
|
-
db/simhash/0085_add_simhash_index.rb
|
11
|
+
db/20111012173757_base.rb
|
12
|
+
db/20120930173600_uhash_collation_order.rb
|
13
|
+
db/index_next_visit/21500000000101_add_index_next_visit.rb
|
14
|
+
db/simhash/21500000000001_add_simhash_index.rb
|
24
15
|
lib/iudex-da/base.rb
|
25
16
|
lib/iudex-da.rb
|
26
|
-
lib/iudex-da/ar.rb
|
27
17
|
lib/iudex-da/config.rb
|
28
18
|
lib/iudex-da/factory_helper.rb
|
29
19
|
lib/iudex-da/importer.rb
|
30
20
|
lib/iudex-da/key_helper.rb
|
21
|
+
lib/iudex-da/models.rb
|
22
|
+
lib/iudex-da/orm.rb
|
31
23
|
lib/iudex-da/pool_data_source_factory.rb
|
24
|
+
lib/iudex-da/work_poller.rb
|
32
25
|
test/setup.rb
|
33
26
|
test/test_migrate.rb
|
34
|
-
test/test_poll_work.rb
|
35
27
|
test/test_pool_factory.rb
|
36
|
-
|
28
|
+
test/test_url_model.rb
|
29
|
+
test/test_work_poller.rb
|
30
|
+
lib/iudex-da/iudex-da-1.3.0.jar
|
data/bin/iudex-migrate
CHANGED
@@ -56,7 +56,8 @@ END
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
opts.on( "-d", "--debug" ) do
|
59
|
-
Logback[ 'iudex.da' ].level =
|
59
|
+
Logback[ 'iudex.da' ].level = :debug
|
60
|
+
Hooker.add( [ :iudex, :connect_props ] ) { { :log => true } }
|
60
61
|
end
|
61
62
|
opts.on( "-v", "--version", "Display version and exit" ) do
|
62
63
|
puts "iudex-da: #{DA::VERSION}"
|
@@ -65,8 +66,11 @@ END
|
|
65
66
|
Hooker.register_config( opts )
|
66
67
|
end.parse!
|
67
68
|
|
68
|
-
require 'iudex-da/
|
69
|
+
require 'iudex-da/orm'
|
69
70
|
|
70
|
-
|
71
|
+
target = ARGV[0] && ARGV[0].to_i
|
72
|
+
opts = {}
|
73
|
+
opts[ :target ] = target if target
|
74
|
+
DA::ORM::migrate( opts )
|
71
75
|
|
72
76
|
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008-2012 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
Sequel.migration do
|
18
|
+
change do
|
19
|
+
|
20
|
+
# The main/only urls table, in matching a default-setup iudex
|
21
|
+
# 1.1.0-1.2.1.
|
22
|
+
create_table( :urls ) do
|
23
|
+
|
24
|
+
twtz = "timestamp with time zone"
|
25
|
+
now = Sequel::CURRENT_TIMESTAMP
|
26
|
+
|
27
|
+
String :uhash, :null => false
|
28
|
+
# 23 byte ASCII PRIMARY KEY SHA-1 hash fragment of URL
|
29
|
+
|
30
|
+
String :url, :null => false
|
31
|
+
# Complete normalized url (exactly as used for uhash)
|
32
|
+
|
33
|
+
String :domain, :null => false
|
34
|
+
# Registration level domain from url host
|
35
|
+
|
36
|
+
String :type, :null => false
|
37
|
+
# FEED, PAGE, ROBOTS, SITEMAP
|
38
|
+
# Potentially speculative (i.e. "PAGE" before visited)
|
39
|
+
# FIXME: Or REDIRECT here instead of status?
|
40
|
+
|
41
|
+
String :etag
|
42
|
+
# HTTP ETag header used for subsequent conditional GET
|
43
|
+
# Should only be on 200 and related HTTP status, not redirect
|
44
|
+
|
45
|
+
DateTime :last_visit, :type => twtz
|
46
|
+
# Time of last visit (and thus last type,status,reason,etc.)
|
47
|
+
|
48
|
+
Integer :status
|
49
|
+
# HTTP status code or special (negative) status mapping
|
50
|
+
# null : Not yet visited
|
51
|
+
# -1 : Connection Failed
|
52
|
+
# 4xx : Permanent Failures
|
53
|
+
# 5xx : Transient server error
|
54
|
+
# 200 : Success
|
55
|
+
# 304 : Not Modified
|
56
|
+
# 301,302 : Redirect
|
57
|
+
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
58
|
+
|
59
|
+
TrueClass :pass
|
60
|
+
# null : Not yet processed (i.e. visit failed)
|
61
|
+
# false : Rejected by processing (for reason), DELETE required
|
62
|
+
# true : Fully Processed
|
63
|
+
|
64
|
+
String :reason
|
65
|
+
# null : None
|
66
|
+
# DUPE : Duplicate of referent
|
67
|
+
# rejection filter (intended as key)
|
68
|
+
|
69
|
+
String :referent
|
70
|
+
# null : None
|
71
|
+
# uhash of url this is refering to
|
72
|
+
# (includes status:REDIRECT, reason:DUPE, etc.)
|
73
|
+
|
74
|
+
String :referer
|
75
|
+
# null : None
|
76
|
+
# uhash of url this was refered from. (i.e. the feed URL)
|
77
|
+
|
78
|
+
String :title
|
79
|
+
# PAGE,FEED title
|
80
|
+
|
81
|
+
DateTime :ref_pub_date, :type => twtz
|
82
|
+
# (Latest) published date as provided from feed (may be ahead of
|
83
|
+
# or set before pub_date, below).
|
84
|
+
|
85
|
+
DateTime :pub_date, :type => twtz
|
86
|
+
# (Latest) published date as processed
|
87
|
+
|
88
|
+
String :summary
|
89
|
+
# (Feed) summary
|
90
|
+
|
91
|
+
String :content
|
92
|
+
# (Feed) content
|
93
|
+
|
94
|
+
Float :priority, :type => "real", :default => 0.0, :null => false
|
95
|
+
# Prioritization of next visit, range -INF,+INF
|
96
|
+
|
97
|
+
DateTime :next_visit_after, :type => twtz, :default => now
|
98
|
+
# null: never visit (terminal result)
|
99
|
+
# Don't visit again before the specified date.
|
100
|
+
|
101
|
+
Integer :cache_file
|
102
|
+
# 32-bit file number
|
103
|
+
|
104
|
+
Bignum :cache_file_offset
|
105
|
+
# 64-bit byte offset within file
|
106
|
+
|
107
|
+
DateTime :created_at, :type => twtz, :default => now
|
108
|
+
# When inserted
|
109
|
+
|
110
|
+
Bignum :simhash
|
111
|
+
# A simhash signature as a signed 8-byte long (should be
|
112
|
+
# compatible with java long).
|
113
|
+
|
114
|
+
primary_key [ :uhash ]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c)
|
2
|
+
# Copyright (c) 2012 David Kellum
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
5
|
# may not use this file except in compliance with the License. You
|
@@ -14,15 +14,21 @@
|
|
14
14
|
# permissions and limitations under the License.
|
15
15
|
#++
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
Sequel.migration do
|
18
|
+
up do
|
19
|
+
run <<-DDL
|
20
|
+
ALTER TABLE urls
|
21
|
+
ALTER COLUMN uhash
|
22
|
+
SET DATA TYPE text COLLATE "C"
|
23
|
+
DDL
|
24
|
+
run "REINDEX INDEX urls_pkey"
|
22
25
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
down do
|
27
|
+
run <<-DDL
|
28
|
+
ALTER TABLE urls
|
29
|
+
ALTER COLUMN uhash
|
30
|
+
SET DATA TYPE text
|
31
|
+
DDL
|
32
|
+
run "REINDEX INDEX urls_pkey"
|
26
33
|
end
|
27
|
-
|
28
34
|
end
|
@@ -14,14 +14,10 @@
|
|
14
14
|
# permissions and limitations under the License.
|
15
15
|
#++
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def self.down
|
24
|
-
remove_index( 'urls', 'simhash' )
|
17
|
+
Sequel.migration do
|
18
|
+
change do
|
19
|
+
alter_table( :urls ) do
|
20
|
+
add_index( :next_visit_after )
|
21
|
+
end
|
25
22
|
end
|
26
|
-
|
27
23
|
end
|
@@ -14,14 +14,10 @@
|
|
14
14
|
# permissions and limitations under the License.
|
15
15
|
#++
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def self.down
|
24
|
-
add_index( 'urls', [ 'simhash' ] )
|
17
|
+
Sequel.migration do
|
18
|
+
change do
|
19
|
+
alter_table( :urls ) do
|
20
|
+
add_index( :simhash )
|
21
|
+
end
|
25
22
|
end
|
26
|
-
|
27
23
|
end
|
data/lib/iudex-da.rb
CHANGED
@@ -29,8 +29,8 @@ module Iudex
|
|
29
29
|
|
30
30
|
require "#{LIB_DIR}/iudex-da-#{VERSION}.jar"
|
31
31
|
|
32
|
-
import 'iudex.da.WorkPoller'
|
33
32
|
import 'iudex.da.ContentMapper'
|
33
|
+
import 'iudex.da.ContentReader'
|
34
34
|
|
35
35
|
module Filters
|
36
36
|
import 'iudex.da.filters.UpdateFilter'
|
@@ -39,3 +39,5 @@ module Iudex
|
|
39
39
|
|
40
40
|
end
|
41
41
|
end
|
42
|
+
|
43
|
+
require 'iudex-da/work_poller.rb'
|
data/lib/iudex-da/base.rb
CHANGED
data/lib/iudex-da/config.rb
CHANGED
@@ -18,10 +18,10 @@
|
|
18
18
|
module Iudex
|
19
19
|
|
20
20
|
module DA
|
21
|
-
# Default database connection configuration for both
|
22
|
-
# (migrations, testing) and PoolDataSourceFactory.
|
21
|
+
# Default database connection configuration for both Sequel
|
22
|
+
# (migrations, testing) and JDBC PoolDataSourceFactory.
|
23
23
|
CONFIG = {
|
24
|
-
:adapter => '
|
24
|
+
:adapter => 'jdbc:postgresql',
|
25
25
|
:host => 'localhost',
|
26
26
|
:database => 'iudex_test',
|
27
27
|
:username => 'iudex',
|
Binary file
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008-2012 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'iudex-da/orm'
|
18
|
+
|
19
|
+
# Ensure setup has been run, as Sequel::Model needs the database
|
20
|
+
# connected for schema at model class creation
|
21
|
+
Iudex::DA::ORM.db
|
22
|
+
|
23
|
+
module Iudex::DA::ORM
|
24
|
+
|
25
|
+
# Url model (for urls table). Usage note: ORM::setup must be called
|
26
|
+
# before this can be loaded.
|
27
|
+
class Url < ::Sequel::Model
|
28
|
+
|
29
|
+
VisitURL = Iudex::Core::VisitURL
|
30
|
+
|
31
|
+
plugin :composition
|
32
|
+
|
33
|
+
composition( :visit_url,
|
34
|
+
:composer => proc { VisitURL.trust( url ) },
|
35
|
+
:decomposer => proc {
|
36
|
+
if v = compositions[ :visit_url ]
|
37
|
+
self.url = v.url
|
38
|
+
self.uhash = v.uhash
|
39
|
+
self.domain = v.domain
|
40
|
+
end
|
41
|
+
} )
|
42
|
+
|
43
|
+
def visit_url=( vurl )
|
44
|
+
vurl = VisitURL.normalize( vurl ) unless vurl.is_a?( VisitURL )
|
45
|
+
super( vurl )
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.find_by_url( vurl )
|
49
|
+
vurl = VisitURL.normalize( vurl ) unless vurl.is_a?( VisitURL )
|
50
|
+
self[ vurl.uhash ]
|
51
|
+
end
|
52
|
+
|
53
|
+
# Specifically include type accessors to avoid deprecation warnings for
|
54
|
+
# old ruby method.
|
55
|
+
|
56
|
+
def type
|
57
|
+
self[ :type ]
|
58
|
+
end
|
59
|
+
|
60
|
+
def type=( t )
|
61
|
+
self[ :type ] = t
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
data/lib/iudex-da/orm.rb
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008-2012 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'rjack-slf4j'
|
18
|
+
require 'iudex-da/config'
|
19
|
+
require 'sequel'
|
20
|
+
require 'jdbc/postgres'
|
21
|
+
require 'hooker'
|
22
|
+
|
23
|
+
Sequel.extension :migration
|
24
|
+
|
25
|
+
module Iudex::DA
|
26
|
+
|
27
|
+
module ORM
|
28
|
+
|
29
|
+
class << self
|
30
|
+
|
31
|
+
# The Sequel::Database instance. #setup is called if necessary.
|
32
|
+
def db
|
33
|
+
setup unless @db
|
34
|
+
@db
|
35
|
+
end
|
36
|
+
|
37
|
+
# Setup the ORM (Sequel) connection given CONFIG defaults, any
|
38
|
+
# passed opts, and connect_props config hooks.
|
39
|
+
def setup( opts = {} )
|
40
|
+
|
41
|
+
@db.disconnect if @db
|
42
|
+
|
43
|
+
log = RJack::SLF4J[ "iudex.da.sequel" ]
|
44
|
+
conf = CONFIG.merge( opts )
|
45
|
+
conf = Hooker.merge( [ :iudex, :connect_props ], conf )
|
46
|
+
|
47
|
+
conf[ :loggers ] = [ log ] if conf[ :log ]
|
48
|
+
|
49
|
+
cstr = ( "%s://%s/%s?%s" %
|
50
|
+
[ conf[ :adapter ],
|
51
|
+
[ conf[ :host ], conf[ :port ] ].compact.join( ':' ),
|
52
|
+
conf[ :database ],
|
53
|
+
params( conf ) ] )
|
54
|
+
|
55
|
+
log.info { "Connecting: #{cstr}" }
|
56
|
+
log.debug { "Full Params: #{ conf.inspect }" }
|
57
|
+
|
58
|
+
@db = Sequel.connect( cstr, conf )
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
# Migrate the DB given opts, including :target version. For
|
63
|
+
# backward compatibility, opts may be a single Integer,
|
64
|
+
# interpreted as the :target version. Setup must be called
|
65
|
+
# beforehand.
|
66
|
+
# See also opts for #migrate_ar_to_sequel
|
67
|
+
def migrate( opts = {} )
|
68
|
+
opts = {} if opts.nil?
|
69
|
+
opts = { :target => opts } if opts.is_a?( Integer )
|
70
|
+
raise "setup must be run before migrate" unless db
|
71
|
+
profiles = Hooker.apply( [ :iudex, :migration_profiles ],
|
72
|
+
opts[ :profiles ] || [] )
|
73
|
+
|
74
|
+
migrate_ar_to_sequel( opts )
|
75
|
+
|
76
|
+
pm = ProfileMigrator.new( db, profiles, opts )
|
77
|
+
pm.run
|
78
|
+
end
|
79
|
+
|
80
|
+
# Migrate from a iudex [1.1.0,1.3) database managed by
|
81
|
+
# activerecord to a 1.3.x database managed by Sequel. No-op if
|
82
|
+
# already Sequel.
|
83
|
+
# === Options
|
84
|
+
# :ar_to_sequel_migrations:: Hash<Integer,String> AR migration
|
85
|
+
# number to sequel filename
|
86
|
+
# (timestamp) map for extensions
|
87
|
+
# supported externally to iudex-da.
|
88
|
+
def migrate_ar_to_sequel( opts )
|
89
|
+
|
90
|
+
columns = ( db.table_exists?( :schema_migrations ) &&
|
91
|
+
db.schema( :schema_migrations ).map { |sr| sr[0] } )
|
92
|
+
|
93
|
+
if columns == [ :version ] # Old format AR schema_migrations
|
94
|
+
db.transaction do
|
95
|
+
versions = db.from( :schema_migrations ).
|
96
|
+
map { |r| r[ :version ].to_i }
|
97
|
+
|
98
|
+
if ( versions & AR_REQUIRED ) != AR_REQUIRED
|
99
|
+
missing = AR_REQUIRED - ( versions & AR_REQUIRED )
|
100
|
+
raise( ARNotComplete,
|
101
|
+
"Missing AR migrations #{missing.inspect}; " +
|
102
|
+
"Use 'iudex-migrate _1.2.1_' first" )
|
103
|
+
end
|
104
|
+
|
105
|
+
migrations_map = AR_TO_SEQUEL_MIGRATIONS.
|
106
|
+
merge( opts[ :ar_to_sequel_migrations ] || {} )
|
107
|
+
|
108
|
+
db.drop_table( :schema_migrations )
|
109
|
+
db.create_table( :schema_migrations ) do
|
110
|
+
String :filename, :null => false
|
111
|
+
primary_key [ :filename ]
|
112
|
+
end
|
113
|
+
|
114
|
+
sm = db[:schema_migrations]
|
115
|
+
sm.insert( :filename => '20111012173757_base.rb' )
|
116
|
+
|
117
|
+
migrations_map.each do | version, filename |
|
118
|
+
sm.insert( :filename => filename ) if versions.include?( version )
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def params( opts )
|
125
|
+
pms = {}
|
126
|
+
|
127
|
+
u = opts[ :username ]
|
128
|
+
pms[ :user ] = u if u
|
129
|
+
|
130
|
+
p = opts[ :password ]
|
131
|
+
pms[ :password ] = p if p
|
132
|
+
|
133
|
+
pms.sort.map { |*p| p.join( '=' ) }.join( '&' )
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
AR_TO_SEQUEL_MIGRATIONS = {
|
139
|
+
85 => '21500000000001_add_simhash_index.rb',
|
140
|
+
100 => '21500000000101_add_index_next_visit.rb'
|
141
|
+
}
|
142
|
+
AR_REQUIRED = [ 10, 20, 21, 30, 40, 50, 60, 70, 80, 81, 110 ]
|
143
|
+
|
144
|
+
ARNotComplete = Class.new(StandardError)
|
145
|
+
|
146
|
+
@db = nil
|
147
|
+
|
148
|
+
# Custom migrator handling "profile" directories (optional
|
149
|
+
# migrations)
|
150
|
+
class ProfileMigrator < Sequel::TimestampMigrator
|
151
|
+
|
152
|
+
def initialize( db, profiles, opts )
|
153
|
+
|
154
|
+
base = File.join( LIB_DIR, '..', '..', 'db' )
|
155
|
+
paths = [ base ]
|
156
|
+
|
157
|
+
paths += profiles.compact.map do |p|
|
158
|
+
p = p.to_s
|
159
|
+
if p =~ %r{^/}
|
160
|
+
p
|
161
|
+
else
|
162
|
+
File.join( base, p )
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
@pattern = if paths.size > 1
|
167
|
+
'{' + paths.join( ',' ) + '}'
|
168
|
+
else
|
169
|
+
paths.first
|
170
|
+
end
|
171
|
+
|
172
|
+
super( db, base, opts )
|
173
|
+
end
|
174
|
+
|
175
|
+
def get_migration_files
|
176
|
+
Dir.glob( "#{@pattern}/[0-9]*_*.rb" )
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|