ROOT logo
// @(#)root/tree:$Id$
// Author: Fons Rademakers   30/11/99

/*************************************************************************
 * 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TTreeResult                                                          //
//                                                                      //
// Class defining interface to a TTree query result with the same       //
// interface as for SQL databases. A TTreeResult is returned by         //
// TTree::Query() (actually TTreePlayer::Query()).                      //
//                                                                      //
// Related classes are TTreeRow.                                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TTreeResult.h"
#include "TTreeRow.h"
#include "TString.h"
#include "TObjArray.h"


ClassImp(TTreeResult)

//______________________________________________________________________________
TTreeResult::TTreeResult()
{
   // Create a query result object.

   fColumnCount = 0;
   fRowCount    = 0;
   fFields      = 0;
   fResult      = 0;
   fNextRow     = 0;
}

//______________________________________________________________________________
TTreeResult::TTreeResult(Int_t nfields)
{
   // Create a query result object.

   fColumnCount = nfields;
   fRowCount    = 0;
   fFields      = new TString [nfields];
   fResult      = new TObjArray;
   fNextRow     = 0;
}

//______________________________________________________________________________
TTreeResult::~TTreeResult()
{
   // Cleanup result object.

   if (fResult)
      Close();

   delete [] fFields;
}

//______________________________________________________________________________
void TTreeResult::Close(Option_t *)
{
   // Close query result.

   if (!fResult)
      return;

   fResult->Delete();
   delete fResult;
   fResult   = 0;
   fRowCount = 0;
}

//______________________________________________________________________________
Bool_t TTreeResult::IsValid(Int_t field)
{
   // Check if result set is open and field index within range.

   if (!fResult) {
      Error("IsValid", "result set closed");
      return kFALSE;
   }
   if (field < 0 || field >= GetFieldCount()) {
      Error("IsValid", "field index out of bounds");
      return kFALSE;
   }
   return kTRUE;
}

//______________________________________________________________________________
Int_t TTreeResult::GetFieldCount()
{
   // Get number of fields in result.

   if (!fResult) {
      Error("GetFieldCount", "result set closed");
      return 0;
   }
   return fColumnCount;
}

//______________________________________________________________________________
const char *TTreeResult::GetFieldName(Int_t field)
{
   // Get name of specified field.

   if (!IsValid(field))
      return 0;

   return fFields[field].Data();
}

//______________________________________________________________________________
TSQLRow *TTreeResult::Next()
{
   // Get next query result row. The returned object must be
   // deleted by the user and becomes invalid when the result set is
   // closed or deleted.

   if (!fResult) {
      Error("Next", "result set closed");
      return 0;
   }

   if (fNextRow >= fRowCount)
      return 0;
   else {
      TTreeRow *row = new TTreeRow((TTreeRow*)fResult->At(fNextRow));
      fNextRow++;
      return row;
   }
}

//______________________________________________________________________________
void TTreeResult::AddField(Int_t field, const char *fieldname)
{
   // Add field name to result set. This is an internal method that is not
   // exported via the abstract interface and that should not be user called.

   if (!IsValid(field))
      return;

   fFields[field] = fieldname;
}

//______________________________________________________________________________
void TTreeResult::AddRow(TSQLRow *row)
{
   // Adopt a row to result set. This is an internal method that is not
   // exported via the abstract interface and that should not be user called.

   if (!fResult) {
      Error("AddRow", "result set closed");
      return;
   }

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