// @(#)root/tree:$Id$
// Author: Philippe Canal and al. 08/2004

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TBasketSQL                                                           //
//                                                                      //
// Implement TBasket for a SQL backend                                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef TBASKETSQL_CXX
#define TBASKETSQL_CXX

#include "TBasket.h"
#include "TTree.h"
#include "TBranch.h"
#include "TFile.h"
#include "TMath.h"
#include "TBasketSQL.h"
#include <Riostream.h>
#include <vector>
#include "TTreeSQL.h"
#include "TBufferSQL.h"

ClassImp(TBasketSQL)

namespace std {} using namespace std;

//_________________________________________________________________________
TBasketSQL::TBasketSQL() : TBasket(), fResultPtr(0), fRowPtr(0), fInsertQuery(0)
{
   // Default constructor.

}

//_________________________________________________________________________
TBasketSQL::TBasketSQL(const char *name, const char *title, TBranch *branch,
                         TSQLResult ** rs, TString *insert_query,
                         std::vector<Int_t> *vc, TSQLRow **r) :
  fResultPtr(rs),fRowPtr(r)
{
   // Regular constructor.

   SetName(name);
   SetTitle(title);
   fClassName   = "TBasketSQL";
   fBufferSize  = branch->GetBasketSize();
   fNevBufSize  = branch->GetEntryOffsetLen();
   fNevBuf      = 0;
   fEntryOffset = 0;  //Must be set to 0 before calling Sizeof
   fDisplacement= 0;  //Must be set to 0 before calling Sizeof
   fBuffer      = 0;  //Must be set to 0 before calling Sizeof
   fInsertQuery = insert_query;

   if (vc==0) {
      fBufferRef = 0;
   } else {
      fBufferRef = new TBufferSQL(TBuffer::kWrite, fBufferSize, vc, fInsertQuery, fRowPtr);
   }
   fHeaderOnly  = kTRUE;
   fLast        = 0; // Must initialize before calling Streamer()
   //Streamer(*fBufferRef);
   fBuffer      = 0;
   fBranch      = branch;
   fHeaderOnly  = kFALSE;
   branch->GetTree()->IncrementTotalBuffers(fBufferSize);

}

//_________________________________________________________________________
TBasketSQL::~TBasketSQL()
{
   // Destructor
}

//_________________________________________________________________________
void TBasketSQL::CreateBuffer(const char *name, TString title,
                              std::vector<Int_t> *vc,
                              TBranch *branch, TSQLResult ** rs)
{
   // Create a TSQLBuffer for this basket.

   fResultPtr = rs;
   SetName(name);
   SetTitle(title);
   fClassName   = "TBasketSQL";
   fBufferSize  = branch->GetBasketSize();
   fNevBufSize  = branch->GetEntryOffsetLen();
   fNevBuf      = 0;
   fEntryOffset = 0;  //Must be set to 0 before calling Sizeof
   fDisplacement= 0;  //Must be set to 0 before calling Sizeof
   fBuffer      = 0;  //Must be set to 0 before calling Sizeof

   if(vc==0) {
      fBufferRef = 0;
      Error("CreateBuffer","Need a vector of columns\n");
   } else {
      fBufferRef   = new TBufferSQL(TBuffer::kWrite, fBufferSize, vc, fInsertQuery, fRowPtr);
   }
   fHeaderOnly  = kTRUE;
   fLast        = 0;
   //Streamer(*fBufferRef);
   fBuffer      = 0;
   fBranch      = branch;
   fHeaderOnly  = kFALSE;
   branch->GetTree()->IncrementTotalBuffers(fBufferSize);
}

//_________________________________________________________________________
void TBasketSQL::PrepareBasket(Long64_t entry)
{
   // Prepare the basket for the next entry.

   ((TBufferSQL*)fBufferRef)->ResetOffset();
   ((TTreeSQL*)fBranch->GetTree())->PrepEntry(entry);
   fBufferRef->Reset();
}

//_________________________________________________________________________
Int_t TBasketSQL::ReadBasketBytes(Long64_t , TFile *)
{
   // See TBasket::ReadBasketBytes.  This is not implemented in TBasketSQL.

   Error("ReadBasketBytes","This member function should not be called!");
   return 0;
}

//_________________________________________________________________________
Int_t TBasketSQL::ReadBasketBuffers(Long64_t , Int_t, TFile *)
{
   // See TBasket::ReadBasketBuffers.  This is not implemented in TBasketSQL.

   Error("ReadBasketBuffers","This member function should not be called!");
   return 0;
}

//_________________________________________________________________________
void TBasketSQL::Reset()
{
   // See TBasket::Reset

   TBasket::Reset();
}


//_________________________________________________________________________
void TBasketSQL::Update(Int_t, Int_t)
{
   // See TBasket::Update.

   ((TBufferSQL*)fBufferRef)->ResetOffset();
   fNevBuf++;
}


