Class: ActiveRecord::ConnectionAdapters::TwelveByteKey
- Inherits:
-
String
- Object
- String
- ActiveRecord::ConnectionAdapters::TwelveByteKey
- 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
- .key_ip_component ⇒ Object
- .key_pid_component ⇒ Object
- .key_sequence_component ⇒ Object
- .key_time_component ⇒ Object
Instance Method Summary collapse
-
#initialize(string = nil) ⇒ TwelveByteKey
constructor
A new instance of TwelveByteKey.
- #inspect ⇒ Object (also: #to_s)
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_component ⇒ Object
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_component ⇒ Object
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_component ⇒ Object
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_component ⇒ Object
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
#inspect ⇒ Object 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 |