@@ -20,7 +20,7 @@ CREATE TABLE meta
20
20
);
21
21
EOF
22
22
23
- use constant MESSAGES_SCHEMA => <<'EOF' ;
23
+ use constant MESSAGES_SCHEMA_018 => <<'EOF' ;
24
24
CREATE TABLE messages
25
25
(
26
26
message_id varchar(255) primary key,
@@ -32,20 +32,49 @@ CREATE TABLE messages
32
32
size int
33
33
);
34
34
35
- CREATE INDEX id_index ON messages ( message_id(8) );
35
+ EOF
36
+
37
+ use constant MESSAGES_SCHEMA => <<'EOF' ;
38
+ CREATE TABLE messages
39
+ (
40
+ message_id varchar(255) primary key,
41
+ destination varchar(255) not null,
42
+ persistent char(1) default 'Y' not null,
43
+ in_use_by int,
44
+ body text,
45
+ timestamp int,
46
+ size int,
47
+ deliver_at int
48
+ );
49
+
50
+ CREATE INDEX id_index ON messages ( message_id );
36
51
CREATE INDEX timestamp_index ON messages ( timestamp );
37
52
CREATE INDEX destination_index ON messages ( destination );
38
53
CREATE INDEX in_use_by_index ON messages ( in_use_by );
54
+ CREATE INDEX deliver_at ON messages ( deliver_at );
39
55
40
56
EOF
41
57
58
+ sub _do_schema
59
+ {
60
+ my ($dbh , $schema ) = @_ ;
61
+ foreach my $stmt ( split (" ;" , $schema ) )
62
+ {
63
+ # strip leading/trailing whitespace
64
+ $stmt =~ s / ^\s *// ;
65
+ $stmt =~ s /\s *$// ;
66
+
67
+ $dbh -> do($stmt ) if ($stmt );
68
+ }
69
+ }
70
+
42
71
# Hopefully, this will make adding new changes that break db compatability a
43
72
# little easier. Change the database schema above, then add a check for your
44
73
# version like the examples below.
45
74
sub _upgrade
46
75
{
47
76
my $dbh = shift ;
48
- my @versions = (' 0.1.7' , ' 0.1.8' );
77
+ my @versions = (' 0.1.7' , ' 0.1.8' , ' 0.2.3 ' );
49
78
50
79
# Funny lexical scoping rules require this to be an anonymous sub or weird
51
80
# things will happen with $dbh
@@ -70,6 +99,7 @@ sub _upgrade
70
99
return (!$@ );
71
100
},
72
101
' 0.1.8' => sub { $meta_version -> (' 0.1.8' ) },
102
+ ' 0.2.3' => sub { $meta_version -> (' 0.2.3' ) },
73
103
);
74
104
75
105
my %repairs = (
@@ -79,15 +109,15 @@ sub _upgrade
79
109
},
80
110
' 0.1.8' => sub {
81
111
# 0.1.8 adds a meta table for version info
82
- $dbh -> do( META_SCHEMA );
112
+ _do_schema( $dbh , META_SCHEMA);
83
113
$dbh -> do(q{ INSERT INTO meta (key, value) VALUES ('version', '0.1.8')} );
84
114
85
115
# SQLite doesn't have a syntax for modifying column types on primary
86
116
# keys, and 1.8->1.9 made message_id a text field.
87
117
88
118
# Rename old table and create new one
89
119
$dbh -> do(' ALTER TABLE messages RENAME TO old_messages' );
90
- $dbh -> do( MESSAGES_SCHEMA );
120
+ _do_schema( $dbh , MESSAGES_SCHEMA_018 );
91
121
92
122
# Dump old table into new table
93
123
my $columns = q{
@@ -103,6 +133,31 @@ sub _upgrade
103
133
# Delete old table
104
134
$dbh -> do(' DROP TABLE old_messages' );
105
135
},
136
+ ' 0.2.3' => sub {
137
+ # we add the deliver_at column
138
+ $dbh -> do(" ALTER TABLE messages ADD COLUMN deliver_at INT" );
139
+ $dbh -> do(" CREATE INDEX deliver_at_index ON messages ( deliver_at )" );
140
+
141
+ # updated the version
142
+ $dbh -> do(" UPDATE meta SET value = '0.2.3' where key = 'version'" );
143
+
144
+ # databases created with 0.1.8 or later, didn't correctly add the indexes
145
+ # to the table (because it feeds MESSAGE_SCHEMA as a single statement to
146
+ # $db->do() rather than breaking it up);
147
+ my $indices = {
148
+ id_index => " message_id" ,
149
+ timestamp_index => " timestamp" ,
150
+ destination_index => " destination" ,
151
+ in_use_by_index => " in_use_by"
152
+ };
153
+ while (my ($name , $column ) = each %$indices )
154
+ {
155
+ eval
156
+ {
157
+ $dbh -> do(" CREATE INDEX $name ON messages ( $column )" );
158
+ };
159
+ }
160
+ }
106
161
);
107
162
108
163
my $do_repairs = 0;
@@ -126,7 +181,7 @@ sub _upgrade
126
181
if ($@ )
127
182
{
128
183
$dbh -> rollback();
129
- die " encountered errors: $! : rolling back.\n " ;
184
+ die " encountered errors: $@ : rolling back.\n " ;
130
185
}
131
186
}
132
187
}
@@ -154,9 +209,9 @@ sub _make_db
154
209
}
155
210
else
156
211
{
157
- $dbh -> do( MESSAGES_SCHEMA );
158
- $dbh -> do( META_SCHEMA );
159
- $dbh -> do(q{ INSERT INTO meta (key, value) VALUES ('version', '0.1.8 ')} );
212
+ _do_schema( $dbh , MESSAGES_SCHEMA);
213
+ _do_schema( $dbh , META_SCHEMA);
214
+ $dbh -> do(q{ INSERT INTO meta (key, value) VALUES ('version', '0.2.3 ')} );
160
215
}
161
216
$dbh -> disconnect();
162
217
}
0 commit comments