86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# File 'lib/pgcrypto.rb', line 86
def select_pgcrypto_column(column_name)
return nil if new_record?
options = PGCrypto[self.class.table_name][column_name]
pgcrypto_column_finder = pgcrypto_columns
if key = PGCrypto.keys[:private]
pgcrypto_column_finder = pgcrypto_column_finder.select([
%w(id owner_id owner_type owner_table).map {|column| %("#{PGCrypto::Column.table_name}"."#{column}")},
%[pgp_pub_decrypt("#{PGCrypto::Column.table_name}"."value", pgcrypto_keys.#{key.name}#{key.password?}) AS "value"]
].flatten).joins(%[CROSS JOIN (SELECT #{key.dearmored} AS "#{key.name}") AS pgcrypto_keys])
end
pgcrypto_column_finder.where(:name => column_name).first
rescue ActiveRecord::StatementInvalid => e
case e.message
when /^PGError: ERROR: Wrong key or corrupt data/
logger.error(e.message.split("\n").first)
nil
else
raise e
end
end
|