51 #define MAX(a,b) ( (a) > (b) ? (a) : (b) )
55 #define MIN(a,b) ( (a) < (b) ? (a) : (b) )
102 fmt =
"SET FMTONLY ON select * from %s SET FMTONLY OFF";
104 fmt =
"SET FMTONLY ON %s SET FMTONLY OFF";
227 char column_type[40];
238 if (clause->
cb < strlen(clause->
pb)
240 + strlen(column_type)
241 + ((
first) ? 2u : 4u)) {
242 char *temp =
tds_new(
char, 2 * clause->
cb);
248 strcpy(temp, clause->
pb);
277 int i, firstcol, erc;
281 char clause_buffer[4096] = { 0 };
283 colclause.
pb = clause_buffer;
284 colclause.
cb =
sizeof(clause_buffer);
353 "tds_bcp_send_bcp_record(%p, %p, %p, %p, %d)\n",
354 tds, bcpinfo, get_col_data, null_error,
offset);
379 if (start_col == 0) {
385 unsigned char *save_data;
401 rc = get_col_data(bcpinfo, bindcol,
offset);
421 }
else if (has_text) {
426 memset(&blob, 0,
sizeof(blob));
447 if (start_col == 0) {
450 int var_cols_written = 0;
454 memset(record,
'\0', old_record_size);
469 row_sz_pos = row_pos;
482 if (var_cols_written) {
484 record[0] = var_cols_written;
523 rc = get_col_data(bcpinfo, bindcol,
offset);
575 int offset,
unsigned char * rowbuffer,
int start)
582 int bitleft = 0, bitpos;
587 tdsdump_log(
TDS_DBG_FUNC,
"tds_bcp_add_fixed_columns(%p, %p, ignored, %d, %p, %d)\n", bcpinfo, get_col_data,
offset, rowbuffer, start);
606 null_error(bcpinfo,
i,
offset);
613 memcpy(&rowbuffer[row_pos], num->
array, cpbytes);
619 rowbuffer[bitpos] = 0;
622 rowbuffer[bitpos] |= 256 >> bitleft;
634 rowbuffer[row_pos + j] =
' ';
660 unsigned int i, row_pos;
661 unsigned int ncols = 0;
683 offsets[0] = row_pos;
688 unsigned int cpbytes = 0;
708 null_error(bcpinfo,
i,
offset);
720 memcpy(&rowbuffer[row_pos], num->
array, cpbytes);
725 rowbuffer[row_pos] =
' ';
736 offsets[++ncols] = row_pos;
760 while (ncols && offsets[ncols] == offsets[ncols-1])
765 unsigned int pfx_top = offsets[ncols] / 256;
769 if (offsets[ncols] / 256 == offsets[ncols-1] / 256) {
774 unsigned int n_pfx = 1;
776 for (
i = 0;
i <= ncols ; ++
i)
777 if ((offsets[
i] / 256u) < pfx_top)
785 for (
i=0;
i <= ncols;
i++)
786 *poff++ = offsets[ncols-
i] & 0xFF;
787 row_pos = (
unsigned int)(poff - rowbuffer);
795 return ncols == 0? start : row_pos;
976 int fixed_col_len_tot = 0;
977 int variable_col_len_tot = 0;
978 int column_bcp_data_size = 0;
979 int bcp_record_size = 0;
1013 column_bcp_data_size = 16;
1026 variable_col_len_tot += column_bcp_data_size;
1029 fixed_col_len_tot += column_bcp_data_size;
1035 bcp_record_size = 4 +
1037 variable_col_len_tot +
1038 ( (
int)(variable_col_len_tot / 256 ) + 1 ) +
1076 #if defined(_WIN32) && defined(HAVE__LOCK_FILE) && defined(HAVE__UNLOCK_FILE)
1077 #define TDS_HAVE_STDIO_LOCKED 1
1078 #define flockfile(s) _lock_file(s)
1079 #define funlockfile(s) _unlock_file(s)
1080 #define getc_unlocked(s) _getc_nolock(s)
1081 #define feof_unlocked(s) _feof_nolock(s)
1084 #ifndef TDS_HAVE_STDIO_LOCKED
1085 #undef getc_unlocked
1086 #undef feof_unlocked
1089 #define getc_unlocked(s) getc(s)
1090 #define feof_unlocked(s) feof(s)
1091 #define flockfile(s) do { } while(0)
1092 #define funlockfile(s) do { } while(0)
1107 char *p = (
char *) ptr;
1111 return p - (
char *) ptr;
1113 c = getc_unlocked(s->
f);
1123 return p - (
char *) ptr;
1143 r.term_len = term_len;
1150 memcpy(
r.left + term_len*2u,
terminator, term_len);
1151 r.terminator =
r.left + term_len*2u;
1154 readed = fread(
r.left, 1, term_len, stream);
1155 if (readed != term_len) {
1157 if (readed == 0 && feof(stream))
1170 if (char_conv ==
NULL)
1174 funlockfile(stream);
1209 "writetext bulk %s 0x%s timestamp = 0x%s%s",
1210 objname, textptr, timestamp, with_log ?
" with log" :
"");
1271 return (bcpinfo && colinfo &&
1291 int colnum, res_colnum;
1300 for (colnum = 0; ; ++colnum) {
1323 #if ENABLE_EXTRA_CHECKS
1329 assert(colnum < bindinfo->num_cols);
1332 bindcol = bindinfo->
columns[colnum];
1337 #if ENABLE_EXTRA_CHECKS
1344 if (byte_val == 1) {
1356 #if ENABLE_EXTRA_CHECKS
1362 for (colnum = 0; colnum < bindinfo->
num_cols;
1364 bindcol = bindinfo->
columns[colnum];
1369 curcol = resinfo->
columns[res_colnum];
1373 src = (
unsigned char*)
static int tds_bcp_add_variable_columns(TDSBCPINFO *bcpinfo, tds_bcp_get_col_data get_col_data, tds_bcp_null_error null_error, int offset, TDS_UCHAR *rowbuffer, int start, int *pncols)
Add variable size columns to the row.
static int tds_bcp_add_fixed_columns(TDSBCPINFO *bcpinfo, tds_bcp_get_col_data get_col_data, tds_bcp_null_error null_error, int offset, unsigned char *rowbuffer, int start)
Add fixed size columns to the row.
static int tds_file_stream_read(TDSINSTREAM *stream, void *ptr, size_t len)
Reads a chunk of data from file stream checking for terminator.
static TDSRET tds7_build_bulk_insert_stmt(TDSSOCKET *tds, TDSPBCB *clause, TDSCOLUMN *bcpcol, int first)
Help to build query to be sent to server.
static TDSRET tds7_bcp_send_colmetadata(TDSSOCKET *tds, TDSBCPINFO *bcpinfo)
Send BCP metadata to server.
TDSRET tds_bcp_start_copy_in(TDSSOCKET *tds, TDSBCPINFO *bcpinfo)
Start bulk copy to server \tds.
TDSRET tds_writetext_start(TDSSOCKET *tds, const char *objname, const char *textptr, const char *timestamp, int with_log, TDS_UINT size)
Start writing writetext request.
static void tds_bcp_row_free(TDSRESULTINFO *result, unsigned char *row)
Free row data allocated in the result set.
TDSRET tds_bcp_start(TDSSOCKET *tds, TDSBCPINFO *bcpinfo)
Start sending BCP data to server.
TDSRET tds_bcp_fread(TDSSOCKET *tds, TDSICONV *char_conv, FILE *stream, const char *terminator, size_t term_len, char **outbuf, size_t *outbytes)
Read a data file, passing the data through iconv().
static int tds_bcp_is_bound(TDSBCPINFO *bcpinfo, TDSCOLUMN *colinfo)
static TDSRET tds_bcp_start_insert_stmt(TDSSOCKET *tds, TDSBCPINFO *bcpinfo)
Prepare the query to be sent to server to request BCP information \tds.
TDSRET tds_writetext_continue(TDSSOCKET *tds, const TDS_UCHAR *text, TDS_UINT size)
Send some data in the writetext request started by tds_writetext_start.
static int tds_bcp_read_column_defaults(TDSSOCKET *tds, TDSBCPINFO *bcpinfo)
TDSRET tds_writetext_end(TDSSOCKET *tds)
Finish sending writetext data.
struct tds_file_stream TDSFILESTREAM
input stream to read a file
TDSRET tds_bcp_init(TDSSOCKET *tds, TDSBCPINFO *bcpinfo)
Initialize BCP information.
TDSRET tds_bcp_send_record(TDSSOCKET *tds, TDSBCPINFO *bcpinfo, tds_bcp_get_col_data get_col_data, tds_bcp_null_error null_error, int offset)
Send one row of data to server \tds.
TDSRET tds_bcp_done(TDSSOCKET *tds, int *rows_copied)
Tell we finished sending BCP data to server \tds.
struct tds_pbcb TDSPBCB
Holds clause buffer.
#define TDS_PUT_UA2(ptr, val)
static void cleanup(void)
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
static const char * tds_dstr_cstr(DSTR *s)
Returns a C version (NUL terminated string) of dstr.
DSTR * tds_dstr_dup(DSTR *s, const DSTR *src) TDS_WUR
Duplicate a string from another dynamic string.
static size_t tds_dstr_len(DSTR *s)
Returns the length of the string in bytes.
unsigned int
A callback function used to compare two keys in a database.
static void text(MDB_val *v)
const struct ncbi::grid::netcache::search::fields::SIZE size
#define MIN(a, b)
returns smaller of a and b.
#define MAX(a, b)
returns larger of a and b.
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
#define TDS7_RESULT_TOKEN
#define tds_alloc_results
#define tds_convert_stream
#define tds_free_bcp_column_data
#define tds_dynamic_stream_init
#define tds_process_simple_query
#define tds_get_column_declaration
#define tds_numeric_bytes_per_prec
#define tds_alloc_bcp_column_data
#define tds_submit_queryf
#define tds_process_tokens
TDS_INT identity_insert_on
Information about blobs (e.g.
tds_func_put_data * put_data
Send column data to server.
tds_func_put_info * put_info
Send metadata column information to server.
Metadata about columns in regular and compute rows.
TDS_TINYINT column_varint_size
size of length when reading from wire (0, 1, 2 or 4)
TDS_SMALLINT * column_nullbind
TDS_INT column_size
maximun size of data.
BCPCOLDATA * bcp_column_data
unsigned int column_hasdefault
unsigned int column_timestamp
TDS_UCHAR column_collation[5]
const TDSCOLUMNFUNCS * funcs
unsigned char * column_data
TDS_TINYINT column_prec
precision for decimal/numeric
TDS_SERVER_TYPE column_type
This type can be different from wire type because conversion (e.g.
unsigned int column_identity
unsigned int column_nullable
TDSICONV * char_conv
refers to previously allocated iconv information
TDS_TINYINT column_scale
scale for decimal/numeric
TDS_CHAR * column_varaddr
struct tds_column::@124 on_server
unsigned char * column_default
TDS_INT column_cur_size
size written in variable (ie: char, text, binary).
output stream to write data to a dynamic buffer
size_t size
size of data inside buffer
input stream to read a file
char * left
buffer for store bytes readed that could be the terminator
FILE * f
file to read from
const char * terminator
terminator
size_t term_len
terminator length in bytes
TDSINSTREAM stream
common fields, must be the first field
char * buffer
write buffer.
int(* write)(struct tds_output_stream *stream, size_t len)
write len bytes from buffer, return <0 if error or len
unsigned int from_malloc
true is buffer came from malloc
unsigned int cb
buffer length
Hold information for any results.
unsigned char * current_row
void(* row_free)(struct tds_result_info *result, unsigned char *row)
Information for a server connection.
TDSRESULTINFO * current_results
Current query information.
TDS_INT8 rows_affected
rows updated/deleted/inserted/selected, TDS_NO_COUNT if not valid
TDS_TINYINT bulk_query
true is query sent was a bulk query so we need to switch state to QUERYING
unsigned char out_flag
output buffer type
Main include file for libtds.
#define is_numeric_type(x)
tds_sysdep_int32_type TDS_INT
#define TDS_NO_MORE_RESULTS
void(* tds_bcp_null_error)(TDSBCPINFO *bulk, int index, int offset)
unsigned char TDS_TINYINT
@ TDS_PENDING
cilent is waiting for data
@ TDS_SENDING
client would send data
@ TDS_WRITING
client is writing data
TDSRET(* tds_bcp_get_col_data)(TDSBCPINFO *bulk, TDSCOLUMN *bcpcol, int offset)
#define tds_new0(type, n)
#define is_nullable_type(x)
@ TDS_DONE_ERROR
error occurred
tds_sysdep_uint16_type TDS_USMALLINT
#define TDS_RESIZE(p, n_elem)
tds_sysdep_uint32_type TDS_UINT
#define TDS_PUT_SMALLINT(tds, v)
uchar outbuf[(1000000+1000000)]