Die Überlegung ist, das die Authoriesierung schnell gehen soll, während die Verwaltung länger Zeit hat.
Die Struktur Cacherecord ist die Speicherstruktur in der Datenbasis
struct CRDienst { UINT4 dienst; // Dienste /Userservice // ( User-service << 16 | Framed-Protokol) time_t czeit; // Zeit des Cachings u_int16_t offset; // offset der Nutzdaten vom beginn des Satzes u_int16_t lang; // Länge der Nutzdaten }; const UINT4 HDIENSTMASK=0xffff; inline UINT4 hauptdienst(UINT4 d) { return d & HDIENSTMASK; } inline UINT4 dienstattr(UINT4 d) { return d >> 16; }Layout:
---------------------------------------------------------- | zeit | ng | CRDienst |daten | CRDienst | Daten | ..... ----------------------------------------------------------Die eigentliche Speicherstruktur ...
struct Cacherecord { u_int32_t ng; // Zahl der Gruppen (größe wegen alignment) CRDienst data; // Erster Dienst char rest[1]; // .... };Die Verwaltungsstruktur ....
class Cacherecverw { Cacherecord *ur; CRDienst *aktd; // Aktueller Dienst int aktdnr; // Dienstnummer für Iteration u_char *ptr; // Aktuelles Attribut in Attributiterator u_char *eptr; // Zeiger hinter das letzte Attribut public: // Initialisierungen Userrecverw(); Userrecverw(char *buffer); void init(char *buffer); void setbuffer(char *buffer); void clear(); // Abfragen int totallen(); const Cacherecord *data() { return ur; } //----- Iteratoren -------- // Dienstiteratoren CRDienst *ersterdienst(); CRDienst *weitererdienst(); CRDienst *findedienst(UINT4 dn); int lenreply() { return (aktd ? aktd->lang : 0); } auth_attr *erstes(CRDienst *d) { return (auth_attr *)((u_char *)ur+d->offset); } u_char *ende(CRDienst *d) { return (u_char *)ur+d->offset+d->lang; } // Attributiterator auth_attr *first(CRDienst *d); auth_attr *next(); auth_attr *finde(u_char attribut); //--------- Aufbauiteratoren ------------ void neuerdienst(UINT4 dn); int add(Attreintrag *attr,char *value); int add(u_char attribut,char *wert,int len); int add(u_char attribut,UINT4 w); int add(auth_attr *a); //--------- Operationen----------------- int update(Cacherecverw &upd,Cacherecverw &alt); //--------- Ausgabe -------------------- void print(ostream &ostr); // bis auf Dienst 0 void print(char *username,ostream &ostr); // invers zu parser };Remark: On some Processorarchitectures like a Sparc-Processor the Alignment of shorts and longs mut be aligned. Caution when porting: The length of a Servicedescription must be paded.