Exemplo n.º 1
0
        public async Task <PeekResult> Get(string name, string build, string col, int val, bool useHotfixes = false, bool calcOffset = true)
        {
            Logger.WriteLine("Serving foreign key row for " + name + "::" + col + " (" + build + ", hotfixes: " + useHotfixes + ") value " + val);

            var storage = await dbcManager.GetOrLoad(name, build, useHotfixes);

            var result = new PeekResult();

            result.values = new Dictionary <string, string>();

            if (!storage.Values.Any())
            {
                return(result);
            }

            var offset      = 0;
            var recordFound = false;

            if (!calcOffset && col == "ID")
            {
                if (storage.TryGetValue(val, out DBCDRow row))
                {
                    for (var i = 0; i < storage.AvailableColumns.Length; ++i)
                    {
                        string fieldName = storage.AvailableColumns[i];

                        if (fieldName != col)
                        {
                            continue;
                        }

                        var field = row[fieldName];

                        // Don't think FKs to arrays are possible, so only check regular value
                        if (field.ToString() == val.ToString())
                        {
                            for (var j = 0; j < storage.AvailableColumns.Length; ++j)
                            {
                                string subfieldName = storage.AvailableColumns[j];
                                var    subfield     = row[subfieldName];

                                if (subfield is Array a)
                                {
                                    for (var k = 0; k < a.Length; k++)
                                    {
                                        result.values.Add(subfieldName + "[" + k + "]", a.GetValue(k).ToString());
                                    }
                                }
                                else
                                {
                                    result.values.Add(subfieldName, subfield.ToString());
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                foreach (DBCDRow row in storage.Values)
                {
                    if (recordFound)
                    {
                        continue;
                    }

                    offset++;

                    for (var i = 0; i < storage.AvailableColumns.Length; ++i)
                    {
                        string fieldName = storage.AvailableColumns[i];

                        if (fieldName != col)
                        {
                            continue;
                        }

                        var field = row[fieldName];

                        // Don't think FKs to arrays are possible, so only check regular value
                        if (field.ToString() == val.ToString())
                        {
                            for (var j = 0; j < storage.AvailableColumns.Length; ++j)
                            {
                                string subfieldName = storage.AvailableColumns[j];
                                var    subfield     = row[subfieldName];

                                if (subfield is Array a)
                                {
                                    for (var k = 0; k < a.Length; k++)
                                    {
                                        result.values.Add(subfieldName + "[" + k + "]", a.GetValue(k).ToString());
                                    }
                                }
                                else
                                {
                                    result.values.Add(subfieldName, subfield.ToString());
                                }
                            }

                            recordFound = true;
                        }
                    }
                }
            }

            result.offset = offset;

            return(result);
        }
Exemplo n.º 2
0
        public async Task <PeekResult> Get(string name, string build, string col, int val, bool useHotfixes = false, string pushIDs = "")
        {
            Logger.WriteLine("Serving peek row for " + name + "::" + col + " (" + build + ", hotfixes: " + useHotfixes + ") value " + val);

            List <int> pushIDList = null;

            if (useHotfixes && pushIDs != "")
            {
                pushIDList = new List <int>();

                var pushIDsExploded = pushIDs.Split(',');

                if (pushIDsExploded.Length > 0)
                {
                    foreach (var pushID in pushIDs.Split(','))
                    {
                        if (int.TryParse(pushID, out int pushIDInt))
                        {
                            pushIDList.Add(pushIDInt);
                        }
                    }
                }
            }

            var storage = await dbcManager.GetOrLoad(name, build, useHotfixes, LocaleFlags.All_WoW, pushIDList);

            var result = new PeekResult {
                values = new Dictionary <string, string>()
            };

            if (!storage.Values.Any())
            {
                return(result);
            }

            if (col == "ID" && storage.TryGetValue(val, out var rowByIndex))
            {
                foreach (var fieldName in storage.AvailableColumns)
                {
                    if (fieldName != col)
                    {
                        continue;
                    }

                    var field = rowByIndex[fieldName];

                    // Don't think FKs to arrays are possible, so only check regular value
                    if (field.ToString() != val.ToString())
                    {
                        continue;
                    }

                    foreach (var subfieldName in storage.AvailableColumns)
                    {
                        var subfield = rowByIndex[subfieldName];

                        if (subfield is Array a)
                        {
                            for (var k = 0; k < a.Length; k++)
                            {
                                result.values.Add(subfieldName + "[" + k + "]", a.GetValue(k).ToString());
                            }
                        }
                        else
                        {
                            result.values.Add(subfieldName, subfield.ToString());
                        }
                    }
                }
            }
            else
            {
                var recordFound = false;

                foreach (var row in storage.Values)
                {
                    if (recordFound)
                    {
                        continue;
                    }

                    foreach (var fieldName in storage.AvailableColumns)
                    {
                        if (fieldName != col)
                        {
                            continue;
                        }

                        var field = row[fieldName];

                        // Don't think FKs to arrays are possible, so only check regular value
                        if (field.ToString() != val.ToString())
                        {
                            continue;
                        }

                        foreach (var subfieldName in storage.AvailableColumns)
                        {
                            var subfield = row[subfieldName];

                            if (subfield is Array a)
                            {
                                for (var k = 0; k < a.Length; k++)
                                {
                                    result.values.Add(subfieldName + "[" + k + "]", a.GetValue(k).ToString());
                                }
                            }
                            else
                            {
                                result.values.Add(subfieldName, subfield.ToString());
                            }
                        }

                        recordFound = true;
                    }
                }
            }

            return(result);
        }