!7 mainPackage agiBlue mainClassName dblib set flag AllPublic. // in main DB concept Slice { GlobalID globalID = aGlobalIDObject(); S caseID; S name; bool indexed = true; long sliceDumped; // wall time, set before dump starts new Ref owner; S defaultCaseID() { ret uniqueFileNameUsingMD5_80_v2(name + " " + globalID); } GlobalID globalID() { ret globalID; } } // in any DB concept Page { S globalID = aGlobalID(); S url, q; // for in-VM helper bots void quickPost(S key, S value) { fail("todo"); //new GetEntriesAndPost(_concepts).go(this, litmap(+key, +value)); } } abstract concept AbstractEntry { new Ref page; int count; S key; S ip; new Ref signer; S q() { Page p = page!; ret p == null ? null : page->q; } } concept Entry > AbstractEntry { S globalID = aGlobalID(); // TODO: migrate to object S value; } concept MultiLineEntry > AbstractEntry { GlobalID globalID = aGlobalIDObject(); S value; } concept BlobEntry > AbstractEntry { GlobalID globalID = aGlobalIDObject(); long length; S md5; } // in main DB? concept Signer { S globalID = aGlobalID(); S publicKey; bool trusted; S approvedBy; } concept User { GlobalID globalID = aGlobalIDObject(); long lastSeen; } concept CookieUser > User { S cookie; toString { ret "[cookieUser]"; } } concept GoogleUser > User { long googleLogInDate; S googleEmail, googleFirstName, googleLastName; bool googleEmailVerified; toString { ret googleFirstName + " " + googleLastName; } } concept MinimalUser > User { S userName, encryptedPassword; // TODO toString { ret "[minimalUser] " + userName; } } // in main DB concept Session { S cookie; S selectedSlice; // global ID Page slicePage; // phasing out new Ref user; } // singleton concept in every DB concept SliceInfo { GlobalID globalID; LS mandatoryBotVMBusIDs; } sclass CentralIndexEntry { Set slices = synchroLinkedHashSet(); }