· 8 years ago · Mar 08, 2018, 10:20 AM
1#!/usr/bin/env ruby
2
3require 'sqlite3'
4require 'date'
5
6class DateTime
7 def compact
8 a = "%04d%02d%02d%02d%02d%02d" % [year, month, day, hour, min, sec]
9 a.to_i
10 end
11
12 def self.uncompact(compact_str)
13 a = compact_str.to_s
14 a.gsub!(/([\d]{4})([\d]{2})([\d]{2})([\d]{2})([\d]{2})([\d]{2})/,
15 '\1-\2-\3 \4:\5:\6')
16 DateTime.new a
17 end
18
19 alias_method :inspect, :to_s
20end
21
22class Test
23 def log_startup(time, type = 'start')
24 a = @logfile.prepare 'INSERT INTO events(type,time) VALUES(?, ?)'
25 b = @logfile.prepare 'INSERT INTO starts_and_stops(event_id) VALUES(?)'
26 begin
27 @logfile.execute a, type, time.compact {}
28 @logfile.execute b, @logfile.last_insert_row_id {}
29 rescue => e
30 puts e
31 end
32 end
33
34 def create_database(filename)
35 begin
36 db = SQLite3::Database.new filename
37 events = "CREATE TABLE IF NOT EXISTS events (id INT NOT NULL "
38 events += "PRIMARY KEY, type TEXT, time INT);"
39 urls = "CREATE TABLE IF NOT EXISTS urls (id INT NOT NULL "
40 urls += "PRIMARY KEY, event_id INT, hostname TEXT, path TEXT);"
41 starts = "CREATE TABLE IF NOT EXISTS starts_and_stops (id INT "
42 starts += "NOT NULL PRIMARY KEY, event_id INT, method TEXT);"
43 sql = [events,urls,starts].each { |s|
44 raise "Invalid SQL: #{s}" unless db.complete? s
45 }.join("\n")
46 db.execute_batch(sql)
47 rescue
48 File.delete filename
49 raise
50 ensure
51 db.close unless db.closed?
52 end
53 end
54
55 def initialize
56 @logfile_name = '/tmp/sqlite-crash.sqlite3'
57 create_database @logfile_name
58 @logfile = SQLite3::Database.new @logfile_name
59 log_startup DateTime.now
60 @logfile.close
61 end
62end
63Test.new