#include "TCoreDb.h" NAMESPACE_UPP static String GetRandomString(int maxlength = 50000, int minlength = 0) { int len = minlength; unsigned span = maxlength - minlength; if(span > 0) { unsigned v = rand(); if(span >= RAND_MAX) v += rand() * RAND_MAX; len += rand() % (span + 1); } StringBuffer s(len); for(int i = 0; i < len; i++) s[i] = rand(); return s; } void DataFile::FileTest() { String name = ForceExt(GetTempFileName(), ".cdb"); DataFile file; if(!file.Create(name)) { RLOG("Cannot create file '" << name << "'."); NEVER(); return; } enum { COUNT = 100, OBJECTS = 1000, LENGTH = 50000, }; Vector values; srand(1); int i; for(i = 0; i < COUNT; i++) { int x = rand() % (int)OBJECTS; String s = GetRandomString(LENGTH); values.DoIndex(x) = s; file.Set(x, s, 0); } file.Commit(0); file.Compact(); for(i = 0; i < values.GetCount(); i++) { String from = file.Get(i); if(from != values[i]) { RLOG("DataFile::Set/Get mismatch at #" << i << " (" << from.GetLength() << " / " << values[i].GetLength() << ")"); NEVER(); } } file.Close(); DeleteFile(name); } void DataBase::AllocTest() { RLOG("DataBase::AllocTest"); String name = ForceExt(GetTempFileName(), ".cdb"); DataFile df; if(!df.Create(name)) { RLOG("Cannot create file '" << name << "'."); NEVER(); return; } DataBase db; int master = db.Create(df, 0); Vector< Vector > rows; { // fill in table DataTable& table = db.Add("POKUS"); table.AddColumn("A", STRING_V); table.AddColumn("B", INT_V); db.Commit(); df.Commit(0); enum { COUNT = 1000, OBJECTS = 1000, }; srand(1); for(int i = 0; i < COUNT; i++) { if(i % 10 == 0) RDUMP(i); int x = rand() % (int)OBJECTS; if(rows.GetCount() > x && !rows[x].IsEmpty()) { // empty / modify row if(rand() & 1) { table.Remove(x); rows[x].Clear(); } else { Vector& row = rows[x]; row[0] = GetRandomString(); row[1] = rand(); table.Set(x, row); } } else { // add row Vector row; row.Add(GetRandomString()); row.Add(rand()); x = table.Add(row); rows.DoIndex(x) = row; } if((i & 15) == 0) table.Commit(); } } db.Commit(); db.Close(); df.Compact(); db.Open(df, master, 0); { // check table DataTable& table = db["POKUS"]; int i = rows.GetCount(); while(i && rows[i - 1].IsEmpty()) i--; ASSERT(table.GetRowIndex().GetEndIndex() == i); while(--i >= 0) { if(i % 10 == 0) RDUMP(i); VERIFY(rows[i].IsEmpty() == table.IsEmpty(i)); if(!rows[i].IsEmpty()) { Vector row = table.Get(i); VERIFY(row[0] == rows[i][0] && row[1] == rows[i][1]); } } } db.Close(); df.Close(); DeleteFile(name); } static Date anchor_date(2000, 1, 1); enum { ROW_COUNT = 100000 }; static void CreateDataBase(const String& fn, int& aobj, int& bobj, int& cobj, int& dobj, int& eobj, int& fobj, int& iobj) { DataFile df; #ifdef NO_CACHE df.SetCache(16384, 50000, 50000); #endif//NO_CACHE if(!df.Create(fn)) { RLOG("error creating file '" << fn << "'"); NEVER(); return; } DataColumnOf a, b; DataColumnOf c; DataColumnOf d; DataColumnOf