mysqlaudit 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/bin/mysqlaudit CHANGED
@@ -53,25 +53,27 @@ end
53
53
 
54
54
  command :rollback do |c|
55
55
  c.description = 'Rollback transaction cath in audit table'
56
- c.syntax = 'audits rollback --host 127.0.0.1 --user root [--pass admin] --schema sakila --table foo --statement insert'
56
+ c.syntax = 'audits rollback --host 127.0.0.1 --user root [--pass admin] --schema sakila --table foo [--statement all]'
57
57
  c.option '--host STRING', String, 'Host'
58
58
  c.option '--user STRING', String, 'User'
59
59
  c.option '--pass STRING', String, 'Password'
60
60
  c.option '--schema STRING', String, 'Schema name'
61
61
  c.option '--table STRING', String, 'Table name'
62
- c.option '--statement STRING', String, 'Statement operation: insert, update, delete'
62
+ c.option '--statement STRING', String, 'Statement operation: all, insert, update, delete'
63
63
  c.action do |args, options|
64
- if !options.statement.nil?
65
- if [:insert, :update, :delete].include? options.statement.to_sym
66
- Mysqlaudit::Actions.new({host: options.host,
67
- user: options.user,
68
- password: options.pass,
69
- schema: options.schema,
70
- table: options.table,
71
- statement: options.statement.to_sym}).rollback
72
- else
73
- puts "Invalid values on argument: --statement."
74
- end
64
+ if options.statement.nil?
65
+ options.statement = :all
66
+ end
67
+
68
+ if [:all, :insert, :update, :delete].include? options.statement.to_sym
69
+ Mysqlaudit::Actions.new({host: options.host,
70
+ user: options.user,
71
+ password: options.pass,
72
+ schema: options.schema,
73
+ table: options.table,
74
+ statement: options.statement.to_sym}).rollback
75
+ else
76
+ puts "Invalid values on argument: --statement."
75
77
  end
76
78
  end
77
79
  end
@@ -77,7 +77,7 @@ SQL
77
77
  end
78
78
 
79
79
  def get_columns(table)
80
- sql = "SELECT column_name AS name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='#{$schema}' AND TABLE_NAME='#{table}' AND column_key <> 'PRI';"
80
+ sql = "SELECT column_name AS name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='#{$schema}' AND TABLE_NAME='#{table}' AND column_key <> 'PRI';"
81
81
  sql_result = @mysql.query(sql)
82
82
  sql_result.map { |table| table['name']}
83
83
  end
@@ -124,40 +124,57 @@ SQL
124
124
  end
125
125
 
126
126
  def has_trigger(table, actionName)
127
- sql = "SELECT true AS has FROM information_schema.triggers WHERE trigger_schema = '#{$schema}' AND trigger_name = 'audit_#{table}_#{actionName}';"
127
+ sql = "SELECT true AS has FROM information_schema.triggers WHERE trigger_schema = '#{$schema}' AND trigger_name = 'audit_#{table}_#{actionName}';"
128
128
  @mysql.query(sql).count == 1
129
129
  end
130
130
 
131
- def rollback(table, statement)
131
+ def insert(table)
132
+ sql = "SELECT CONCAT('/* ', trigger_at, ' */ DELETE FROM #{table} WHERE id = ', MAX(primary_key),';') AS `row` "
133
+ sql << "FROM audits "
134
+ sql << "WHERE `type` = 'I' AND `table` = '#{table}' GROUP BY primary_key "
135
+ sql << "ORDER BY trigger_at, primary_key, `column` ASC;"
136
+ end
137
+
138
+ def update(table)
139
+ sql = "SELECT CONCAT('/* ', trigger_at, ' */ UPDATE users SET ', `column`, ' = ', QUOTE(old), ' WHERE id = ', primary_key, ';') AS `row`"
140
+ sql << "FROM audits WHERE `type` = 'U' AND `table` = '#{table}' ORDER BY trigger_at, primary_key, `column` ASC;"
141
+ end
142
+
143
+ def delete(table)
132
144
  columns = get_columns(table)
133
145
  key = get_primary_key(table)
134
146
 
147
+ sql = "SELECT CONCAT('/* ', trigger_at, ' */ INSERT INTO #{table} (#{key}, #{columns.join(', ')}) VALUES (', primary_key, ', ', "
148
+ columns.each do | column |
149
+ sql << " QUOTE(MAX(IF(`column` = '#{column}', `old`, NULL))), ', ', "
150
+ end
151
+ sql = sql.chomp(" ', ', ")
152
+ sql << "');'"
153
+ sql << ") AS `row` FROM audits WHERE `type` = 'D' AND `table` = '#{table}' GROUP BY primary_key ORDER BY trigger_at, primary_key, `column` ASC;"
154
+ end
155
+
156
+ def rollback(table, statement)
157
+ sqls = []
158
+
135
159
  case statement
160
+ when :all
161
+ sqls << insert(table)
162
+ sqls << update(table)
163
+ sqls << delete(table)
136
164
  when :insert
137
- sql = <<SQL
138
- SELECT CONCAT('/* ', trigger_at, ' */ DELETE FROM #{table} WHERE id = ', MAX(primary_key),';') AS `row`
139
- FROM audits
140
- WHERE `type` = 'I'
141
- AND `table` = '#{table}'
142
- GROUP BY primary_key
143
- ORDER BY trigger_at, primary_key, `column` ASC;
144
- SQL
145
- when :delete
146
- sql = "SELECT CONCAT('/* ', trigger_at, ' */ INSERT INTO #{table} (#{key}, #{columns.join(', ')}) VALUES (', primary_key, ', ', "
147
- columns.each do | column |
148
- sql << " QUOTE(MAX(IF(`column` = '#{column}', `old`, NULL))), ', ', "
149
- end
150
- sql = sql.chomp(" ', ', ")
151
- sql << "');'"
152
- sql << ") AS `row` FROM audits WHERE `type` = 'D' AND `table` = '#{table}' GROUP BY primary_key ORDER BY trigger_at, primary_key, `column` ASC;"
165
+ sqls << insert(table)
153
166
  when :update
154
- sql = "SELECT CONCAT('/* ', trigger_at, ' */ UPDATE users SET ', `column`, ' = ', QUOTE(old), ' WHERE id = ', primary_key, ';') AS `row`"
155
- sql << "FROM audits WHERE `type` = 'U' AND `table` = '#{table}' ORDER BY trigger_at, primary_key, `column` ASC;"
167
+ sqls << update(table)
168
+ when :delete
169
+ sqls << delete(table)
156
170
  end
157
171
 
158
- sql_result = @mysql.query(sql)
159
- sql_result.each(:as => :array) do |row|
160
- puts row
161
- end end
172
+ sqls.each do | sql |
173
+ sql_result = @mysql.query(sql)
174
+ sql_result.each(:as => :array) do |row|
175
+ puts row
176
+ end
177
+ end
178
+ end
162
179
  end
163
180
  end
@@ -1,3 +1,3 @@
1
1
  module Mysqlaudit
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysqlaudit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-19 00:00:00.000000000 Z
12
+ date: 2013-07-24 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: MySQL tool for audit all tables with triggers.
15
15
  email: nicola51980@gmail.com