|
|
| version 1.15, 2001/03/19 17:42:13 | version 1.37, 2001/11/22 15:47:12 |
|---|---|
| Line 2 | Line 2 |
| Parser: table class decl. | Parser: table class decl. |
| Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru) | |
| Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) | |
| $Id$ | $Id$ |
| */ | */ |
| Line 11 | Line 10 |
| #ifndef PA_TABLE_H | #ifndef PA_TABLE_H |
| #define PA_TABLE_H | #define PA_TABLE_H |
| #include "pa_config_includes.h" | |
| #include "pa_types.h" | #include "pa_types.h" |
| #include "pa_array.h" | #include "pa_array.h" |
| #include "pa_hash.h" | #include "pa_hash.h" |
| #include "pa_string.h" | #include "pa_string.h" |
| #include "pa_request.h" | |
| /// parser \b table class backend | /** |
| /** | VTable backend. |
| holds | |
| holds: | |
| - column names[if any] | - column names[if any] |
| - data rows | - data rows |
| - current row pointer | - current row pointer |
| uses String for column names and data items | uses String for column names and data items |
| hence most of tables are "named", no need to uptimize nameless onces | hence most of tables are "named", no need to uptimize nameless onces. |
| rows and strings stored are read-only. once stored they can be removed, | |
| but not altered. that's handy for quick copying & co. see table:join | |
| */ | */ |
| class Table : public Array { | class Table : public Array { |
| public: | public: |
| Table(Pool& apool, | Table(Pool& apool, |
| const String& asource, | const String *aorigin, |
| Array *acolumns, | const Array *acolumns, |
| int initial_rows=CR_INITIAL_ROWS_DEFAULT); | int initial_rows=CR_INITIAL_ROWS_DEFAULT); |
| /// the string source of table's data | /// where this table came from, may be NULL |
| //const String& source() { return fsource; } | const String *origin_string() { return forigin_string; } |
| /// column names | /// column names |
| const Array *columns() { return fcolumns; } | const Array *columns() { return fcolumns; } |
| /// moves \a current pointer | /// moves @a current pointer |
| void set_current(int acurrent) { fcurrent=acurrent; } | void set_current(int acurrent) { fcurrent=acurrent; } |
| /// \return current pointer | /// @return current pointer |
| int get_current() { return fcurrent; } | int current() { return fcurrent; } |
| void offset(bool absolute, int offset); | |
| /** @return column index from @a column_name. '<0' if no such column | |
| if no such colum conditionally 'bark' | |
| */ | |
| int column_name2index(const String& column, bool bark) const; | |
| /// @return item from @a column | |
| const String *item(int column) const; | |
| /// @return item from @a column. '0' if no such column | |
| const String *item(const String& column) const { | |
| int index=column_name2index(column, false); | |
| return index>=0?item(index):0; | |
| } | |
| /// \return item from \a column_name | /// saves to text file |
| const String *item(const String& column_name); | void save(bool nameless_save, const String& file_spec); |
| private: | bool locate(int column, const String& value); |
| bool locate(const String& column, const String& value); | |
| // the base origin of table's data | const Array& at(int index) const { |
| const String& fsource; | // force @c const result |
| return *const_cast<const Array *>(static_cast<Array *>(get(index))); | |
| } | |
| private: | |
| // where this table came from, may be NULL | |
| const String *forigin_string; | |
| // column name->number lookup table | // column name->number lookup table |
| Hash name2number; | Hash name2number; |
| Line 62 private: | Line 87 private: |
| int fcurrent; | int fcurrent; |
| // columns | // columns |
| Array *fcolumns; | const Array *fcolumns; |
| bool valid(int index) { return index>=0 && index<size(); } | bool valid(int index) const { return index>=0 && index<size(); } |
| const Array& at(int index); | |
| const String *item(int column_index) { | |
| return valid(fcurrent)?at(fcurrent).get_string(column_index):0; | |
| } | |
| }; | }; |
| #endif | #endif |