Warning: session_start(): open(/var/lib/php/sessions/sess_olbkcmp2l6rl3u1ps2d305qq0q, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
concept G22Variable extends ConceptWithChangeListeners is IPersistenceInfo, AutoCloseable {
settableWithVar S name;
volatile O value;
settableWithVar bool persistent;
// dispose of resource when project is closed
// or variable is deleted/overwritten
settable bool autoClose;
// big = value is stored in separate file
settableWithVar bool big;
// field "value" is persisted iff field "persistent" is set
public Map _persistenceInfo() { ret litmap(value := persistent && !big); }
public transient simplyCached FieldVar varValue() {
ret new FieldVar(this, "value", () -> value(), value -> value(value));
}
void setValueIfNull(O defaultValue) {
if (defaultValue != null && value == null) value(defaultValue);
}
O cachedValue() { ret value; }
O get aka value() {
if (value != null) ret value;
if (big) ret getBigValue();
ret value;
}
G22Utils g22utils() {
ret main g22utils(_concepts());
}
File bigFile() {
ret newFile(assertNotNull(g22utils().projectDir()), id + "-" + sanitizeFileName(name) + ".structgz");
}
O getBigValue() {
File f = bigFile();
ret setValueField(unstructureGZFile(f, g22utils().classFinder()));
}
void setBigValue(O value) {
if (value == null) {
if (hasBigValue()) {
deleteBigValue();
change();
}
} else {
File f = bigFile();
saveGZStructureToFile(f, value);
change();
}
}
void deleteBigValue() {
deleteFile(bigFile());
}
bool hasBigValue() {
ret fileExists(bigFile());
}
void makeBig {
if (big) ret;
setBigValue(value);
big(true);
persistent(true);
}
void makeSmall {
if (!big) ret;
get(); // will cache the value
big(false);
deleteBigValue();
}
selfType value aka setValue(O o) {
if (big)
setBigValue(o);
else if (!eq(value, o)) {
setValueField(o);
change();
}
this;
}
bool notNull aka has() {
ret big ? hasBigValue() : value != null;
}
void unload() {
if (big) setValueField(null);
}
O setValueField(O o) {
if (autoClose && o != value)
dispose value;
ret value = o;
}
close {
if (autoClose)
dispose value;
}
void delete :: before { close(); }
}