[freetds] bulk copy and row buffer
Thompbil18 at aol.com
Thompbil18 at aol.com
Mon Jun 7 16:09:26 EDT 2004
> I found a bcp_column_data field in TDSCOLUMN...
Yes - I'll explain why I put it there.
> - dblib bulk code use BCP_COLINFO to hold bulk information
> - ctlib bulk code use TDSCOLUMN to hold bulk information
> - ctlib use bcp_column_data to store data buffer instead of current_row
dblib won't be using BCP_COLINFO for much longer - it's gone with my next
ctlib uses both the bcp_column_data structure in TDSCOLUMN and current_row in
the blk-library processing. here's what it does, and why....
A program sends data to the server using bulk library by binding host program
variables, along with a couple of indicators (data length and null), to a
database table column. The host program variables and indicators are then
populated, and the row_xfer function is called to send the data.
*we* then have to do the following (not necessarily in this order):
Interpret the data and indicators to work out whether the column data is NULL
convert the data from one format to another (e.g. host variable of char type
to database datetime column)
build a bcp "row" to send to the server (SQL server format of "bcp" row is
easy - Sybase is horrendous).
I've decided to do this in two stages.
The first stage does everything it can to prepare each column of data. the
results of this stage are stored in the bcp_column_data structure. I needed to
store this information on a column-by-column basis, and I wanted to cut down on
memory (re)allocation, so I needed it to persist somewhere. TDSCOLUMN seemed
the obvious choice, as that is where I store my bind information too.
The second stage is to build and send the bcp "row" data. One of the
requirements of my rewrite was to build the whole row of data before sending anything
down the wire. I needed to store this somewhere, and again I wanted to cut
down on memory (re)allocation, so I decided to reuse the current_row buffer that
had already been allocated in the results structure. What I put in the
current_row isn't (necessarily) in the same format as results data - I'm just using
I'll think about your other ideas....
More information about the FreeTDS