File: calculations.rb

package info (click to toggle)
ruby-lockbox 2.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 224 kB
  • sloc: ruby: 1,447; makefile: 4
file content (42 lines) | stat: -rw-r--r-- 1,171 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
module Lockbox
  module Calculations
    def pluck(*column_names)
      return super unless model.respond_to?(:lockbox_attributes)

      lockbox_columns = column_names.map.with_index do |c, i|
        next unless c.respond_to?(:to_sym)
        [model.lockbox_attributes[c.to_sym], i]
      end.select do |la, _i|
        la && !la[:migrating]
      end

      return super unless lockbox_columns.any?

      # replace column with ciphertext column
      lockbox_columns.each do |la, i|
        column_names[i] = la[:encrypted_attribute]
      end

      # pluck
      result = super(*column_names)

      # decrypt result
      # handle pluck to single columns and multiple
      #
      # we can't pass context to decrypt method
      # so this won't work if any options are a symbol or proc
      if column_names.size == 1
        la = lockbox_columns.first.first
        result.map! { |v| model.send("decrypt_#{la[:encrypted_attribute]}", v) }
      else
        lockbox_columns.each do |la, i|
          result.each do |v|
            v[i] = model.send("decrypt_#{la[:encrypted_attribute]}", v[i])
          end
        end
      end

      result
    end
  end
end