public static void WriteFile(RookDB database, string filename, bool allowOverwrite = false) { if (File.Exists(filename) && !allowOverwrite) { Logger.Critical?.WriteLine("[RookDB] Could not write file, file exists and allowOverwrite was not enabled. Aborting write operation."); return; } JsonWriterOptions writerOptions = new JsonWriterOptions() { Indented = true, SkipValidation = false }; using (FileStream fs = new FileStream(filename, FileMode.Create)) { using (Utf8JsonWriter writer = new Utf8JsonWriter(fs, writerOptions)) { writer.WriteStartObject(); writer.WriteStartArray("sheets"); foreach (DBTable table in database.tables.Values) { WriteTable(table, writer); } writer.WriteEndArray(); writer.WriteEndObject(); } } }
internal DBTable(JsonElement tableBase, RookDB owner) { ownerDB = owner; ParseWholeText(tableBase); }
internal static DBRecord ParseRecord(JsonElement baseElement, List <DBColumnInfo> columns, Dictionary <string, List <DBColumnInfo> > listSchemas) { string recordIdent = null; List <object> values = new List <object>(); foreach (DBColumnInfo column in columns) { switch (column.columnType) { case ColumnType.UniqueIdentifier: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement uidChild)) { recordIdent = uidChild.GetString(); values.Add(recordIdent); } else { throw new Exception("[RookDB] Cannot have a UniqueIdentifier with no value! (JSON property not found via column name.)"); } break; case ColumnType.Boolean: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement boolChild)) { values.Add(boolChild.GetBoolean()); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Color: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement colorChild)) { //read int, force to 6 digit wide hex representation, parse pairs of characters as bytes (r/g/b values). string cHex = colorChild.GetInt32().ToString("X6"); values.Add(new byte[] { Convert.ToByte(cHex.Substring(0, 2), 16), Convert.ToByte(cHex.Substring(2, 2), 16), Convert.ToByte(cHex.Substring(4, 2), 16) }); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Enumeration: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement enumChild) || enumChild.GetInt32() >= column.columnMeta.Length) { values.Add(column.columnMeta[enumChild.GetInt32()]); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Flags: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement flagsChild)) { List <string> claimed = new List <string>(); uint flagData = flagsChild.GetUInt32(); for (int shiftCount = 0; shiftCount < 32 && shiftCount < column.columnMeta.Length; shiftCount++) { if ((flagData & (1 << shiftCount)) != 0) { claimed.Add(column.columnMeta[shiftCount]); } } values.Add(claimed.ToArray()); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Float: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement floatChild)) { values.Add(floatChild.GetSingle()); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Integer: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement intChild)) { values.Add(intChild.GetInt32()); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.List: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement listElement)) { if (!listSchemas.ContainsKey(column.ownerTable.identifier + "@" + column.columnIdenfier)) { Logger.Info.WriteLine("[RookDB] Attempted to parse list with missing schema. Check database is valid, this should not happen. Ignoring field."); values.Add(RookDB.GetDefaultFieldValue(column)); break; } DBTable listTable = new DBTable(listSchemas[column.ownerTable.identifier + "@" + column.columnIdenfier], "EmbeddedList"); foreach (JsonElement field in listElement.EnumerateArray()) { DBRecord record = ParseRecord(field, listTable.columns, listSchemas); record.ownerTable = listTable; listTable.records.Add(record.identifier, record); } values.Add(listTable); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Reference: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement refChild)) { values.Add(column.columnMeta[0] + "/" + refChild.GetString()); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; case ColumnType.Text: if (baseElement.TryGetProperty(column.columnIdenfier, out JsonElement textChild)) { values.Add(textChild.GetString()); } else { values.Add(RookDB.GetDefaultFieldValue(column)); } break; } } if (recordIdent == null) { for (int i = 0; i < columns.Count; i++) { if (columns[i].columnType == ColumnType.Text) { recordIdent = (string)values[i]; break; } } if (recordIdent == null) { //if its still null, we have a serious problem here, we cant even make up a uid. throw new Exception("[RookDB] Cannot load database entry, it has no unique identity and no text fields to assume uid from."); } else { Logger.Verbose?.WriteLine("[RookDB] Record loaded without unique identifier, generated name=" + recordIdent); } } return(new DBRecord(recordIdent, values.ToArray())); }