cassie 1.0.6.pre2 → 1.1.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cassie/schema/README.md +61 -20
- data/lib/cassie/schema/configuration.rb +2 -2
- data/lib/cassie/schema/definition/dsl.rb +43 -0
- data/lib/cassie/schema/definition.rb +14 -0
- data/lib/cassie/schema/migrator.rb +4 -0
- data/lib/cassie/schema/queries/create_versions_table_query.rb +4 -3
- data/lib/cassie/schema/queries/delete_version_query.rb +18 -5
- data/lib/cassie/schema/queries/insert_version_query.rb +8 -3
- data/lib/cassie/schema/queries/select_versions_query.rb +11 -0
- data/lib/cassie/schema/schema_dumper.rb +125 -0
- data/lib/cassie/schema/schema_loader.rb +20 -0
- data/lib/cassie/schema/structure_dumper.rb +1 -11
- data/lib/cassie/schema/versioning.rb +2 -3
- data/lib/cassie/schema.rb +17 -0
- data/lib/cassie/tasks/schema/drop.rake +8 -3
- data/lib/cassie/tasks/schema/dump.rake +3 -3
- data/lib/cassie/tasks/schema/load.rake +4 -4
- data/lib/cassie/tasks/schema/migrate.rake +1 -1
- data/lib/cassie/tasks/schema/reset.rake +1 -1
- data/lib/cassie/tasks/schema/version_display.rb +7 -4
- data/lib/cassie/tasks.rb +1 -0
- data/lib/cassie/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16ae8e8e9728e84b78a102b1a42937d89ee9249f
|
4
|
+
data.tar.gz: 72e87ae44eab6a96c566af3c1835beaa35c194f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 994a3b26d1093f06a7004d74f75936e77a56fd34eba323891b6e5e6637a620fcd26bb50bfb128b1cd9e24fea61603b82d391a101b54118203ae4a47883034420
|
7
|
+
data.tar.gz: c4fa532a24ad9b1c9149c03394e66bc6e1fc1ef1738f57a6d43e6d13ebad5741e046bb4ebd197a5d81cbe8ce2090a16e4a23c084ff8481e03b779ac7af3abc52
|
data/lib/cassie/schema/README.md
CHANGED
@@ -65,7 +65,7 @@ cassie migrations:import
|
|
65
65
|
- done
|
66
66
|
-- done
|
67
67
|
-- Dumping Cassandra schema (version 0.0.0.1)
|
68
|
-
- Writing to db/cassandra/schema.
|
68
|
+
- Writing to db/cassandra/schema.rb
|
69
69
|
- done
|
70
70
|
-- done
|
71
71
|
```
|
@@ -93,11 +93,35 @@ cassie schema:import
|
|
93
93
|
- done
|
94
94
|
-- done
|
95
95
|
-- Dumping Cassandra schema (version 0.0.1.0)
|
96
|
-
- Writing to db/cassandra/schema.
|
96
|
+
- Writing to db/cassandra/schema.rb
|
97
97
|
- done
|
98
98
|
-- done
|
99
99
|
```
|
100
100
|
|
101
|
+
##### Initializing versioning
|
102
|
+
|
103
|
+
Locally, these import tasks will also initialiaze the local version tracking to have all migration versions recorded.
|
104
|
+
|
105
|
+
However, another developer's or environment's database does not have this schema metadata. Syncronize version tracking by initializing cassie schema with the version of the current in-database schema.
|
106
|
+
|
107
|
+
```
|
108
|
+
cassie schema:init -v 0.0.2.0
|
109
|
+
```
|
110
|
+
|
111
|
+
```
|
112
|
+
-- Initializing Cassie Versioning
|
113
|
+
-- done
|
114
|
+
-- Fast-forwarding to version 0.0.2.0
|
115
|
+
> Recorded version 0.0.0.1
|
116
|
+
> Recorded version 0.0.1.0
|
117
|
+
> Recorded version 0.0.2.0
|
118
|
+
-- done
|
119
|
+
-- Initializing 'cassie_development' Keyspace
|
120
|
+
-- done
|
121
|
+
```
|
122
|
+
|
123
|
+
This does not run any migrations, but rather updates schema version metadata, so future migrations begin after the provided version.
|
124
|
+
|
101
125
|
#### Creating a migration
|
102
126
|
|
103
127
|
```
|
@@ -180,36 +204,40 @@ cassie schema:history
|
|
180
204
|
```
|
181
205
|
|
182
206
|
#### Reporting the version status
|
207
|
+
|
208
|
+
Display all applied and unapplied migrations.
|
209
|
+
|
183
210
|
```
|
184
211
|
cassie schema:status
|
185
212
|
```
|
186
213
|
```
|
187
|
-
|
188
|
-
|
|
189
|
-
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
214
|
+
+-----------+----------------+--------+---------------------------------------------------------------+
|
215
|
+
| Number | Description | Status | Migration File |
|
216
|
+
+-----------+----------------+--------+---------------------------------------------------------------+
|
217
|
+
| 0.0.3.0 | create friends | DOWN | db/cassandra/migrations/0000_0000_0003_0000_create_friends.rb |
|
218
|
+
| * 0.0.2.0 | create users | UP | db/cassandra/migrations/0000_0000_0002_0000_create_users.rb |
|
219
|
+
| 0.1.0.0 | initial schema | UP | db/cassandra/migrations/0000_0000_0001_0000_initial_schema.rb |
|
220
|
+
+-----------+----------------+--------+---------------------------------------------------------------+
|
193
221
|
```
|
194
222
|
|
195
223
|
### Schema Management
|
196
224
|
|
197
|
-
The full schema is stored in `schema.
|
225
|
+
The full schema is stored in `schema.rb`, this is recommended to be checked into source control.
|
198
226
|
It is updated (with a full dump) after each migration, to maintain a truth-store for the schema when used with multiple developers.
|
199
227
|
|
200
|
-
|
228
|
+
#### Dump the schema
|
201
229
|
|
202
230
|
```
|
203
231
|
cassie schema:dump
|
204
232
|
```
|
205
233
|
```
|
206
234
|
-- Dumping Cassandra schema (version 0.2.0.0)
|
207
|
-
- Writing to db/cassandra/schema.
|
235
|
+
- Writing to db/cassandra/schema.rb
|
208
236
|
- done
|
209
237
|
-- done
|
210
238
|
```
|
211
239
|
|
212
|
-
|
240
|
+
#### Drop the schema
|
213
241
|
```
|
214
242
|
cassie schema:drop
|
215
243
|
```
|
@@ -222,17 +250,17 @@ cassie schema:drop
|
|
222
250
|
-- done
|
223
251
|
```
|
224
252
|
|
225
|
-
|
253
|
+
#### Load the schema
|
226
254
|
```
|
227
255
|
cassie schema:load
|
228
256
|
```
|
229
257
|
```
|
230
|
-
-- Loading Schema from db/cassandra/schema.
|
258
|
+
-- Loading Schema from db/cassandra/schema.rb
|
231
259
|
> Schema is now at version 0.2.0.0
|
232
260
|
-- done
|
233
261
|
```
|
234
262
|
|
235
|
-
|
263
|
+
#### Reset the schema
|
236
264
|
|
237
265
|
```
|
238
266
|
cassie schema:reset
|
@@ -244,12 +272,12 @@ cassie schema:reset
|
|
244
272
|
- Dropping 'cassie_schema'
|
245
273
|
- done
|
246
274
|
-- done
|
247
|
-
-- Loading Schema from db/cassandra/schema.
|
275
|
+
-- Loading Schema from db/cassandra/schema.rb
|
248
276
|
> Schema is now at version 0.2.0.0
|
249
277
|
-- done
|
250
278
|
```
|
251
279
|
|
252
|
-
|
280
|
+
#### Reset the schema and migrate
|
253
281
|
|
254
282
|
This task reload the schema from the schema file, and then proceeds with incremental migrations up to the latest migration.
|
255
283
|
|
@@ -263,7 +291,7 @@ cassie migrate:reset
|
|
263
291
|
- Dropping 'cassie_schema'
|
264
292
|
- done
|
265
293
|
-- done
|
266
|
-
-- Loading Schema from db/cassandra/schema.
|
294
|
+
-- Loading Schema from db/cassandra/schema.rb
|
267
295
|
> Schema is now at version 0.2.0.0
|
268
296
|
-- done
|
269
297
|
-- Migrating to version 0.2.1.0
|
@@ -271,12 +299,25 @@ cassie migrate:reset
|
|
271
299
|
- done (4.89 ms)
|
272
300
|
-- done
|
273
301
|
-- Dumping Cassandra schema (version 0.2.1.0)
|
274
|
-
- Writing to db/cassandra/schema.
|
302
|
+
- Writing to db/cassandra/schema.rb
|
275
303
|
- done
|
276
304
|
-- done
|
277
305
|
```
|
278
306
|
|
279
|
-
###
|
307
|
+
### Multiple Envrionments
|
308
|
+
|
309
|
+
Set the environment with `RACK_ENV`, `CASSANDRA_ENV` or the `--env`(`-e`) switch for `cassie` commands:
|
310
|
+
|
311
|
+
```
|
312
|
+
RACK_ENV=test cassie migrate:reset
|
313
|
+
```
|
314
|
+
is equivalent to
|
315
|
+
```
|
316
|
+
cassie migrate:reset -e test
|
317
|
+
```
|
318
|
+
|
319
|
+
|
320
|
+
### Version / Migration Architecture (`cassie` developers)
|
280
321
|
|
281
322
|
#### Versions
|
282
323
|
|
@@ -11,7 +11,7 @@ module Cassie::Schema
|
|
11
11
|
|
12
12
|
# @!visibility private
|
13
13
|
def self.extended(extender)
|
14
|
-
extender.paths[
|
14
|
+
extender.paths[:schema_file] = "db/cassandra/schema.rb"
|
15
15
|
extender.paths[:migrations_directory] = "db/cassandra/migrations"
|
16
16
|
extender.schema_keyspace = "cassie_schema"
|
17
17
|
extender.versions_table = "versions"
|
@@ -20,7 +20,7 @@ module Cassie::Schema
|
|
20
20
|
# Paths used for configuration loading.
|
21
21
|
#
|
22
22
|
# @return [Hash]
|
23
|
-
# * +:schema_file+ - The .
|
23
|
+
# * +:schema_file+ - The .rb file defining the current schema structure
|
24
24
|
# * +:migrations_directory+ - The directory containing the versioned schema migration .rb files
|
25
25
|
def paths
|
26
26
|
@paths ||= {}.with_indifferent_access
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Cassie::Schema
|
2
|
+
module Definition
|
3
|
+
|
4
|
+
# DSL for Cassie::Schema Defintion
|
5
|
+
# these methods can be called in a schema.rb
|
6
|
+
# file to define keyspace agnostic schema.
|
7
|
+
# When executed, they will then create that schema
|
8
|
+
# for the currently defined default keyspace found
|
9
|
+
# in +Cassie.configuration[:keyspace]+.
|
10
|
+
class DSL
|
11
|
+
class << self
|
12
|
+
|
13
|
+
# The default keyspace according to the
|
14
|
+
# cluster configuration in +Cassie.configuration[:keyspace]+
|
15
|
+
# @return [String] the keyspace name
|
16
|
+
def default_keyspace
|
17
|
+
Cassie.configuration[:keyspace]
|
18
|
+
end
|
19
|
+
|
20
|
+
# Execute the given CQL on the current cluster, using an
|
21
|
+
# unscoped session. CQL should be keyspace agnostic, where
|
22
|
+
# keyspace names are interpolated with the +#{default_keyspace}+.
|
23
|
+
# Table names must be fully qualified.
|
24
|
+
# @return [Cassandra::Result] the result of execution
|
25
|
+
def create_schema(cql)
|
26
|
+
cql.strip.split(";").each do |statement|
|
27
|
+
Cassie.session(nil).execute("#{statement.strip};")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def record_version(number, description, uuid, executor, executed_at_utc)
|
32
|
+
id = Cassandra::TimeUuid.new(uuid)
|
33
|
+
executed_at = DateTime.parse(executed_at_utc) rescue nil
|
34
|
+
version = Version.new(number, description, id, executor, executed_at)
|
35
|
+
|
36
|
+
Cassie::Schema.initialize_versioning
|
37
|
+
|
38
|
+
Cassie::Schema.record_version(version)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Cassie::Schema
|
2
|
+
|
3
|
+
# Extend Defintion to get the +define+ class method
|
4
|
+
# used to define schema for a cassandra cluster
|
5
|
+
module Definition
|
6
|
+
require_relative 'definition/dsl'
|
7
|
+
|
8
|
+
def define(&block)
|
9
|
+
raise "block required to define schema." unless block_given?
|
10
|
+
|
11
|
+
DSL.instance_eval(&block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -11,6 +11,7 @@ module Cassie::Schema
|
|
11
11
|
|
12
12
|
|
13
13
|
def initialize(target)
|
14
|
+
puts target
|
14
15
|
@target_version = build_target_version(target)
|
15
16
|
@current_version = Cassie::Schema.version
|
16
17
|
@direction = build_direction
|
@@ -60,6 +61,9 @@ module Cassie::Schema
|
|
60
61
|
duration = Benchmark.realtime do
|
61
62
|
yield(command)
|
62
63
|
end
|
64
|
+
# Sleep for 50ms to ensure TimeUuid generation jitter
|
65
|
+
# doesn't cause out-of-order records
|
66
|
+
sleep(0.050)
|
63
67
|
after_each.call(command.version, (duration*1000).round(2))
|
64
68
|
end
|
65
69
|
end
|
@@ -4,14 +4,15 @@ module Cassie::Schema
|
|
4
4
|
|
5
5
|
def statement
|
6
6
|
%(
|
7
|
-
CREATE TABLE #{Cassie::Schema.versions_table} (
|
8
|
-
|
7
|
+
CREATE TABLE IF NOT EXISTS #{Cassie::Schema.versions_table} (
|
8
|
+
application text,
|
9
|
+
env text,
|
9
10
|
id timeuuid,
|
10
11
|
number text,
|
11
12
|
description text,
|
12
13
|
executor text,
|
13
14
|
executed_at timestamp,
|
14
|
-
PRIMARY KEY (
|
15
|
+
PRIMARY KEY ((application, env), id)
|
15
16
|
) WITH CLUSTERING ORDER BY (id DESC);
|
16
17
|
)
|
17
18
|
end
|
@@ -1,13 +1,26 @@
|
|
1
1
|
module Cassie::Schema
|
2
2
|
class DeleteVersionQuery < Cassie::Modification
|
3
|
-
|
3
|
+
attr
|
4
4
|
delete_from Cassie::Schema.versions_table
|
5
5
|
|
6
|
-
where :id, :eq
|
7
|
-
where :
|
6
|
+
where :id, :eq, if: :id?
|
7
|
+
where :env, :eq
|
8
|
+
where :application, :eq
|
9
|
+
|
10
|
+
def id?
|
11
|
+
!!self.id
|
12
|
+
end
|
13
|
+
|
14
|
+
def env
|
15
|
+
#setting #env should win
|
16
|
+
return @env if defined?(@env)
|
17
|
+
Cassie.env
|
18
|
+
end
|
8
19
|
|
9
|
-
def
|
10
|
-
|
20
|
+
def application
|
21
|
+
#setting #env should win
|
22
|
+
return @application if defined?(@application)
|
23
|
+
Cassie::Schema.application
|
11
24
|
end
|
12
25
|
|
13
26
|
def keyspace
|
@@ -7,7 +7,8 @@ module Cassie::Schema
|
|
7
7
|
|
8
8
|
insert_into "#{Cassie::Schema.schema_keyspace}.#{Cassie::Schema.versions_table}"
|
9
9
|
|
10
|
-
set :
|
10
|
+
set :application
|
11
|
+
set :env
|
11
12
|
set :id
|
12
13
|
set :number
|
13
14
|
set :description
|
@@ -16,8 +17,12 @@ module Cassie::Schema
|
|
16
17
|
|
17
18
|
map_from :version
|
18
19
|
|
19
|
-
def
|
20
|
-
|
20
|
+
def env
|
21
|
+
Cassie.env
|
22
|
+
end
|
23
|
+
|
24
|
+
def application
|
25
|
+
Cassie::Schema.application
|
21
26
|
end
|
22
27
|
|
23
28
|
def executed_at?
|
@@ -3,6 +3,17 @@ module Cassie::Schema
|
|
3
3
|
|
4
4
|
select_from Cassie::Schema.versions_table
|
5
5
|
|
6
|
+
where :application, :eq
|
7
|
+
where :env, :eq
|
8
|
+
|
9
|
+
def env
|
10
|
+
Cassie.env
|
11
|
+
end
|
12
|
+
|
13
|
+
def application
|
14
|
+
Cassie::Schema.application
|
15
|
+
end
|
16
|
+
|
6
17
|
def build_result(row)
|
7
18
|
Version.new(row["number"],
|
8
19
|
row["description"],
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module Cassie::Schema
|
2
|
+
require_relative 'queries'
|
3
|
+
|
4
|
+
class SchemaDumper
|
5
|
+
# The location to dump the ruby file
|
6
|
+
attr_reader :destination_path
|
7
|
+
|
8
|
+
# The keyspace that will be extracted
|
9
|
+
# and replaced with +#{default_keyspace}+ upon dumping
|
10
|
+
attr_reader :keyspace
|
11
|
+
|
12
|
+
def initialize(opts={})
|
13
|
+
@destination_path = opts[:destination_path] || default_destination_path
|
14
|
+
@keyspace = Cassie.configuration[:keyspace]
|
15
|
+
end
|
16
|
+
|
17
|
+
# The stream to dump the source to
|
18
|
+
def stream
|
19
|
+
@stream ||= begin
|
20
|
+
prepare_stream
|
21
|
+
File.open(destination_path, "w+")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Dump the CQL for the current environment's keyspace,
|
26
|
+
# the schema metadata keyspace, and the versions rows
|
27
|
+
# that are currently in the schema versions table.
|
28
|
+
def dump
|
29
|
+
stream << <<-EOS
|
30
|
+
# This file describes the keyspace-agnostic schema
|
31
|
+
# for this application's environments.
|
32
|
+
#
|
33
|
+
# It is the definitive source of the current state
|
34
|
+
# of the schema and should not be modified directly.
|
35
|
+
#
|
36
|
+
# It is strongly recommened that this schema file be checked into source control.
|
37
|
+
#
|
38
|
+
# Use `cassie` commands to apply this schema to a particular environment:
|
39
|
+
# * Load this schema with `cassie schema:load`
|
40
|
+
# * Reset the schema to this definition with `cassie schema:reset`
|
41
|
+
Cassie::Schema.define do
|
42
|
+
|
43
|
+
EOS
|
44
|
+
stream << " create_schema <<-EOS\n"
|
45
|
+
stream << "#{keyspace_agnostic_cql}\n"
|
46
|
+
stream << "EOS\n"
|
47
|
+
stream << "\n\n"
|
48
|
+
versions.each do |v|
|
49
|
+
stream << " record_version #{version_arg_str(v)}\n"
|
50
|
+
end
|
51
|
+
stream << "end\n"
|
52
|
+
|
53
|
+
close_stream
|
54
|
+
end
|
55
|
+
|
56
|
+
def versions_table_name
|
57
|
+
"#{Cassie::Schema.schema_keyspace}.#{Cassie::Schema.versions_table}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def destination_path
|
61
|
+
@destination_path || raise("Unconfigured schema file path: `Cassie::Schema.paths[:schema_file]` is empty")
|
62
|
+
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
|
66
|
+
# Fetch the keyspace agnostic CQL ruby string that can be used to
|
67
|
+
# recreate the keyspace. The keyspace value is replaced
|
68
|
+
# with +#{default_keyspace}+
|
69
|
+
# @return [String] A ruby string with keyspace interpolated CQL commands
|
70
|
+
# @raise [RuntimeError] if the {Cassie.configuration[:keyspace]} keyspace could not be described.
|
71
|
+
def keyspace_agnostic_cql
|
72
|
+
@keyspace_structure ||= begin
|
73
|
+
args = ["-e", "'DESCRIBE KEYSPACE #{keyspace}'"]
|
74
|
+
runner = Cassie::Support::SystemCommand.new("cqlsh", args)
|
75
|
+
runner.succeed
|
76
|
+
|
77
|
+
runner.output.gsub(keyspace, '#{default_keyspace}').strip
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def versions
|
82
|
+
@versions ||= begin
|
83
|
+
versions_query.fetch
|
84
|
+
rescue Cassandra::Errors::InvalidError => e
|
85
|
+
log_versions_not_found(e)
|
86
|
+
[]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def versions_query
|
91
|
+
SelectVersionsQuery.new
|
92
|
+
end
|
93
|
+
|
94
|
+
def default_destination_path
|
95
|
+
Cassie::Schema.paths[:schema_file]
|
96
|
+
end
|
97
|
+
|
98
|
+
def prepare_stream
|
99
|
+
dir = File.dirname(destination_path)
|
100
|
+
Dir.mkdir(dir) unless File.directory?(dir)
|
101
|
+
end
|
102
|
+
|
103
|
+
def close_stream
|
104
|
+
stream.close
|
105
|
+
@stream = nil
|
106
|
+
end
|
107
|
+
|
108
|
+
def log_versions_not_found(error)
|
109
|
+
msg = "WARNING: Cassie Schema Versions table not found at '#{versions_table_name}'. Initialize your schema with `cassie schema:init` or `cassie:migrations:import` for versioned migration support."
|
110
|
+
msg << "\n\t- "
|
111
|
+
msg << error.message.split("\n").join("\n\t- ")
|
112
|
+
logger.warn(msg)
|
113
|
+
end
|
114
|
+
|
115
|
+
def logger
|
116
|
+
Cassie.logger
|
117
|
+
end
|
118
|
+
|
119
|
+
def version_arg_str(version)
|
120
|
+
<<-EOS.strip
|
121
|
+
"#{version}", "#{version.description}", "#{version.id}", "#{version.executor}", "#{version.executed_at.try(:iso8601, 6)}"
|
122
|
+
EOS
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Cassie::Schema
|
2
|
+
class SchemaLoader
|
3
|
+
attr_reader :source_path
|
4
|
+
|
5
|
+
|
6
|
+
def initialize(opts={})
|
7
|
+
@source_path = opts[:source_path] || default_source_path
|
8
|
+
end
|
9
|
+
|
10
|
+
def load
|
11
|
+
Kernel.load File.absolute_path(source_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def default_source_path
|
17
|
+
Cassie::Schema.paths[:schema_file]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -33,17 +33,7 @@ module Cassie::Schema
|
|
33
33
|
# an empty string is returned.
|
34
34
|
# @return [String] CQL commands
|
35
35
|
def schema_meta_structure
|
36
|
-
|
37
|
-
args = ["-e", "'DESCRIBE KEYSPACE #{Cassie::Schema.schema_keyspace}'"]
|
38
|
-
runner = Cassie::Support::SystemCommand.new("cqlsh", args)
|
39
|
-
runner.run
|
40
|
-
|
41
|
-
if runner.success?
|
42
|
-
runner.output
|
43
|
-
else
|
44
|
-
""
|
45
|
-
end
|
46
|
-
end
|
36
|
+
CreateVersionsTableQuery.new.to_cql
|
47
37
|
end
|
48
38
|
|
49
39
|
def versions
|
@@ -30,11 +30,10 @@ module Cassie::Schema
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# Create the keyspace and table for tracking schema versions
|
33
|
-
# in the Cassandra database
|
33
|
+
# in the Cassandra database if they don't already exist
|
34
34
|
# @return [void]
|
35
35
|
def initialize_versioning
|
36
36
|
create_schema_keyspace unless keyspace_exists?
|
37
|
-
raise Cassie::Schema::AlreadyInitiailizedError if version_exists?
|
38
37
|
create_versions_table unless versions_table_exists?
|
39
38
|
end
|
40
39
|
|
@@ -119,7 +118,7 @@ module Cassie::Schema
|
|
119
118
|
database_versions.tap do |versions|
|
120
119
|
versions.each{|v| VersionObjectLoader.new(v).load }
|
121
120
|
end
|
122
|
-
rescue Cassandra::Errors::InvalidError
|
121
|
+
rescue Cassandra::Errors::InvalidError => e
|
123
122
|
raise uninitialized_error
|
124
123
|
end
|
125
124
|
|
data/lib/cassie/schema.rb
CHANGED
@@ -14,11 +14,28 @@ module Cassie
|
|
14
14
|
module Schema
|
15
15
|
require_relative 'schema/configuration'
|
16
16
|
require_relative 'schema/versioning'
|
17
|
+
require_relative 'schema/definition'
|
17
18
|
|
18
19
|
extend Configuration
|
19
20
|
extend Versioning
|
21
|
+
extend Definition
|
22
|
+
|
23
|
+
# The application namespace. Only applicaple
|
24
|
+
# When cassie manages multiple applicaiton
|
25
|
+
# schemas within the same cluster.
|
26
|
+
# @return [String] the application namespace
|
27
|
+
def self.application
|
28
|
+
return @application if defined?(@application)
|
29
|
+
"global"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.application=(app_name)
|
33
|
+
@application = app_name
|
34
|
+
end
|
20
35
|
end
|
21
36
|
|
22
37
|
require_relative 'schema/structure_dumper'
|
23
38
|
require_relative 'schema/structure_loader'
|
39
|
+
require_relative 'schema/schema_loader'
|
40
|
+
require_relative 'schema/schema_dumper'
|
24
41
|
end
|
@@ -5,19 +5,24 @@ namespace :cassie do
|
|
5
5
|
include Cassie::Tasks::IO
|
6
6
|
begin
|
7
7
|
query = Cassie::Schema::DropKeyspaceQuery.new
|
8
|
-
keyspaces = [Cassie.configuration[:keyspace]
|
8
|
+
keyspaces = [Cassie.configuration[:keyspace]]
|
9
9
|
|
10
|
-
puts "-- Dropping #{
|
10
|
+
puts "-- Dropping '#{Cassie.env}' schema"
|
11
11
|
keyspaces.each do |keyspace|
|
12
12
|
query.keyspace = keyspace
|
13
13
|
puts " - Dropping '#{keyspace}'"
|
14
14
|
if Cassie.keyspace_exists?(keyspace)
|
15
|
-
query.execute
|
15
|
+
query.execute!
|
16
16
|
else
|
17
17
|
puts " > '#{keyspace}' does not exist"
|
18
18
|
end
|
19
19
|
puts " - done"
|
20
20
|
end
|
21
|
+
puts " - Clearning schema version metadata"
|
22
|
+
count = Cassie::Schema.applied_versions.count
|
23
|
+
Cassie::Schema::DeleteVersionQuery.new.execute!
|
24
|
+
puts " > removed #{count} #{'version'.pluralize(count)}"
|
25
|
+
puts " - done"
|
21
26
|
puts "-- done"
|
22
27
|
rescue => e
|
23
28
|
output_error(e)
|
@@ -1,12 +1,12 @@
|
|
1
1
|
namespace :cassie do
|
2
2
|
namespace :schema do
|
3
|
-
desc "Dumps the schema for
|
3
|
+
desc "Dumps the schema for configured keyspace into schema file (`db/cassandra/schema.rb` by default)"
|
4
4
|
task :dump do
|
5
5
|
include Cassie::Tasks::IO
|
6
6
|
|
7
7
|
begin
|
8
|
-
puts "-- Dumping
|
9
|
-
dumper = Cassie::Schema::
|
8
|
+
puts "-- Dumping '#{Cassie.env}' schema (version #{Cassie::Schema.version})"
|
9
|
+
dumper = Cassie::Schema::SchemaDumper.new
|
10
10
|
puts " - Writing to #{dumper.destination_path}"
|
11
11
|
dumper.dump
|
12
12
|
puts " - done"
|
@@ -1,14 +1,14 @@
|
|
1
1
|
namespace :cassie do
|
2
2
|
namespace :schema do
|
3
|
-
desc "Creates the schema by executing the
|
3
|
+
desc "Creates the schema by executing the schema file (`db/cassandra/schema.rb` by default)"
|
4
4
|
task :load do
|
5
5
|
include Cassie::Tasks::IO
|
6
6
|
|
7
7
|
begin
|
8
|
-
loader = Cassie::Schema::
|
9
|
-
puts "-- Loading Schema from #{loader.source_path}"
|
8
|
+
loader = Cassie::Schema::SchemaLoader.new
|
9
|
+
puts "-- Loading '#{Cassie.env}' Schema from #{loader.source_path}"
|
10
10
|
loader.load
|
11
|
-
puts " >
|
11
|
+
puts " > '#{Cassie.env}' schema is now at version #{Cassie::Schema.version}"
|
12
12
|
puts "-- done"
|
13
13
|
rescue => e
|
14
14
|
output_error(e)
|
@@ -8,7 +8,7 @@ namespace :cassie do
|
|
8
8
|
version = argv[0]
|
9
9
|
|
10
10
|
migrator = Cassie::Schema::Migrator.new(version)
|
11
|
-
puts "-- Migrating to version #{migrator.target_version}"
|
11
|
+
puts "-- Migrating '#{Cassie.env}' schema to version #{migrator.target_version}"
|
12
12
|
|
13
13
|
if migrator.commands.count == 0
|
14
14
|
if migrator.target_version == migrator.current_version
|
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :cassie do
|
2
2
|
namespace :schema do
|
3
|
-
desc "Creates the schema by executing the
|
3
|
+
desc "Creates the schema by executing the schema file (`db/cassandra/schema.rb` by default)"
|
4
4
|
task :reset => [:drop, :load]
|
5
5
|
end
|
6
6
|
end
|
@@ -9,8 +9,9 @@ module Cassie::Tasks
|
|
9
9
|
# Note: if we end up using this elsewhere, move to Version::VersionList
|
10
10
|
# or something simliar, and have version collection methods return that
|
11
11
|
members = [:number, :description, :executor, :executed_at]
|
12
|
-
|
13
|
-
|
12
|
+
headings = ['Number', 'Description', 'Migrated by', 'Migrated at']
|
13
|
+
title = "Environment: #{Cassie.env}"
|
14
|
+
table = Terminal::Table.new(headings: headings, title: title)
|
14
15
|
current_version = Cassie::Schema.version
|
15
16
|
|
16
17
|
versions.each.with_index do |v|
|
@@ -19,6 +20,7 @@ module Cassie::Tasks
|
|
19
20
|
row[0] = "* #{row[0]}" if v == current_version
|
20
21
|
row[1] = v.description
|
21
22
|
row[2] = v.executor
|
23
|
+
row[3] = v.executed_at
|
22
24
|
row[3] ||= "Unknown"
|
23
25
|
table.add_row(row)
|
24
26
|
end
|
@@ -30,8 +32,9 @@ module Cassie::Tasks
|
|
30
32
|
def print_statuses(versions)
|
31
33
|
# Note: if we end up using this elsewhere, move to Version::VersionList
|
32
34
|
# or something simliar, and have version collection methods return that
|
33
|
-
|
34
|
-
|
35
|
+
headings = ['Number', 'Description', 'Status', 'Migration File']
|
36
|
+
title = "Environment: #{Cassie.env}"
|
37
|
+
table = Terminal::Table.new(headings: headings, title: title)
|
35
38
|
current_version = Cassie::Schema.version
|
36
39
|
|
37
40
|
versions.each.with_index do |v|
|
data/lib/cassie/tasks.rb
CHANGED
data/lib/cassie/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cassie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.1.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Prothro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cassandra-driver
|
@@ -133,6 +133,8 @@ files:
|
|
133
133
|
- lib/cassie/schema/cassandra_migrations/importer.rb
|
134
134
|
- lib/cassie/schema/cassandra_migrations/migration_file.rb
|
135
135
|
- lib/cassie/schema/configuration.rb
|
136
|
+
- lib/cassie/schema/definition.rb
|
137
|
+
- lib/cassie/schema/definition/dsl.rb
|
136
138
|
- lib/cassie/schema/migration.rb
|
137
139
|
- lib/cassie/schema/migration/cassandra_support.rb
|
138
140
|
- lib/cassie/schema/migration/dsl.rb
|
@@ -149,6 +151,8 @@ files:
|
|
149
151
|
- lib/cassie/schema/queries/insert_version_query.rb
|
150
152
|
- lib/cassie/schema/queries/select_versions_query.rb
|
151
153
|
- lib/cassie/schema/rollback_command.rb
|
154
|
+
- lib/cassie/schema/schema_dumper.rb
|
155
|
+
- lib/cassie/schema/schema_loader.rb
|
152
156
|
- lib/cassie/schema/structure_dumper.rb
|
153
157
|
- lib/cassie/schema/structure_loader.rb
|
154
158
|
- lib/cassie/schema/version.rb
|