/*-------------------------------------------------------- public interface of the log, lsn and logrecord classes ---------------------------------------------------------*/ class log { public: log(const char *dbname, Status &error_status); log(const char *dbname, unsigned int maxlogsize, unsigned int logtailsize, Status &error_status); ~log(); Status read(const lsn_t &lsn, logrecord &logrec); Status write(logrecord &logrec, bool is_rollback, lsn_t &assigned_lsn); Status read_next_logrec(const lsn_t ¤tlsn, logrecord &logrec); Status read_next_logrec(const logrecord &curr_logrec, logrecord &next_logrec); Status get_next_lsn(lsn_t &nextlsn); Status get_lastckpt_lsn(lsn_t &lastckpt_lsn); Status set_newckpt_lsn(const lsn_t &newckpt); Status flush(); Status bufmgr_flush(lsn_t &flushed_lsn); }; class lsn_t { public: lsn_t(); lsn_t(unsigned int wrap, PageId page, unsigned int off); ~lsn_t() {} bool operator==(const lsn_t &rhs) const; bool operator!=(const lsn_t &rhs) const; bool operator< (const lsn_t &rhs) const; bool operator> (const lsn_t &rhs) const; bool operator<=(const lsn_t &rhs) const; bool operator>=(const lsn_t &rhs) const; lsn_t &operator=(const lsn_t &rhs); bool is_invalid() const; friend ostream &operator<<(ostream &out, const lsn_t &lsn); friend class log; }; class logrecord { public: logrecord(); logrecord(const logrecord &rhs); ~logrecord() {} const unsigned int LOG_MAXRECSIZ = PAGESIZE * 3; void set_datalength(unsigned int logrecdatalen) { logrechead_ptr->lh_length = logrecdatalen + sizeof(logrecheader); } lsn_t get_lsn() const { return logrechead_ptr->lh_lsn; } unsigned int get_datalength() const { return logrechead_ptr->lh_length - sizeof(logrecheader); } unsigned char *get_data_ptr() const { return data_ptr; } logrecord &operator=(const logrecord &rhs); friend ostream &operator<<(ostream &out, const logrecord &logrec); friend class log; }; /*-------------------------------------------------------------------------*/