Ejemplo n.º 1
0
        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();
                }
            }
        }
Ejemplo n.º 2
0
 internal DBTable(JsonElement tableBase, RookDB owner)
 {
     ownerDB = owner;
     ParseWholeText(tableBase);
 }
Ejemplo n.º 3
0
        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()));
        }