ROOT logo
// @(#)root/odbc:$Id$
// Author: Sergey Linev   6/02/2006

/*************************************************************************
 * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TODBCStatement
#define ROOT_TODBCStatement

#ifndef ROOT_TSQLStatement
#include "TSQLStatement.h"
#endif


#ifdef __CINT__
typedef void *   SQLHSTMT;
typedef UShort_t SQLUSMALLINT;
typedef UInt_t   SQLUINTEGER;
typedef Short_t  SQLSMALLINT;
typedef Short_t  SQLRETURN;
#else
#ifdef WIN32
#include "windows.h"
#endif
#include <sql.h>
#endif

class TODBCStatement : public TSQLStatement {

protected:
    #ifdef __CINT__
    struct ODBCBufferRec_t;
    #else
    struct ODBCBufferRec_t {
       Int_t       fBroottype;
       Int_t       fBsqltype;
       Int_t       fBsqlctype;
       void       *fBbuffer;
       Int_t       fBelementsize;
       SQLLEN     *fBlenarray;
       char       *fBstrbuffer;
       char       *fBnamebuffer;
    };
    #endif

protected:
   SQLHSTMT         fHstmt;
   Int_t            fBufferPreferredSize;
   ODBCBufferRec_t *fBuffer;
   Int_t            fNumBuffers;
   Int_t            fBufferLength;     // number of entries for each parameter/column
   Int_t            fBufferCounter;    // used to indicate position in buffers
   SQLUSMALLINT    *fStatusBuffer;
   Int_t            fWorkingMode;      // 1 - setting parameters, 2 - reading results, 0 - unknown
   SQLUINTEGER      fNumParsProcessed; // contains number of parameters, affected by last operation
   SQLUINTEGER      fNumRowsFetched;   // indicates number of fetched rows
   ULong64_t        fLastResultRow;    // stores values of row number after last fetch operation

   void       *GetParAddr(Int_t npar, Int_t roottype = 0, Int_t length = 0);
   long double ConvertToNumeric(Int_t npar);
   const char *ConvertToString(Int_t npar);

   Bool_t      BindColumn(Int_t ncol, SQLSMALLINT sqltype, SQLUINTEGER size);
   Bool_t      BindParam(Int_t n, Int_t type, Int_t size = 1024);

   Bool_t      ExtractErrors(SQLRETURN retcode, const char* method);

   void        SetNumBuffers(Int_t isize, Int_t ilen);
   void        FreeBuffers();

   Bool_t      IsParSettMode() const { return fWorkingMode==1; }
   Bool_t      IsResultSet() const { return fWorkingMode==2; }

public:
   TODBCStatement(SQLHSTMT stmt, Int_t rowarrsize, Bool_t errout = kTRUE);
   virtual ~TODBCStatement();

   virtual void        Close(Option_t * = "");

   virtual Int_t       GetBufferLength() const { return fBufferLength; }
   virtual Int_t       GetNumParameters();

   virtual Bool_t      SetNull(Int_t npar);
   virtual Bool_t      SetInt(Int_t npar, Int_t value);
   virtual Bool_t      SetUInt(Int_t npar, UInt_t value);
   virtual Bool_t      SetLong(Int_t npar, Long_t value);
   virtual Bool_t      SetLong64(Int_t npar, Long64_t value);
   virtual Bool_t      SetULong64(Int_t npar, ULong64_t value);
   virtual Bool_t      SetDouble(Int_t npar, Double_t value);
   virtual Bool_t      SetString(Int_t npar, const char* value, Int_t maxsize = 256);
   virtual Bool_t      SetBinary(Int_t npar, void* mem, Long_t size, Long_t maxsize = 0x1000);
   virtual Bool_t      SetDate(Int_t npar, Int_t year, Int_t month, Int_t day);
   virtual Bool_t      SetTime(Int_t npar, Int_t hour, Int_t min, Int_t sec);
   virtual Bool_t      SetDatime(Int_t npar, Int_t year, Int_t month, Int_t day, Int_t hour, Int_t min, Int_t sec);
   virtual Bool_t      SetTimestamp(Int_t npar, Int_t year, Int_t month, Int_t day, Int_t hour, Int_t min, Int_t sec, Int_t frac = 0);

   virtual Bool_t      NextIteration();

   virtual Bool_t      Process();
   virtual Int_t       GetNumAffectedRows();

   virtual Bool_t      StoreResult();
   virtual Int_t       GetNumFields();
   virtual const char *GetFieldName(Int_t nfield);
   virtual Bool_t      NextResultRow();

   virtual Bool_t      IsNull(Int_t);
   virtual Int_t       GetInt(Int_t npar);
   virtual UInt_t      GetUInt(Int_t npar);
   virtual Long_t      GetLong(Int_t npar);
   virtual Long64_t    GetLong64(Int_t npar);
   virtual ULong64_t   GetULong64(Int_t npar);
   virtual Double_t    GetDouble(Int_t npar);
   virtual const char *GetString(Int_t npar);
   virtual Bool_t      GetBinary(Int_t npar, void* &mem, Long_t& size);
   virtual Bool_t      GetDate(Int_t npar, Int_t& year, Int_t& month, Int_t& day);
   virtual Bool_t      GetTime(Int_t npar, Int_t& hour, Int_t& min, Int_t& sec);
   virtual Bool_t      GetDatime(Int_t npar, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec);
   virtual Bool_t      GetTimestamp(Int_t npar, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec, Int_t&);

   ClassDef(TODBCStatement, 0); //ODBC implementation of TSQLStatement
};

#endif
 TODBCStatement.h:1
 TODBCStatement.h:2
 TODBCStatement.h:3
 TODBCStatement.h:4
 TODBCStatement.h:5
 TODBCStatement.h:6
 TODBCStatement.h:7
 TODBCStatement.h:8
 TODBCStatement.h:9
 TODBCStatement.h:10
 TODBCStatement.h:11
 TODBCStatement.h:12
 TODBCStatement.h:13
 TODBCStatement.h:14
 TODBCStatement.h:15
 TODBCStatement.h:16
 TODBCStatement.h:17
 TODBCStatement.h:18
 TODBCStatement.h:19
 TODBCStatement.h:20
 TODBCStatement.h:21
 TODBCStatement.h:22
 TODBCStatement.h:23
 TODBCStatement.h:24
 TODBCStatement.h:25
 TODBCStatement.h:26
 TODBCStatement.h:27
 TODBCStatement.h:28
 TODBCStatement.h:29
 TODBCStatement.h:30
 TODBCStatement.h:31
 TODBCStatement.h:32
 TODBCStatement.h:33
 TODBCStatement.h:34
 TODBCStatement.h:35
 TODBCStatement.h:36
 TODBCStatement.h:37
 TODBCStatement.h:38
 TODBCStatement.h:39
 TODBCStatement.h:40
 TODBCStatement.h:41
 TODBCStatement.h:42
 TODBCStatement.h:43
 TODBCStatement.h:44
 TODBCStatement.h:45
 TODBCStatement.h:46
 TODBCStatement.h:47
 TODBCStatement.h:48
 TODBCStatement.h:49
 TODBCStatement.h:50
 TODBCStatement.h:51
 TODBCStatement.h:52
 TODBCStatement.h:53
 TODBCStatement.h:54
 TODBCStatement.h:55
 TODBCStatement.h:56
 TODBCStatement.h:57
 TODBCStatement.h:58
 TODBCStatement.h:59
 TODBCStatement.h:60
 TODBCStatement.h:61
 TODBCStatement.h:62
 TODBCStatement.h:63
 TODBCStatement.h:64
 TODBCStatement.h:65
 TODBCStatement.h:66
 TODBCStatement.h:67
 TODBCStatement.h:68
 TODBCStatement.h:69
 TODBCStatement.h:70
 TODBCStatement.h:71
 TODBCStatement.h:72
 TODBCStatement.h:73
 TODBCStatement.h:74
 TODBCStatement.h:75
 TODBCStatement.h:76
 TODBCStatement.h:77
 TODBCStatement.h:78
 TODBCStatement.h:79
 TODBCStatement.h:80
 TODBCStatement.h:81
 TODBCStatement.h:82
 TODBCStatement.h:83
 TODBCStatement.h:84
 TODBCStatement.h:85
 TODBCStatement.h:86
 TODBCStatement.h:87
 TODBCStatement.h:88
 TODBCStatement.h:89
 TODBCStatement.h:90
 TODBCStatement.h:91
 TODBCStatement.h:92
 TODBCStatement.h:93
 TODBCStatement.h:94
 TODBCStatement.h:95
 TODBCStatement.h:96
 TODBCStatement.h:97
 TODBCStatement.h:98
 TODBCStatement.h:99
 TODBCStatement.h:100
 TODBCStatement.h:101
 TODBCStatement.h:102
 TODBCStatement.h:103
 TODBCStatement.h:104
 TODBCStatement.h:105
 TODBCStatement.h:106
 TODBCStatement.h:107
 TODBCStatement.h:108
 TODBCStatement.h:109
 TODBCStatement.h:110
 TODBCStatement.h:111
 TODBCStatement.h:112
 TODBCStatement.h:113
 TODBCStatement.h:114
 TODBCStatement.h:115
 TODBCStatement.h:116
 TODBCStatement.h:117
 TODBCStatement.h:118
 TODBCStatement.h:119
 TODBCStatement.h:120
 TODBCStatement.h:121
 TODBCStatement.h:122
 TODBCStatement.h:123
 TODBCStatement.h:124
 TODBCStatement.h:125
 TODBCStatement.h:126
 TODBCStatement.h:127
 TODBCStatement.h:128
 TODBCStatement.h:129