mysqlaudit 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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