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