Annotation of parser3/src/types/pa_vtable.C, revision 1.21.2.5.2.6
1.1 parser 1: /** @file
2: Parser: @b table class.
3:
1.21.2.1 paf 4: Copyright(c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.11 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.14 paf 6: */
1.1 parser 7:
1.21.2.5.2.6! paf 8: static const char* IDENT_VTABLE_C="$Date: 2003/03/24 11:45:28 $";
1.1 parser 9:
10: #include "pa_vtable.h"
11: #include "pa_vstring.h"
1.5 parser 12: #include "pa_vhash.h"
1.21.2.2 paf 13: #include "pa_vvoid.h"
1.1 parser 14:
1.3 parser 15: #ifndef DOXYGEN
1.1 parser 16: struct Record_info {
1.21.2.2 paf 17: Table* table;
18: HashStringValue* hash;
1.1 parser 19: };
1.3 parser 20: #endif
1.21.2.5.2.6! paf 21: static void store_column_item_to_hash(const String* column_name,
! 22: Record_info *info) {
1.21.2.5.2.3 paf 23: Value* value;
1.21.2.5.2.6! paf 24: if(const String* column_item=info->table->item(*column_name))
! 25: value=new VString(*column_item);
1.1 parser 26: else
1.21.2.5.2.6! paf 27: value=new VVoid;
! 28: info->hash->put(*column_name, value);
1.1 parser 29: }
1.21.2.5.2.3 paf 30: Value* VTable::fields_element() {
1.21.2.5.2.5 paf 31: Table& ltable=table();
1.21.2.2 paf 32: if(Table::columns_type columns=ltable.columns()) {
1.21.2.5.2.6! paf 33: Value& result=*new VHash;
! 34: Record_info record_info={<able, result.get_hash()};
1.1 parser 35: columns->for_each(store_column_item_to_hash, &record_info);
1.21.2.5.2.6! paf 36: return &result;
1.1 parser 37: }
1.21.2.5.2.3 paf 38: return 0;
1.1 parser 39: }
40:
41:
1.21.2.5.2.3 paf 42: Value* VTable::get_element(const String& aname, Value& aself, bool looking_up) {
1.1 parser 43: // fields
1.21.2.5.2.3 paf 44: if(aname==TABLE_FIELDS_ELEMENT_NAME)
1.1 parser 45: return fields_element();
46:
1.2 parser 47: // methods
1.21.2.5.2.3 paf 48: if(Value* result=VStateless_object::get_element(aname, aself, looking_up))
1.2 parser 49: return result;
50:
1.1 parser 51: // columns
52: if(ftable) {
1.16 paf 53: int index=ftable->column_name2index(aname, false);
54: if(index>=0) // column aname|number valid
1.21.2.5.2.6! paf 55: if(const String* string=ftable->item(index)) // there is such column
! 56: return new VString(*string);
1.1 parser 57: else
1.21.2.5.2.6! paf 58: return new VVoid;
1.1 parser 59: }
60:
1.13 paf 61: throw Exception("parser.runtime",
1.21.2.5.2.6! paf 62: &aname,
1.1 parser 63: "column not found");
1.21.2.5.2.3 paf 64: return 0; //unreached
1.1 parser 65: }
E-mail: