File: MemoryTable.h

package info (click to toggle)
casacore 3.5.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 51,680 kB
  • sloc: cpp: 462,815; fortran: 16,372; ansic: 7,403; yacc: 4,626; lex: 2,340; sh: 1,786; python: 629; perl: 531; sed: 499; csh: 34; makefile: 31
file content (254 lines) | stat: -rw-r--r-- 8,680 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
//# MemoryTable.h: Class for a table held in memory
//# Copyright (C) 2003
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//#        Internet email: aips2-request@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA
//#
//# $Id$

#ifndef TABLES_MEMORYTABLE_H
#define TABLES_MEMORYTABLE_H


//# Includes
#include <casacore/casa/aips.h>
#include <casacore/tables/Tables/BaseTable.h>
#include <casacore/casa/BasicSL/String.h>
#include <casacore/casa/Arrays/Vector.h>

namespace casacore { //# NAMESPACE CASACORE - BEGIN

//# Forward Declarations
class SetupNewTable;
class ColumnSet;
class TableLockData;


// <summary>
// Class for a table held in memory
// </summary>

// <use visibility=local>

// <reviewed reviewer="UNKNOWN" date="before2004/08/25" tests="">
// </reviewed>

// <prerequisite>
//# Classes you should understand before using this one.
//   <li> BaseTable
// </prerequisite>

// <synopsis> 
// MemoryTable holds all its data in memory.
// It means that the data is not persistent. However, it can be copied to
// another table to make the data persistent.
// Furthermore it is a table as all other tables, so all table functions
// can be applied to it. Some functions (e.g. lock) won't do anything.
// Also all table operations like sorting, selecting, and iterating can
// be used.
//
// The constructor accepts a SetupNewTable object which can contain
// bindings of columns to any data manager. All bindings to storage
// managers will be replaced by a binding to the memory based storage
// manager <linkto class=MemoryStMan>MemoryStMan</linkto>. Also all
// unbound columns will be bound to MemoryStMan.
// Thus it is still possible that a column is bound to a virtual column
// engine like <linkto class=CompressComplex>CompressComplex</linkto>.
// </synopsis> 

//# <todo asof="$DATE:$">
//# </todo>


class MemoryTable : public BaseTable
{
public:

  // Create the table in memory using the definitions in the
  // SetupNewTable object.
  MemoryTable (SetupNewTable&, rownr_t nrrow, Bool initialize);

  // The destructor deletes all data.
  virtual ~MemoryTable();

  // Try to reopen the table (the underlying one) for read/write access.
  // It does nothing.
  virtual void reopenRW();

  // Is the table stored in big or little endian format?
  // It returns the endian format of the machine.
  virtual Bool asBigEndian() const;

  // Get the storage option used for the table.
  virtual const StorageOption& storageOption() const;

  // Is the table in use (i.e. open) in another process?
  // It always returns False.
  virtual Bool isMultiUsed (Bool checkSubTable) const;

  // Get the locking info.
  // It returns PermanentLocking.
  virtual const TableLock& lockOptions() const;

  // Merge the given lock info with the existing one.
  // It does nothing.
  virtual void mergeLock (const TableLock& lockOptions);

  // Has this process the read or write lock, thus can the table
  // be read or written safely?
  // It always returns True.
  virtual Bool hasLock (FileLocker::LockType) const;

  // Locking the table is a no-op.
  virtual Bool lock (FileLocker::LockType, uInt nattempts);

  // Unlocking the table is a no-op.
  virtual void unlock();

  // Flushing the table is a no-op.
  virtual void flush (Bool fsync, Bool recursive);

  // Resyncing the Table is a no-op.
  virtual void resync();

  // Get the modify counter. It always returns 0.
  virtual uInt getModifyCounter() const;

  // Test if the table is opened as writable. It always returns True.
  virtual Bool isWritable() const;

