#ifndef hAlbumTrackTable #define hAlbumTrackTable #include "PackedTable.h" struct _albumTrack { private: unsigned long _album_id; unsigned long _track_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 album_id() { return _album_id; } unsigned long track_id() { return _track_id; } friend class AlbumTrackTable; }; class AlbumTrackTable : public PackedTableDynamic { public: struct _albumTrack* nextItem() { return (struct _albumTrack*)_theIterator.next(); } protected: static const int kFieldAlbumID = 0; static const int kFieldTrackID = 1; PackedTable::VirtualMemoryFile _dataFile; virtual DataFile* _theDataFile() { return &_dataFile; } virtual tSize _dataDynamicElementSize() { return sizeof(struct _albumTrack); } // !!! Makes sense to just get the album_ids from the track table rather than album. // !!! There may be albums with no tracks, so why bother with those? // virtual const char* _maxIDQueryString() { return "SELECT MAX(album_id) FROM track"; } virtual const char* _dataQueryString() { return "SELECT album_id,track_id FROM track ORDER BY album_id,track_id";} virtual tIndex _writeRowDynamic(tIndex i, MYSQL_ROW row, void* dataPtr) { long albumID = i; long trackID; PackedTable::_ParseLong(row[kFieldTrackID], &trackID); struct _albumTrack* newData = (struct _albumTrack*)dataPtr; newData->_album_id = albumID; newData->_track_id = trackID; return albumID; } virtual int _equalKeys(void* ptrA, void* ptrB) { struct _albumTrack* dataA = (struct _albumTrack*)ptrA; struct _albumTrack* dataB = (struct _albumTrack*)ptrB; return (dataA->_album_id == dataB->_album_id); } }; #endif