hotdog 0.1.17 → 0.1.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/hotdog/application.rb +1 -1
- data/lib/hotdog/commands/search.rb +50 -24
- data/lib/hotdog/commands.rb +44 -18
- data/lib/hotdog/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8deb5895caacf3aa169eaeb03aec5beb9a71a4d0
|
4
|
+
data.tar.gz: 9f26224eff745ee809401e997040509eea818d10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b77afe9612c45e00862544ae90c2d01dfa8dd5f4eeff755ec2c431ae17d98ac702df9e655b26819f771978a7b4e3a75ec8403230c863f932251aa9225697c19
|
7
|
+
data.tar.gz: 14e5e13f1d5f0e4532b5ca7b7cd981cb2eda765b24af1575bf5448acaf07426402dcebc3f774c611e746f99d8a70950cddb44ab9643ec85bcf65307a47a0e711
|
data/lib/hotdog/application.rb
CHANGED
@@ -202,7 +202,7 @@ module Hotdog
|
|
202
202
|
end
|
203
203
|
|
204
204
|
class ExpressionNode
|
205
|
-
def evaluate(environment)
|
205
|
+
def evaluate(environment, options={})
|
206
206
|
raise(NotImplementedError)
|
207
207
|
end
|
208
208
|
end
|
@@ -216,7 +216,7 @@ module Hotdog
|
|
216
216
|
@left = left
|
217
217
|
@right = right
|
218
218
|
end
|
219
|
-
def evaluate(environment)
|
219
|
+
def evaluate(environment, options={})
|
220
220
|
case @op
|
221
221
|
when "&&", "&", /\Aand\z/i
|
222
222
|
left_values = @left.evaluate(environment)
|
@@ -243,7 +243,7 @@ module Hotdog
|
|
243
243
|
@op = op
|
244
244
|
@expression = expression
|
245
245
|
end
|
246
|
-
def evaluate(environment)
|
246
|
+
def evaluate(environment, options={})
|
247
247
|
case @op
|
248
248
|
when "!", "~", /\Anot\z/i
|
249
249
|
values = @expression.evaluate(environment)
|
@@ -275,7 +275,7 @@ module Hotdog
|
|
275
275
|
def attribute?
|
276
276
|
!(attribute.nil? or attribute.to_s.empty?)
|
277
277
|
end
|
278
|
-
def evaluate(environment)
|
278
|
+
def evaluate(environment, options={})
|
279
279
|
if identifier?
|
280
280
|
if attribute?
|
281
281
|
case identifier
|
@@ -307,24 +307,51 @@ module Hotdog
|
|
307
307
|
WHERE LOWER(tags.value) = LOWER(?);
|
308
308
|
EOS
|
309
309
|
else
|
310
|
-
|
310
|
+
return []
|
311
311
|
end
|
312
312
|
end
|
313
|
-
if
|
313
|
+
if values.empty?
|
314
|
+
fallback(environment, options)
|
315
|
+
else
|
316
|
+
values
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def fallback(environment, options={})
|
321
|
+
if environment.fixed_string?
|
322
|
+
[]
|
323
|
+
else
|
314
324
|
# fallback to glob expression
|
315
325
|
identifier_glob = identifier.gsub(/[-.\/_]/, "?") if identifier?
|
316
326
|
attribute_glob = attribute.gsub(/[-.\/_]/, "?") if attribute?
|
317
327
|
if (identifier? and identifier != identifier_glob) or (attribute? and attribute != attribute_glob)
|
318
328
|
environment.logger.info("fallback to glob expression: %s:%s" % [identifier_glob, attribute_glob])
|
319
|
-
values = TagGlobExpressionNode.new(identifier_glob, attribute_glob).evaluate(environment)
|
329
|
+
values = TagGlobExpressionNode.new(identifier_glob, attribute_glob).evaluate(environment, options)
|
330
|
+
if values.empty?
|
331
|
+
reload(environment, options)
|
332
|
+
else
|
333
|
+
values
|
334
|
+
end
|
335
|
+
else
|
336
|
+
[]
|
320
337
|
end
|
321
338
|
end
|
322
|
-
|
339
|
+
end
|
340
|
+
|
341
|
+
def reload(environment, options={})
|
342
|
+
ttl = options.fetch(:ttl, 1)
|
343
|
+
if 0 < ttl
|
344
|
+
environment.logger.info("force reloading all hosts and tags.")
|
345
|
+
environment.reload(force: true)
|
346
|
+
self.class.new(identifier, attribute).evaluate(environment, options.merge(ttl: ttl-1))
|
347
|
+
else
|
348
|
+
[]
|
349
|
+
end
|
323
350
|
end
|
324
351
|
end
|
325
352
|
|
326
353
|
class TagGlobExpressionNode < TagExpressionNode
|
327
|
-
def evaluate(environment)
|
354
|
+
def evaluate(environment, options={})
|
328
355
|
if identifier?
|
329
356
|
if attribute?
|
330
357
|
case identifier
|
@@ -356,19 +383,14 @@ module Hotdog
|
|
356
383
|
WHERE LOWER(tags.value) GLOB LOWER(?);
|
357
384
|
EOS
|
358
385
|
else
|
359
|
-
|
386
|
+
return []
|
360
387
|
end
|
361
388
|
end
|
362
|
-
if
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
if (identifier? and identifier != identifier_glob) or (attribute? and attribute != attribute_glob)
|
367
|
-
environment.logger.info("fallback to glob expression: %s:%s" % [identifier_glob, attribute_glob])
|
368
|
-
values = TagGlobExpressionNode.new(identifier_glob, attribute_glob).evaluate(environment)
|
369
|
-
end
|
389
|
+
if values.empty?
|
390
|
+
fallback(environment, options)
|
391
|
+
else
|
392
|
+
values
|
370
393
|
end
|
371
|
-
values
|
372
394
|
end
|
373
395
|
end
|
374
396
|
|
@@ -378,7 +400,7 @@ module Hotdog
|
|
378
400
|
attribute = attribute.sub(%r{\A/(.*)/\z}) { $1 } if attribute
|
379
401
|
super(identifier, attribute)
|
380
402
|
end
|
381
|
-
def evaluate(environment)
|
403
|
+
def evaluate(environment, options={})
|
382
404
|
if identifier?
|
383
405
|
if attribute?
|
384
406
|
case identifier
|
@@ -388,14 +410,14 @@ module Hotdog
|
|
388
410
|
WHERE LOWER(hosts.name) REGEXP LOWER(?);
|
389
411
|
EOS
|
390
412
|
else
|
391
|
-
environment.execute(<<-EOS, identifier, attribute).map { |row| row.first }
|
413
|
+
values = environment.execute(<<-EOS, identifier, attribute).map { |row| row.first }
|
392
414
|
SELECT DISTINCT hosts_tags.host_id FROM hosts_tags
|
393
415
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
394
416
|
WHERE LOWER(tags.name) REGEXP LOWER(?) AND LOWER(tags.value) REGEXP LOWER(?);
|
395
417
|
EOS
|
396
418
|
end
|
397
419
|
else
|
398
|
-
environment.execute(<<-EOS, identifier, identifier, identifier).map { |row| row.first }
|
420
|
+
values = environment.execute(<<-EOS, identifier, identifier, identifier).map { |row| row.first }
|
399
421
|
SELECT DISTINCT hosts_tags.host_id FROM hosts_tags
|
400
422
|
INNER JOIN hosts ON hosts_tags.host_id = hosts.id
|
401
423
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
@@ -410,10 +432,14 @@ module Hotdog
|
|
410
432
|
WHERE LOWER(tags.value) REGEXP LOWER(?);
|
411
433
|
EOS
|
412
434
|
else
|
413
|
-
|
435
|
+
return []
|
414
436
|
end
|
415
437
|
end
|
416
|
-
values
|
438
|
+
if values.empty?
|
439
|
+
reload(environment)
|
440
|
+
else
|
441
|
+
values
|
442
|
+
end
|
417
443
|
end
|
418
444
|
end
|
419
445
|
end
|
data/lib/hotdog/commands.rb
CHANGED
@@ -9,12 +9,15 @@ module Hotdog
|
|
9
9
|
module Commands
|
10
10
|
class BaseCommand
|
11
11
|
PERSISTENT_DB = "persistent.db"
|
12
|
+
MASK_DATABASE = 0xffff0000
|
13
|
+
MASK_QUERY = 0x0000ffff
|
12
14
|
|
13
15
|
def initialize(application)
|
14
16
|
@application = application
|
15
17
|
@logger = application.options[:logger]
|
16
18
|
@options = application.options
|
17
19
|
@dog = Dogapi::Client.new(options[:api_key], options[:application_key])
|
20
|
+
@prepared_statements = {}
|
18
21
|
end
|
19
22
|
attr_reader :application
|
20
23
|
attr_reader :logger
|
@@ -31,14 +34,27 @@ module Hotdog
|
|
31
34
|
q += " -- VALUES (#{args.map { |arg| Array === arg ? "(#{arg.join(", ")})" : arg.inspect }.join(", ")})"
|
32
35
|
end
|
33
36
|
logger.debug(q)
|
34
|
-
@db.execute(
|
37
|
+
prepare(@db, query).execute(args)
|
35
38
|
end
|
36
39
|
|
37
40
|
def fixed_string?()
|
38
41
|
@options[:fixed_string]
|
39
42
|
end
|
40
43
|
|
44
|
+
def reload(options={})
|
45
|
+
if @db
|
46
|
+
close_db(@db)
|
47
|
+
@db = nil
|
48
|
+
end
|
49
|
+
update_db(options)
|
50
|
+
end
|
51
|
+
|
41
52
|
private
|
53
|
+
def prepare(db, query)
|
54
|
+
k = (db.hash & MASK_DATABASE) | (query.hash & MASK_QUERY)
|
55
|
+
@prepared_statements[k] ||= db.prepare(query)
|
56
|
+
end
|
57
|
+
|
42
58
|
def format(result, options={})
|
43
59
|
@options[:formatter].format(result, @options.merge(options))
|
44
60
|
end
|
@@ -120,12 +136,22 @@ module Hotdog
|
|
120
136
|
[result, fields]
|
121
137
|
end
|
122
138
|
|
139
|
+
def close_db(db, options={})
|
140
|
+
@prepared_statements = @prepared_statements.reject { |k, statement|
|
141
|
+
(db.hash & MASK_DATABASE == k & MASK_DATABASE).tap do |delete_p|
|
142
|
+
statement.close() if delete_p
|
143
|
+
end
|
144
|
+
}
|
145
|
+
db.close()
|
146
|
+
end
|
147
|
+
|
123
148
|
def update_db(options={})
|
149
|
+
options = @options.merge(options)
|
124
150
|
if @db.nil?
|
125
|
-
FileUtils.mkdir_p(
|
126
|
-
persistent = File.join(
|
151
|
+
FileUtils.mkdir_p(options[:confdir])
|
152
|
+
persistent = File.join(options[:confdir], PERSISTENT_DB)
|
127
153
|
|
128
|
-
if not
|
154
|
+
if not options[:force] and File.exist?(persistent) and Time.new < File.mtime(persistent) + options[:expiry]
|
129
155
|
begin
|
130
156
|
persistent_db = SQLite3::Database.new(persistent)
|
131
157
|
persistent_db.execute("SELECT id, name FROM hosts LIMIT 1")
|
@@ -191,7 +217,7 @@ module Hotdog
|
|
191
217
|
FileUtils.rm_f(persistent)
|
192
218
|
persistent_db = SQLite3::Database.new(persistent)
|
193
219
|
copy_db(memory_db, persistent_db)
|
194
|
-
persistent_db
|
220
|
+
close_db(persistent_db)
|
195
221
|
@db = memory_db
|
196
222
|
else
|
197
223
|
@db
|
@@ -223,17 +249,17 @@ module Hotdog
|
|
223
249
|
|
224
250
|
def select_from_hosts(db)
|
225
251
|
logger.debug("select_from_hosts()")
|
226
|
-
db
|
252
|
+
prepare(db, "SELECT id, name FROM hosts").execute()
|
227
253
|
end
|
228
254
|
|
229
255
|
def select_from_tags(db)
|
230
256
|
logger.debug("select_from_tags()")
|
231
|
-
db
|
257
|
+
prepare(db, "SELECT id, name, value FROM tags").execute()
|
232
258
|
end
|
233
259
|
|
234
260
|
def select_from_hosts_tags(db)
|
235
261
|
logger.debug("select_from_hosts_tags()")
|
236
|
-
db
|
262
|
+
prepare(db, "SELECT host_id, tag_id FROM hosts_tags").execute()
|
237
263
|
end
|
238
264
|
|
239
265
|
def create_table_hosts(db)
|
@@ -284,32 +310,32 @@ module Hotdog
|
|
284
310
|
|
285
311
|
def insert_into_tags(db, tag_id, tag_name, tag_value)
|
286
312
|
logger.debug("insert_into_tags(%s, %s, %s)" % [tag_id.inspect, tag_name.inspect, tag_value.inspect])
|
287
|
-
db
|
313
|
+
prepare(db, "INSERT INTO tags (id, name, value) VALUES (?, ?, ?)").execute(tag_id, tag_name, tag_value)
|
288
314
|
end
|
289
315
|
|
290
316
|
def insert_or_ignore_into_tags(db, tag_name, tag_value)
|
291
317
|
logger.debug("insert_or_ignore_into_tags(%s, %s)" % [tag_name.inspect, tag_value.inspect])
|
292
|
-
db
|
318
|
+
prepare(db, "INSERT OR IGNORE INTO tags (name, value) VALUES (?, ?)").execute(tag_name, tag_value)
|
293
319
|
end
|
294
320
|
|
295
321
|
def insert_into_hosts(db, host_id, host_name)
|
296
322
|
logger.debug("insert_into_hosts(%s, %s)" % [host_id.inspect, host_name.inspect])
|
297
|
-
db
|
323
|
+
prepare(db, "INSERT INTO hosts (id, name) VALUES (?, ?)").execute(host_id, host_name)
|
298
324
|
end
|
299
325
|
|
300
326
|
def insert_or_ignore_into_hosts(db, host_name)
|
301
327
|
logger.debug("insert_or_ignore_into_hosts(%s)" % [host_name.inspect])
|
302
|
-
db
|
328
|
+
prepare(db, "INSERT OR IGNORE INTO hosts (name) VALUES (?)").execute(host_name)
|
303
329
|
end
|
304
330
|
|
305
331
|
def insert_into_hosts_tags(db, host_id, tag_id)
|
306
332
|
logger.debug("insert_into_hosts_tags(%s, %s)" % [host_id.inspect, tag_id.inspect])
|
307
|
-
db
|
333
|
+
prepare(db, "INSERT INTO hosts_tags (host_id, tag_id) VALUES (?, ?)").execute(host_id, tag_id)
|
308
334
|
end
|
309
335
|
|
310
336
|
def insert_or_replace_into_hosts_tags(db, host_name, tag_name, tag_value)
|
311
337
|
logger.debug("insert_or_replace_into_hosts_tags(%s, %s, %s)" % [host_name.inspect, tag_name.inspect, tag_value.inspect])
|
312
|
-
db.execute(
|
338
|
+
prepare(db, <<-EOS).execute(host_name, tag_name, tag_value)
|
313
339
|
INSERT OR REPLACE INTO hosts_tags (host_id, tag_id)
|
314
340
|
SELECT host.id, tag.id FROM
|
315
341
|
( SELECT id FROM hosts WHERE LOWER(name) = LOWER(?) ) AS host,
|
@@ -319,12 +345,12 @@ module Hotdog
|
|
319
345
|
|
320
346
|
def select_name_from_hosts_by_id(db, host_id)
|
321
347
|
logger.debug("select_name_from_hosts_by_id(%s)" % [host_id.inspect])
|
322
|
-
db
|
348
|
+
prepare(db, "SELECT name FROM hosts WHERE id = ? LIMIT 1").execute(host_id).map { |row| row.first }.first
|
323
349
|
end
|
324
350
|
|
325
351
|
def select_tag_values_from_hosts_tags_by_host_id_and_tag_name_glob(db, host_id, tag_name)
|
326
352
|
logger.debug("select_tag_values_from_hosts_tags_by_host_id_and_tag_name_glob(%s, %s)" % [host_id.inspect, tag_name.inspect])
|
327
|
-
db.execute(
|
353
|
+
prepare(db, <<-EOS).execute(host_id, tag_name).map { |row| row.first }.join(",")
|
328
354
|
SELECT tags.value FROM hosts_tags
|
329
355
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
330
356
|
WHERE hosts_tags.host_id = ? AND LOWER(tags.name) GLOB LOWER(?);
|
@@ -333,7 +359,7 @@ module Hotdog
|
|
333
359
|
|
334
360
|
def select_tag_values_from_hosts_tags_by_host_id_and_tag_name(db, host_id, tag_name)
|
335
361
|
logger.debug("select_tag_values_from_hosts_tags_by_host_id_and_tag_name(%s, %s)" % [host_id.inspect, tag_name.inspect])
|
336
|
-
db.execute(
|
362
|
+
prepare(db, <<-EOS).execute(host_id, tag_name).map { |row| row.first }.join(",")
|
337
363
|
SELECT tags.value FROM hosts_tags
|
338
364
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
339
365
|
WHERE hosts_tags.host_id = ? AND LOWER(tags.name) = LOWER(?);
|
@@ -342,7 +368,7 @@ module Hotdog
|
|
342
368
|
|
343
369
|
def select_tag_names_from_hosts_tags_by_host_id(db, host_id)
|
344
370
|
logger.debug("select_tag_names_from_hosts_tags_by_host_id(%s)" % [host_id.inspect])
|
345
|
-
db.execute(
|
371
|
+
prepare(db, <<-EOS).execute(host_id).map { |row| row.first }
|
346
372
|
SELECT DISTINCT tags.name FROM hosts_tags
|
347
373
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
348
374
|
WHERE hosts_tags.host_id = ?;
|
data/lib/hotdog/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hotdog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yamashita Yuu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|