  // Copy the table and all its subtables.
  // It copies the contents of each row to get a real copy.
  // <group>
  virtual void copy (const String& newName, int tableOption) const;
  virtual void deepCopy (const String& newName,
			 const Record& dataManagerInfo,
                         const StorageOption&,
			 int tableOption, Bool, int endianFormat,
			 Bool noRows) const;
  // </group>

  // Rename the table. The tableOption is ignored.
  virtual void rename (const String& newName, int tableOption);

  // Get the table type (Table::Memory).
  virtual int tableType() const;

  // Get the actual table description.
  virtual TableDesc actualTableDesc() const;

  // Get the data manager info.
  virtual Record dataManagerInfo() const;

  // Get readonly access to the table keyword set.
  virtual TableRecord& keywordSet();

  // Get read/write access to the table keyword set.
  virtual TableRecord& rwKeywordSet();

  // Write the TableInfo object. It does not do anything.
  virtual void flushTableInfo();

  // Get a column object using its index.
  virtual BaseColumn* getColumn (uInt columnIndex) const;

  // Get a column object using its name.
  virtual BaseColumn* getColumn (const String& columnName) const;

  // Test if it is possible to add a row to this table (yes).
  virtual Bool canAddRow() const;

  // Add one or more rows and possibly initialize them.
  // This will fail for tables not supporting addition of rows.
  virtual void addRow (rownr_t nrrow = 1, Bool initialize = True);

  // Test if it is possible to remove a row from this table (yes).
  virtual Bool canRemoveRow() const;

  // Remove the given row.
  virtual void removeRow (rownr_t rownr);

  // Add a column to the table.
  // If the DataManager is not a virtual engine, MemoryStMan will be used.
  // The last Bool argument is not used in MemoryTable, but can be used in
  // other classes derived from BaseTable.
  // <group>
  virtual void addColumn (const ColumnDesc& columnDesc, Bool addToParent);
  virtual void addColumn (const ColumnDesc& columnDesc,
			  const String& dataManager, Bool byName,
                          Bool addToParent);
  virtual void addColumn (const ColumnDesc& columnDesc,
			  const DataManager& dataManager, Bool addToParent);
  virtual void addColumn (const TableDesc& tableDesc,
			  const DataManager& dataManager, Bool addToParent);
  // </group>

  // Test if columns can be removed (yes).
  virtual Bool canRemoveColumn (const Vector<String>& columnNames) const;

  // Remove columns.
  virtual void removeColumn (const Vector<String>& columnNames);

  // Test if a column can be renamed (yes).
  virtual Bool canRenameColumn (const String& columnName) const;

  // Rename a column.
  virtual void renameColumn (const String& newName, const String& oldName);

  // Rename a hypercolumn.
  virtual void renameHypercolumn (const String& newName,
				  const String& oldName);

  // Find the data manager with the given name or for the given column.
  // There is only one storage manager (MemoryStMan) with name MSM.
  virtual DataManager* findDataManager (const String& name,
                                        Bool byColumn) const;


private:
  CountedPtr<ColumnSet> colSetPtr_p;        //# pointer to set of columns
  TableLockData* lockPtr_p;          //# pointer to lock object

  // Copy constructor is forbidden, because copying a table requires
  // some more knowledge (like table name of result).
  // Declaring it private, makes it unusable.
  MemoryTable (const MemoryTable&);

  // Assignment is forbidden, because copying a table requires
  // some more knowledge (like table name of result).
  // Declaring it private, makes it unusable.
  MemoryTable& operator= (const MemoryTable&);

  // Setup the main parts of the object.
  // <br>Create the initial name map from the table description.
  // This map maps a name to the name in the original table.
  // A rename might change the map.
  // <br>Create the RefColumn objects.
  // <br>Create the initial TableInfo as a copy of the original BaseTable.
  void setup (BaseTable* btp);
};



} //# NAMESPACE CASACORE - END

#endif