Class: ActiveRecord::ConnectionAdapters::TwelveByteKey

Inherits:
String
  • Object
show all
Defined in:
lib/active_record/connection_adapters/frontbase_adapter.rb

Overview

From EOF Documentation.… buffer should have space for EOUniqueBinaryKeyLength (12) bytes. Assigns a world-wide unique ID made up of: < Sequence [2], ProcessID [2] , Time [4], IP Addr [4] >

Constant Summary collapse

@@mutex =

:nodoc:

Mutex.new
@@sequence_number =
rand(65536)
@@key_cached_pid_component =
nil
@@key_cached_ip_component =
nil

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(string = nil) ⇒ TwelveByteKey

Returns a new instance of TwelveByteKey.



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/active_record/connection_adapters/frontbase_adapter.rb', line 60

def initialize(string = nil)
  # Generate a unique key
  if string.nil?
    new_key = replace('_' * 12)

    new_key[0..1]  = self.class.key_sequence_component        
    new_key[2..3]  = self.class.key_pid_component
    new_key[4..7]  = self.class.key_time_component
    new_key[8..11] = self.class.key_ip_component
    new_key
  else
    if string.size == 24
      string.gsub!(/[[:xdigit:]]{2}/) { |x| x.hex.chr }
    end
    raise "string is not 12 bytes long" unless string.size == 12
    super(string)
  end
end

Class Method Details

.key_ip_componentObject



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/active_record/connection_adapters/frontbase_adapter.rb', line 124

def key_ip_component
  if @@key_cached_ip_component.nil?
    @@mutex.synchronize do
      old_lookup_flag  = BasicSocket.do_not_reverse_lookup
      BasicSocket.do_not_reverse_lookup = true
      udpsocket = UDPSocket.new
      udpsocket.connect("17.112.152.32",1)
      ip_string = udpsocket.addr[3]
      BasicSocket.do_not_reverse_lookup = old_lookup_flag
      packed = Socket.pack_sockaddr_in(0,ip_string)
      addr_subset = packed[4..7]
      ip = addr_subset[0] << 24 | addr_subset[1] << 16 | addr_subset[2] << 8 | addr_subset[3]
      ip_component = "____"
      ip_component[0] = (ip & 0xFF000000) >> 24
      ip_component[1] = (ip & 0x00FF0000) >> 16
      ip_component[2] = (ip & 0x0000FF00) >> 8
      ip_component[3] = (ip & 0x000000FF)
      @@key_cached_ip_component = ip_component
    end
  end
  @@key_cached_ip_component
end

.key_pid_componentObject



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/active_record/connection_adapters/frontbase_adapter.rb', line 101

def key_pid_component
  if @@key_cached_pid_component.nil?
    @@mutex.synchronize do
      pid = $$
      pid_component = "__"
      pid_component[0] = pid >> 8
      pid_component[1] = pid
      @@key_cached_pid_component = pid_component
    end
  end
  @@key_cached_pid_component
end

.key_sequence_componentObject



88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/active_record/connection_adapters/frontbase_adapter.rb', line 88

def key_sequence_component
  seq = nil
  @@mutex.synchronize do
    seq = @@sequence_number
    @@sequence_number = (@@sequence_number + 1) % 65536
  end
  
  sequence_component = "__"
  sequence_component[0] = seq >> 8
  sequence_component[1] = seq
  sequence_component
end

.key_time_componentObject



114
115
116
117
118
119
120
121
122
# File 'lib/active_record/connection_adapters/frontbase_adapter.rb', line 114

def key_time_component
  time = Time.new.to_i
  time_component = "____"
  time_component[0] = (time & 0xFF000000) >> 24
  time_component[1] = (time & 0x00FF0000) >> 16
  time_component[2] = (time & 0x0000FF00) >> 8
  time_component[3] = (time & 0x000000FF)
  time_component
end

Instance Method Details

#inspectObject Also known as: to_s



79
80
81
# File 'lib/active_record/connection_adapters/frontbase_adapter.rb', line 79

def inspect
  unpack("H*").first.upcase
end