00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __DATABASE_H__
00021 #define __DATABASE_H__
00022
00023 #include "GenericDB.h"
00024 #include "FreeCoinsRsc.h"
00025
00026
00027
00028
00029
00030
00031 template <class recordStructure, class packedRecordStructure> class Database
00032 : public GenericDB
00033 {
00034 public:
00035
00036
00037
00038
00039 MemHandle getUnpackedRecord(UInt16 id,recordStructure* rec) DB_SECTION1;
00040
00041
00042
00043
00044 MemHandle getUnpackedRecord(recordStructure* rec) DB_SECTION1;
00045
00046
00047
00048
00049
00050 MemHandle getUnpackedRecord(UInt32 uid,recordStructure* rec) DB_SECTION1;
00051
00052
00053
00054
00055 Database(DmOpenRef db_open_ref) : GenericDB(db_open_ref) {};
00056
00057
00058
00059
00060
00061 Database(UInt32 type, UInt32 creator, Char* db_name): GenericDB(type, creator, db_name) {};
00062
00063
00064
00065
00066
00067
00068 Database(UInt32 type, UInt32 creator, Char* db_name, UInt16 categ_string) : GenericDB(type, creator, db_name, categ_string) {};
00069
00070
00071 virtual ~Database() DB_SECTION1;
00072
00073
00074
00075
00076 virtual void unpackRecord (recordStructure* rec, packedRecordStructure* packed_rec)=0;
00077
00078
00079
00080
00081 virtual void packRecord (recordStructure* rec, MemHandle db_entry)=0;
00082
00083
00084
00085
00086 virtual UInt16 newRecord(recordStructure* rec) DB_SECTION1;
00087 };
00088
00089 template <class recordStructure, class packedRecordStructure> MemHandle
00090 Database<recordStructure, packedRecordStructure>:: getUnpackedRecord(UInt32 uid,recordStructure* rec)
00091 {
00092 return getUnpackedRecord(getRecordId(uid),rec);
00093 }
00094
00095 template <class recordStructure, class packedRecordStructure> MemHandle
00096 Database<recordStructure, packedRecordStructure>:: getUnpackedRecord(UInt16 id,recordStructure* rec)
00097 {
00098 MemHandle rec_h;
00099 packedRecordStructure* pac_rec;
00100
00101
00102 rec_h=DmQueryRecord(ref,id);
00103 if(!rec_h) {
00104 ErrFatalDisplay("Could not find record with given ID");
00105 return NULL;
00106 }
00107
00108 pac_rec = (packedRecordStructure*) MemHandleLock(rec_h);
00109 if(!pac_rec){
00110 ErrFatalDisplay("Could not get lock on unpacked record");
00111 return NULL;
00112 }
00113
00114 unpackRecord(rec,pac_rec);
00115 MemHandleUnlock(rec_h);
00116 return rec_h;
00117 }
00118
00119 template <class recordStructure, class packedRecordStructure> MemHandle
00120 Database<recordStructure, packedRecordStructure>:: getUnpackedRecord(recordStructure* rec)
00121 {
00122 if(!isRecordSelected()) ErrFatalDisplay("There is no record currently selected");
00123 return getUnpackedRecord(selected_record, rec);
00124 }
00125
00126 template <class recordStructure, class packedRecordStructure> UInt16
00127 Database<recordStructure, packedRecordStructure>:: newRecord(recordStructure* rec)
00128 {
00129 MemHandle h,p;
00130 UInt16 index=dmMaxRecordIndex;
00131
00132
00133 h=DmNewHandle(ref,1);
00134 if(!h) {
00135 MemHandle str_handle = DmGetResource (strRsc,NEW_REC_FAILED_STR);
00136 ErrFatalDisplay(reinterpret_cast<char*> (MemHandleLock (str_handle)));
00137 MemHandleUnlock (str_handle);
00138 DmReleaseResource (str_handle);
00139 }
00140
00141 packRecord(rec,h);
00142
00143 p = (MemHandle) MemHandleLock(h);
00144 MemPtrUnlock(p);
00145
00146 DmAttachRecord(ref,&index,h,0);
00147
00148 if(current_cat!=dmAllCategories) setRecordCategory(index, current_cat);
00149 return index;
00150 }
00151
00152 template <class recordStructure, class packedRecordStructure> Database<recordStructure, packedRecordStructure>::~Database()
00153 {}
00154
00155 template <class Field> void GenericDB::writeAndAdvance(MemPtr s, UInt32& offset, Field* f)
00156 {
00157 DmWrite(s, offset, (MemPtr) f, sizeof(Field));
00158 offset += sizeof(Field);
00159 }
00160
00161 #endif