39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Database
 | 
						|
    # PostgreSQL defines its own class with slightly different
 | 
						|
    # behaviour from the default Binary type.
 | 
						|
    BINARY_TYPE = ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Bytea
 | 
						|
 | 
						|
    # Class for casting binary data to hexadecimal SHA1 hashes (and vice-versa).
 | 
						|
    #
 | 
						|
    # Using ShaAttribute allows you to store SHA1 values as binary while still
 | 
						|
    # using them as if they were stored as string values. This gives you the
 | 
						|
    # ease of use of string values, but without the storage overhead.
 | 
						|
    class ShaAttribute < BINARY_TYPE
 | 
						|
      PACK_FORMAT = 'H*'
 | 
						|
 | 
						|
      # Casts binary data to a SHA1 in hexadecimal.
 | 
						|
      def deserialize(value)
 | 
						|
        value = super(value)
 | 
						|
        value ? value.unpack1(PACK_FORMAT) : nil
 | 
						|
      end
 | 
						|
 | 
						|
      # Casts a SHA1 in hexadecimal to the proper binary format.
 | 
						|
      def serialize(value)
 | 
						|
        arg = value ? [value].pack(PACK_FORMAT) : nil
 | 
						|
 | 
						|
        BINARY_TYPE.new.serialize(arg)
 | 
						|
      end
 | 
						|
 | 
						|
      # Casts a SHA1 in hexadecimal to the proper binary format.
 | 
						|
      def self.serialize(value)
 | 
						|
        arg = value ? [value].pack(PACK_FORMAT) : nil
 | 
						|
 | 
						|
        BINARY_TYPE.new.serialize(arg)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |