ROOT logo
// @(#)root/mysql:$Id$
// Author: Dennis Box (dbox@fnal.gov)  3/12/2007

/*************************************************************************
 * Copyright (C) 1995-2007, 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_TPgSQLStatement
#define ROOT_TPgSQLStatement

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

#if !defined(__CINT__)

#ifdef R__WIN32
#include <winsock2.h>
#else
#include <sys/time.h>
#endif
#include <libpq-fe.h>
#include <pg_config.h> // to get PG_VERSION_NUM

#define pgsql_success(x) (((x) == PGRES_EMPTY_QUERY) \
                        || ((x) == PGRES_COMMAND_OK) \
                        || ((x) == PGRES_TUPLES_OK))

#else
struct PGconn;
struct PGresult;
#endif


struct PgSQL_Stmt_t {
   PGconn   *fConn;
   PGresult *fRes;
};


class TPgSQLStatement : public TSQLStatement {

private:
   PgSQL_Stmt_t         *fStmt;          //! executed statement
   Int_t                 fNumBuffers;    //! number of statement parameters
   char                **fBind;          //! array of data for input
   char                **fFieldName;     //! array of column names
   Int_t                 fWorkingMode;   //! 1 - setting parameters, 2 - retrieving results
   Int_t                 fIterationCount;//! number of iteration
   int                  *fParamLengths;  //! length of column
   int                  *fParamFormats;  //! data type (OID)
   Int_t                 fNumResultRows;
   Int_t                 fNumResultCols;

   Bool_t      IsSetParsMode() const { return fWorkingMode==1; }
   Bool_t      IsResultSetMode() const { return fWorkingMode==2; }

   Bool_t      SetSQLParamType(Int_t npar, int sqltype, bool sig, int sqlsize = 0);

   long double ConvertToNumeric(Int_t npar);
   const char *ConvertToString(Int_t npar);

   void        FreeBuffers();
   void        SetBuffersNumber(Int_t n);

   void        ConvertTimeToUTC(const TString &PQvalue, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec);

public:
   TPgSQLStatement(PgSQL_Stmt_t* stmt, Bool_t errout = kTRUE);
   virtual ~TPgSQLStatement();

   virtual void        Close(Option_t * = "");

   virtual Int_t       GetBufferLength() const { return 1; }
   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      SetLargeObject(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 npar);
   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      GetLargeObject(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(TPgSQLStatement, 0);  // SQL statement class for PgSQL DB
};

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