LCOV - code coverage report
Current view: top level - include - ctlib.h (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 1 1 100.0 %
Date: 2025-01-18 11:50:39 Functions: 0 0 -

          Line data    Source code
       1             : /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
       2             :  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004  Brian Bruns
       3             :  *
       4             :  * This library is free software; you can redistribute it and/or
       5             :  * modify it under the terms of the GNU Library General Public
       6             :  * License as published by the Free Software Foundation; either
       7             :  * version 2 of the License, or (at your option) any later version.
       8             :  *
       9             :  * This library is distributed in the hope that it will be useful,
      10             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12             :  * Library General Public License for more details.
      13             :  *
      14             :  * You should have received a copy of the GNU Library General Public
      15             :  * License along with this library; if not, write to the
      16             :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      17             :  * Boston, MA 02111-1307, USA.
      18             :  */
      19             : 
      20             : #ifndef _tdsguard_gH4tOYBTzynx4DgqFzOEbB_
      21             : #define _tdsguard_gH4tOYBTzynx4DgqFzOEbB_
      22             : 
      23             : #include <freetds/tds.h>
      24             : #include <freetds/convert.h>
      25             : #include <freetds/utils/string.h>
      26             : #include <freetds/bool.h>
      27             : 
      28             : /*
      29             :  * Internal (not part of the exposed API) prototypes and such.
      30             :  */
      31             : 
      32             : #include <freetds/pushvis.h>
      33             : 
      34             : #ifdef __cplusplus
      35             : extern "C"
      36             : {
      37             : #if 0
      38             : }
      39             : #endif
      40             : #endif
      41             : 
      42             : /* Fix a problem with Windows headers */
      43             : #undef small
      44             : 
      45             : /*
      46             :  * internal types
      47             :  */
      48             : struct _cs_config
      49             : {
      50             :         bool cs_expose_formats;
      51             :         bool cs_note_empty_data;
      52             : };
      53             : 
      54             : /* Code changed for error handling */
      55             : /* Code changes starts here - CT_DIAG - 01 */
      56             : 
      57             : /* This structure is used in CT_DIAG */
      58             : 
      59             : struct cs_diag_msg_client
      60             : {
      61             :         struct cs_diag_msg_client *next;
      62             :         CS_CLIENTMSG clientmsg;
      63             : };
      64             : 
      65             : typedef struct {
      66             :         CS_MSGNUM msgnumber;
      67             :         CS_INT state;
      68             :         CS_INT severity;
      69             :         CS_CHAR text[CS_MAX_MSG];
      70             :         CS_INT textlen;
      71             :         CS_CHAR svrname[132];
      72             :         CS_INT svrnlen;
      73             :         CS_CHAR proc[132];
      74             :         CS_INT proclen;
      75             :         CS_INT line;
      76             :         CS_INT status;
      77             :         CS_BYTE sqlstate[CS_SQLSTATE_SIZE];
      78             :         CS_INT sqlstatelen;
      79             : } CS_SERVERMSG_SMALL;
      80             : 
      81             : typedef struct {
      82             :         CS_MSGNUM msgnumber;
      83             :         CS_INT state;
      84             :         CS_INT severity;
      85             :         CS_CHAR text[CS_MAX_MSG];
      86             :         CS_INT textlen;
      87             :         CS_CHAR svrname[256];
      88             :         CS_INT svrnlen;
      89             :         CS_CHAR proc[256];
      90             :         CS_INT proclen;
      91             :         CS_INT line;
      92             :         CS_INT status;
      93             :         CS_BYTE sqlstate[CS_SQLSTATE_SIZE];
      94             :         CS_INT sqlstatelen;
      95             : } CS_SERVERMSG_LARGE;
      96             : 
      97             : typedef struct {
      98             :         CS_MSGNUM msgnumber;
      99             :         CS_INT state;
     100             :         CS_INT severity;
     101             :         CS_CHAR text[CS_MAX_MSG];
     102             :         CS_INT textlen;
     103             : } CS_SERVERMSG_COMMON1;
     104             : 
     105             : typedef struct {
     106             :         CS_INT line;
     107             :         CS_INT status;
     108             :         CS_BYTE sqlstate[CS_SQLSTATE_SIZE];
     109             :         CS_INT sqlstatelen;
     110             : } CS_SERVERMSG_COMMON2;
     111             : 
     112             : typedef union
     113             : {
     114             :         CS_SERVERMSG_SMALL small;
     115             :         CS_SERVERMSG_LARGE large;
     116             :         CS_SERVERMSG_COMMON1 common;
     117             :         CS_SERVERMSG user;
     118             : } CS_SERVERMSG_INTERNAL;
     119             : 
     120             : struct cs_diag_msg_svr
     121             : {
     122             :         struct cs_diag_msg_svr *next;
     123             :         CS_SERVERMSG_INTERNAL servermsg;
     124             : };
     125             : 
     126             : /* Code changes ends here - CT_DIAG - 01 */
     127             : 
     128             : struct cs_diag_msg
     129             : {
     130             :         CS_CLIENTMSG *msg;
     131             :         struct cs_diag_msg *next;
     132             : };
     133             : 
     134             : struct _cs_context
     135             : {
     136             :         CS_INT date_convert_fmt;
     137             :         CS_INT cs_errhandletype;
     138             :         CS_INT cs_diag_msglimit;
     139             : 
     140             :         /* added for storing the maximum messages limit CT_DIAG */
     141             :         /* code changes starts here - CT_DIAG - 02 */
     142             : 
     143             :         CS_INT cs_diag_msglimit_client;
     144             :         CS_INT cs_diag_msglimit_server;
     145             :         CS_INT cs_diag_msglimit_total;
     146             :         struct cs_diag_msg_client *clientstore;
     147             :         struct cs_diag_msg_svr *svrstore;
     148             : 
     149             :         /* code changes ends here - CT_DIAG - 02 */
     150             : 
     151             :         struct cs_diag_msg *msgstore;
     152             :         CS_CSLIBMSG_FUNC cslibmsg_cb;
     153             :         CS_CLIENTMSG_FUNC clientmsg_cb;
     154             :         CS_SERVERMSG_FUNC servermsg_cb;
     155             :         CS_INTERRUPT_FUNC interrupt_cb;
     156             :         /* code changes start here - CS_CONFIG - 01*/
     157             :         void *userdata;
     158             :         int userdata_len;
     159             :         /* code changes end here - CS_CONFIG - 01*/
     160             :         TDSCONTEXT *tds_ctx;
     161             :         CS_CONFIG config;
     162             :         int login_timeout;  /**< not used unless positive */
     163             :         int query_timeout;  /**< not used unless positive */
     164             : 
     165             :         /** structures uses large identifiers */
     166             :         bool use_large_identifiers;
     167             : };
     168             : 
     169             : static inline size_t cs_servermsg_len(CS_CONTEXT *ctx)
     170             : {
     171          48 :         if (ctx->use_large_identifiers)
     172             :                 return sizeof(CS_SERVERMSG_LARGE);
     173             :         return sizeof(CS_SERVERMSG_SMALL);
     174             : }
     175             : 
     176             : /*
     177             :  * internal typedefs
     178             :  */
     179             : typedef struct _ct_colinfo
     180             : {
     181             :         TDS_SMALLINT *indicator;
     182             : }
     183             : CT_COLINFO;
     184             : 
     185             : typedef struct _cs_dynamic CS_DYNAMIC;
     186             : 
     187             : struct _cs_connection
     188             : {
     189             :         CS_CONTEXT *ctx;
     190             :         TDSLOGIN *tds_login;
     191             :         TDSSOCKET *tds_socket;
     192             :         CS_CLIENTMSG_FUNC clientmsg_cb;
     193             :         CS_SERVERMSG_FUNC servermsg_cb;
     194             :         CS_INTERRUPT_FUNC interrupt_cb;
     195             :         void *userdata;
     196             :         int userdata_len;
     197             :         CS_LOCALE *locale;
     198             :         CS_COMMAND *cmds;
     199             :         CS_DYNAMIC *dynlist;
     200             :         char *server_addr;
     201             :         bool network_auth;
     202             : };
     203             : 
     204             : /*
     205             :  * Formerly CSREMOTE_PROC_PARAM, this structure can be used in other
     206             :  * places, too.
     207             :  */
     208             : 
     209             : typedef struct _cs_param
     210             : {
     211             :         struct _cs_param *next;
     212             :         char *name;
     213             :         int status;
     214             :         int datatype;
     215             :         CS_INT maxlen;
     216             :         CS_INT scale;
     217             :         CS_INT precision;
     218             :         CS_INT *datalen;
     219             :         CS_SMALLINT *ind;
     220             :         CS_BYTE *value;
     221             :         int param_by_value;
     222             :         CS_INT datalen_value;
     223             :         CS_SMALLINT indicator_value;
     224             : } CS_PARAM;
     225             : 
     226             : /*
     227             :  * Code added for RPC functionality - SUHA
     228             :  * RPC Code changes starts here
     229             :  */
     230             : 
     231             : typedef CS_PARAM CSREMOTE_PROC_PARAM;
     232             : 
     233             : typedef struct _csremote_proc
     234             : {
     235             :         char *name;
     236             :         CS_SMALLINT options;
     237             :         CSREMOTE_PROC_PARAM *param_list;
     238             : } CSREMOTE_PROC;
     239             : 
     240             : /*
     241             :  * Structure CS_COMMAND changed for RPC functionality -SUHA
     242             :  * Added CSREMOTE_PROC *rpc to CS_COMMAND structure
     243             :  */
     244             : 
     245             : typedef CS_PARAM CS_DYNAMIC_PARAM;
     246             : 
     247             : struct _cs_dynamic
     248             : {
     249             :         struct _cs_dynamic *next;
     250             :         char *id;
     251             :         char *stmt;
     252             :         CS_DYNAMIC_PARAM *param_list;
     253             :         TDSDYNAMIC *tdsdyn;
     254             : }; 
     255             : 
     256             : /* specific FreeTDS commands */
     257             : #define CS_DYNAMIC_CMD   160
     258             : #define CS_CUR_CMD       161
     259             : 
     260             : /* values for cs_command.results_state */
     261             : 
     262             : #define _CS_RES_NONE            -1
     263             : #define _CS_RES_INIT            0
     264             : #define _CS_RES_RESULTSET_EMPTY 1
     265             : #define _CS_RES_RESULTSET_ROWS  2
     266             : #define _CS_RES_STATUS          3
     267             : #define _CS_RES_CMD_DONE        4
     268             : #define _CS_RES_CMD_SUCCEED     5
     269             : #define _CS_RES_END_RESULTS     6
     270             : #define _CS_RES_DESCRIBE_RESULT 7
     271             : 
     272             : /* values for cs_command.command_state */
     273             : 
     274             : #define _CS_COMMAND_IDLE        0
     275             : #define _CS_COMMAND_BUILDING    1
     276             : #define _CS_COMMAND_READY       2
     277             : #define _CS_COMMAND_SENT        3
     278             : 
     279             : /* values for cs_command.cancel_state */
     280             : #define _CS_CANCEL_NOCANCEL     0
     281             : #define _CS_CANCEL_PENDING      1
     282             : 
     283             : struct _cs_command
     284             : {
     285             :         struct _cs_command *next;
     286             :         CS_INT command_state;
     287             :         CS_INT results_state;
     288             :         CS_INT cancel_state;
     289             :         CS_INT cursor_state;
     290             :         CS_CONNECTION *con;
     291             :         CS_INT command_type;
     292             :         CS_CHAR *query;
     293             :         short dynamic_cmd;
     294             :         CS_DYNAMIC *dyn;
     295             :         int row_prefetched;
     296             :         int curr_result_type;
     297             :         int bind_count;
     298             :         int get_data_item;
     299             :         int get_data_bytes_returned;
     300             :         CS_IODESC *iodesc;
     301             :         CS_INT send_data_started;
     302             :         CSREMOTE_PROC *rpc;
     303             :         CS_PARAM *input_params;
     304             :         CS_INT client_cursor_id;
     305             :         TDSCURSOR *cursor;
     306             :         void *userdata;
     307             :         int userdata_len;
     308             : };
     309             : 
     310             : struct _cs_blkdesc
     311             : {
     312             :         TDSBCPINFO bcpinfo;
     313             : };
     314             : 
     315             : 
     316             : #define _CS_ERRHAND_INLINE 1
     317             : #define _CS_ERRHAND_CB     2
     318             : 
     319             : struct _cs_locale
     320             : {
     321             :         char *language;
     322             :         char *charset;
     323             :         char *time;
     324             :         char *collate;
     325             : };
     326             : 
     327             : /* internal defines for cursor processing */
     328             : 
     329             : #define _CS_CURS_TYPE_UNACTIONED 0
     330             : #define _CS_CURS_TYPE_REQUESTED  1
     331             : #define _CS_CURS_TYPE_SENT       2
     332             : 
     333             : typedef struct {
     334             :         CS_CHAR name[132];
     335             :         CS_INT namelen;
     336             :         CS_INT datatype;
     337             :         CS_INT format;
     338             :         CS_INT maxlength;
     339             :         CS_INT scale;
     340             :         CS_INT precision;
     341             :         CS_INT status;
     342             :         CS_INT count;
     343             :         CS_INT usertype;
     344             :         CS_LOCALE *locale;
     345             : } CS_DATAFMT_SMALL;
     346             : 
     347             : typedef struct {
     348             :         CS_CHAR name[256];
     349             :         CS_INT namelen;
     350             :         CS_INT datatype;
     351             :         CS_INT format;
     352             :         CS_INT maxlength;
     353             :         CS_INT scale;
     354             :         CS_INT precision;
     355             :         CS_INT status;
     356             :         CS_INT count;
     357             :         CS_INT usertype;
     358             :         CS_LOCALE *locale;
     359             : } CS_DATAFMT_LARGE;
     360             : 
     361             : typedef struct {
     362             :         CS_INT datatype;
     363             :         CS_INT format;
     364             :         CS_INT maxlength;
     365             :         CS_INT scale;
     366             :         CS_INT precision;
     367             :         CS_INT status;
     368             :         CS_INT count;
     369             :         CS_INT usertype;
     370             :         CS_LOCALE *locale;
     371             : } CS_DATAFMT_COMMON;
     372             : 
     373             : typedef union
     374             : {
     375             :         CS_DATAFMT_SMALL small;
     376             :         CS_DATAFMT_LARGE large;
     377             :         CS_DATAFMT user;
     378             : } CS_DATAFMT_INTERNAL;
     379             : 
     380             : /*
     381             :  * internal prototypes
     382             :  */
     383             : TDSRET _ct_handle_server_message(const TDSCONTEXT * ctxptr, TDSSOCKET * tdsptr, TDSMESSAGE * msgptr);
     384             : int _ct_handle_client_message(const TDSCONTEXT * ctxptr, TDSSOCKET * tdsptr, TDSMESSAGE * msgptr);
     385             : int _ct_handle_interrupt(void * ptr);
     386             : TDS_SERVER_TYPE _ct_get_server_type(TDSSOCKET *tds, int datatype);
     387             : int _ct_bind_data(CS_CONTEXT *ctx, TDSRESULTINFO * resinfo, TDSRESULTINFO *bindinfo, CS_INT offset);
     388             : int _ct_get_client_type(const TDSCOLUMN *col, bool describe);
     389             : void _ctclient_msg(CS_CONTEXT *ctx, CS_CONNECTION * con, const char *funcname,
     390             :                    int layer, int origin, int severity, int number,
     391             :                    const char *fmt, ...);
     392             : CS_INT _ct_diag_clearmsg(CS_CONTEXT * context, CS_INT type);
     393             : void _cs_locale_free(CS_LOCALE *locale);
     394             : CS_LOCALE *_cs_locale_copy(CS_LOCALE *orig);
     395             : int _cs_locale_copy_inplace(CS_LOCALE *new_locale, CS_LOCALE *orig);
     396             : CS_INT _ct_get_string_length(const char *buf, CS_INT buflen);
     397             : 
     398             : int _cs_convert_not_client(CS_CONTEXT *ctx, const TDSCOLUMN *curcol, CONV_RESULT *convert_buffer, unsigned char **p_src);
     399             : 
     400             : CS_RETCODE _cs_convert(CS_CONTEXT * ctx, const CS_DATAFMT_COMMON * srcfmt, CS_VOID * srcdata,
     401             :         const CS_DATAFMT_COMMON * destfmt, CS_VOID * destdata, CS_INT * resultlen);
     402             : bool _ct_is_large_identifiers_version(CS_INT version);
     403             : const CS_DATAFMT_COMMON * _ct_datafmt_common(CS_CONTEXT * ctx, const CS_DATAFMT * datafmt);
     404             : const CS_DATAFMT_LARGE *_ct_datafmt_conv_in(CS_CONTEXT * ctx, const CS_DATAFMT * datafmt, CS_DATAFMT_LARGE * fmtbuf);
     405             : CS_DATAFMT_LARGE *_ct_datafmt_conv_prepare(CS_CONTEXT * ctx, CS_DATAFMT * datafmt, CS_DATAFMT_LARGE * fmtbuf);
     406             : void _ct_datafmt_conv_back(CS_DATAFMT * datafmt, CS_DATAFMT_LARGE * fmtbuf);
     407             : 
     408             : CS_RETCODE _ct_props_dstr(CS_CONNECTION * con, DSTR *s, CS_INT action, CS_VOID * buffer, CS_INT buflen, CS_INT * outlen);
     409             : 
     410             : #ifdef __cplusplus
     411             : #if 0
     412             : {
     413             : #endif
     414             : }
     415             : #endif
     416             : 
     417             : #include <freetds/popvis.h>
     418             : 
     419             : #endif

Generated by: LCOV version 1.13