Meskes-san
Thank you for your review.
> There is one thing that I don't understand right now. YOu
> change ecpg_store_input() to handle the bytea data type, yet you also
> change ECPGset_desc() to not use ecpg_store_input() in case of an
> bytea. This looks odd to me. Can you please explain that to me?
I try to explain as follows. I would like to receive your comment.
The current architecture of data copying of descriptor walks through the following path.
The important point is that it walks through two ecpg_store_input().
step 1. ECPGset_desc
Store to descriptor_item with ecpg_store_input().
step 2. ecpg_build_params(setup for tobeinserted)
Store to tobeinserted with ecpg_store_input().
step 3. ecpg_build_params(building stmt->param*)
Set tobeinserted to stmt->paramvalues.
On the other hand, the part of ecpg_build_params(building stmt->param*)
for bytea needs two information that are is_binary and binary_length.
But, data copying with ecpg_store_input() losts them.
There are two ideas to pass the information to part of ecpg_build_params(building stmt->param*).
But they are same in terms of copying data without ecpg_store_input() at least ones.
I selected Idea-1.
Idea-1.
step 1. ECPGset_desc
Set descriptor_item.is_binary.
Memcpy both bytea.length and bytea.array to descriptor_item.data.
step 2. ecpg_build_params(setup for tobeinserted)
Store bytea.array to tobeinserted with ecpg_store_input(bytea route).
Set is_binary(local) from descriptor_item.is_binary.
Set binary_length(local) from descriptor_item.data.
step 3. ecpg_build_params(building stmt->param*)
Set stmt->paramvalues from tobeinserted.
Set stmt->formats from is_binary(local).
Set stmt->lengths from binary_length(local).
Idea-2.
step 1. ECPGset_desc
Set descriptor_item.is_binary.
Set bytea.length to descriptor_item.data_len. (different!)
Set bytea.array to descriptor_item.data. (different!)
step 2. ecpg_build_params(setup for tobeinserted)
Memcpy bytea.array to tobeinserted by using alloc and memcpy whitout store_input. (different!)
Set is_binary(local) from descriptor_item.is_binary.
Set binary_length(local) from descriptor_item.data_len. (different!)
step 3. ecpg_build_params(building stmt->param*)
Set stmt->paramvalues with tobeinserted.
Set stmt->formats from is_binary(local).
Set stmt->lengths from binary_length(local).
Regards
Ryo Matsumura