00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include "brass_dbstats.h"
00025
00026 #include "brass_postlist.h"
00027
00028 using namespace std;
00029
00031 static const string DATABASE_STATS_KEY(1, '\0');
00032
00033 void
00034 BrassDatabaseStats::read(BrassPostListTable & postlist_table)
00035 {
00036 string data;
00037 if (!postlist_table.get_exact_entry(DATABASE_STATS_KEY, data)) {
00038
00039 zero();
00040 return;
00041 }
00042
00043 const char * p = data.data();
00044 const char * end = p + data.size();
00045
00046 if (unpack_uint(&p, end, &last_docid) &&
00047 unpack_uint(&p, end, &doclen_lbound) &&
00048 unpack_uint(&p, end, &wdf_ubound) &&
00049 unpack_uint(&p, end, &doclen_ubound) &&
00050 unpack_uint(&p, end, &oldest_changeset) &&
00051 unpack_uint_last(&p, end, &total_doclen)) {
00052
00053
00054
00055 doclen_ubound += wdf_ubound;
00056 return;
00057 }
00058
00059 if (p)
00060 throw Xapian::DatabaseCorruptError("Bad encoded DB stats (overflowed)");
00061
00062 throw Xapian::DatabaseCorruptError("Bad encoded DB stats (out of data)");
00063 }
00064
00065 void
00066 BrassDatabaseStats::write(BrassPostListTable & postlist_table) const
00067 {
00068 string data;
00069 pack_uint(data, last_docid);
00070 pack_uint(data, doclen_lbound);
00071 pack_uint(data, wdf_ubound);
00072
00073
00074
00075 pack_uint(data, doclen_ubound - wdf_ubound);
00076 pack_uint(data, oldest_changeset);
00077
00078
00079
00080 pack_uint_last(data, total_doclen);
00081 postlist_table.add(DATABASE_STATS_KEY, data);
00082 }