#ifndef hTrackContractIDByTrackIDTable #define hTrackContractIDByTrackIDTable #include "PackedTable.h" #include using namespace std; struct _trackIDTrackContractID { private: unsigned long _track_id; unsigned long _track_contract_id; // Declaring these accessor methods will cause SWIG to provide // exactly the interface I want to use (i.e. $at->album_id() will return an album_id) // public: unsigned long track_id() { return _track_id; } unsigned long track_contract_id() { return _track_contract_id; } friend class TrackContractIDByTrackIDTable; }; class TrackContractIDByTrackIDTable : public PackedTableDynamic { protected: static const int kFieldTrackID = 0; static const int kFieldTrackContractID = 1; multimap _map; virtual const char* _maxIDQueryString() { return "SELECT MAX(track_id) FROM track_contract"; } virtual const char* _dataQueryString() { return "SELECT track_id,track_contract_id FROM track_contract ORDER BY track_id, track_contract_id";} virtual long _insertRowDynamic(MYSQL_ROW row) { long trackID; long trackContractID; PackedTable::_ParseLong(row[kFieldTrackID], &trackID); PackedTable::_ParseLong(row[kFieldTrackContractID], &trackContractID); struct _trackIDTrackContractID newData; newData._track_id = trackID; newData._track_contract_id = trackContractID; _map.insert(pair(trackID, newData)); return trackID; } public: struct _trackIDTrackContractID* nextItem() { return (struct _trackIDTrackContractID*)_theIterator.next(); } protected: PackedTable::SharedMemoryHandler _dataFileHandler; virtual DataFileHandler* _getDataFileHandler() { return &_dataFileHandler; } virtual unsigned long _getDynamicElementSize() { return sizeof(struct _trackIDTrackContractID); } virtual unsigned long _equalKeys(void* ptrA, void* ptrB) { struct _trackIDTrackContractID* dataA = (struct _trackIDTrackContractID*)ptrA; struct _trackIDTrackContractID* dataB = (struct _trackIDTrackContractID*)ptrB; return (dataA->_track_id == dataB->_track_id); } multimap::iterator _outputIterator; virtual void* _getFirstDynamicKeyValuePtr() { _outputIterator = _map.begin(); if (_outputIterator == _map.end()) { return NULL; } return (void*) &(_outputIterator); } virtual void* _getNextDynamicKeyValuePtr() { ++_outputIterator; if (_outputIterator == _map.end()) { return NULL; } return (void*) &(_outputIterator); } virtual long _getKey(void* dynamicDataPtr) { multimap::iterator *i = (multimap::iterator *)dynamicDataPtr; if (NULL == i){ return 0; } return (**i).first; } virtual void* _getValue(void* dynamicDataPtr) { multimap::iterator *i = (multimap::iterator *)dynamicDataPtr; if (NULL == i){ return 0; } return (void*) &((**i).second); } }; #endif