#endif
 TBasketSQL.cxx:1
 TBasketSQL.cxx:2
 TBasketSQL.cxx:3
 TBasketSQL.cxx:4
 TBasketSQL.cxx:5
 TBasketSQL.cxx:6
 TBasketSQL.cxx:7
 TBasketSQL.cxx:8
 TBasketSQL.cxx:9
 TBasketSQL.cxx:10
 TBasketSQL.cxx:11
 TBasketSQL.cxx:12
 TBasketSQL.cxx:13
 TBasketSQL.cxx:14
 TBasketSQL.cxx:15
 TBasketSQL.cxx:16
 TBasketSQL.cxx:17
 TBasketSQL.cxx:18
 TBasketSQL.cxx:19
 TBasketSQL.cxx:20
 TBasketSQL.cxx:21
 TBasketSQL.cxx:22
 TBasketSQL.cxx:23
 TBasketSQL.cxx:24
 TBasketSQL.cxx:25
 TBasketSQL.cxx:26
 TBasketSQL.cxx:27
 TBasketSQL.cxx:28
 TBasketSQL.cxx:29
 TBasketSQL.cxx:30
 TBasketSQL.cxx:31
 TBasketSQL.cxx:32
 TBasketSQL.cxx:33
 TBasketSQL.cxx:34
 TBasketSQL.cxx:35
 TBasketSQL.cxx:36
 TBasketSQL.cxx:37
 TBasketSQL.cxx:38
 TBasketSQL.cxx:39
 TBasketSQL.cxx:40
 TBasketSQL.cxx:41
 TBasketSQL.cxx:42
 TBasketSQL.cxx:43
 TBasketSQL.cxx:44
 TBasketSQL.cxx:45
 TBasketSQL.cxx:46
 TBasketSQL.cxx:47
 TBasketSQL.cxx:48
 TBasketSQL.cxx:49
 TBasketSQL.cxx:50
 TBasketSQL.cxx:51
 TBasketSQL.cxx:52
 TBasketSQL.cxx:53
 TBasketSQL.cxx:54
 TBasketSQL.cxx:55
 TBasketSQL.cxx:56
 TBasketSQL.cxx:57
 TBasketSQL.cxx:58
 TBasketSQL.cxx:59
 TBasketSQL.cxx:60
 TBasketSQL.cxx:61
 TBasketSQL.cxx:62
 TBasketSQL.cxx:63
 TBasketSQL.cxx:64
 TBasketSQL.cxx:65
 TBasketSQL.cxx:66
 TBasketSQL.cxx:67
 TBasketSQL.cxx:68
 TBasketSQL.cxx:69
 TBasketSQL.cxx:70
 TBasketSQL.cxx:71
 TBasketSQL.cxx:72
 TBasketSQL.cxx:73
 TBasketSQL.cxx:74
 TBasketSQL.cxx:75
 TBasketSQL.cxx:76
 TBasketSQL.cxx:77
 TBasketSQL.cxx:78
 TBasketSQL.cxx:79
 TBasketSQL.cxx:80
 TBasketSQL.cxx:81
 TBasketSQL.cxx:82
 TBasketSQL.cxx:83
 TBasketSQL.cxx:84
 TBasketSQL.cxx:85
 TBasketSQL.cxx:86
 TBasketSQL.cxx:87
 TBasketSQL.cxx:88
 TBasketSQL.cxx:89
 TBasketSQL.cxx:90
 TBasketSQL.cxx:91
 TBasketSQL.cxx:92
 TBasketSQL.cxx:93
 TBasketSQL.cxx:94
 TBasketSQL.cxx:95
 TBasketSQL.cxx:96
 TBasketSQL.cxx:97
 TBasketSQL.cxx:98
 TBasketSQL.cxx:99
 TBasketSQL.cxx:100
 TBasketSQL.cxx:101
 TBasketSQL.cxx:102
 TBasketSQL.cxx:103
 TBasketSQL.cxx:104
 TBasketSQL.cxx:105
 TBasketSQL.cxx:106
 TBasketSQL.cxx:107
 TBasketSQL.cxx:108
 TBasketSQL.cxx:109
 TBasketSQL.cxx:110
 TBasketSQL.cxx:111
 TBasketSQL.cxx:112
 TBasketSQL.cxx:113
 TBasketSQL.cxx:114
 TBasketSQL.cxx:115
 TBasketSQL.cxx:116
 TBasketSQL.cxx:117
 TBasketSQL.cxx:118
 TBasketSQL.cxx:119
 TBasketSQL.cxx:120
 TBasketSQL.cxx:121
 TBasketSQL.cxx:122
 TBasketSQL.cxx:123
 TBasketSQL.cxx:124
 TBasketSQL.cxx:125
 TBasketSQL.cxx:126
 TBasketSQL.cxx:127
 TBasketSQL.cxx:128
 TBasketSQL.cxx:129
 TBasketSQL.cxx:130
 TBasketSQL.cxx:131
 TBasketSQL.cxx:132
 TBasketSQL.cxx:133
 TBasketSQL.cxx:134
 TBasketSQL.cxx:135
 TBasketSQL.cxx:136
 TBasketSQL.cxx:137
 TBasketSQL.cxx:138
 TBasketSQL.cxx:139
 TBasketSQL.cxx:140
 TBasketSQL.cxx:141
 TBasketSQL.cxx:142
 TBasketSQL.cxx:143
 TBasketSQL.cxx:144
 TBasketSQL.cxx:145
 TBasketSQL.cxx:146
 TBasketSQL.cxx:147
 TBasketSQL.cxx:148
 TBasketSQL.cxx:149
 TBasketSQL.cxx:150
 TBasketSQL.cxx:151
 TBasketSQL.cxx:152
 TBasketSQL.cxx:153
 TBasketSQL.cxx:154
 TBasketSQL.cxx:155
 TBasketSQL.cxx:156
 TBasketSQL.cxx:157
 TBasketSQL.cxx:158
 TBasketSQL.cxx:159
 TBasketSQL.cxx:160
 TBasketSQL.cxx:161
 TBasketSQL.cxx:162
 TBasketSQL.cxx:163
 TBasketSQL.cxx:164
 TBasketSQL.cxx:165