I am attempting to write a FrontBase activerecord adaptor. I''m down
to only two unit tests failing, and one of them is binary_test.rb.
I can''t figure out the logic of binary to string conversion.
Internally, I want the ''data'' attribute to be a String object
identical to the contents of
BINARY_FIXTURE_PATH = File.dirname(__FILE__) +
''/fixtures/flowers.jpg''
When it gets written to the database, it should be hex-encoded similar
to the following:
INSERT INTO binaries ("id", "data") VALUES(1,
X''D20A0E21390A684AC0A80116'')
only with the hex portion being much larger.
I''m having trouble implementing binary_to_string and string_to_binary.
If I implement both of them to simply return value, then the first two
asserts pass:
assert @data == bin.data, ''Newly assigned data differs from
original''
assert @data == bin.data, ''Data differs from original after
save''
but the generated SQL is invalid because it attempts to insert raw
binary into the database.
If I implement them as follows:
def self.hex_encode(value)
retvalue = ""
value.each_byte do |b|
retvalue << sprintf("%02X", b)
end
retvalue
end
def self.hex_decode(value)
retvalue = ""
value.scan(/../) do |h|
c = h.hex
retvalue << c.chr
end
retvalue
end
def self.string_to_binary(value)
value = self.hex_decode(value)
value
end
def self.binary_to_string(value)
value = self.hex_encode(value)
value
end
Then the first two tests still pass, but the third pass fails:
1) Failure:
test_load_save(BinaryTest) [binary_test.rb:36]:
Reloaded data differs from original.
<false> is not true.
It is failing because it is storing the raw X''<hex
digits>'' data
instead of converting it back into binary.
Lookint at the code, it appears that database results pass through the
type_cast method to convert into native objects. That code shows that
:binary column types pass through binary_to_string. However, if I
implement binary_to_string to decode data fetched from the database,
then set accessors fail because for some reason they *also* call
binary_to_string when setting the value of data. In one case, the
source data is hex-encoded and in one case it is not. No matter how I
implement the method, it is going to break in one of the use cases.
I can''t figure out where too hook in to convert the hex-encoded result
of the raw SQL select back into a raw data string without breaking the
first two asserts.
Can anyone point me to the correct path?
Thanks