Beispiel #1
0
        /// <summary>
        /// Given metadata name-value IDs, return name-value string->object values
        /// </summary>
        /// <param name="ctxt">Database connection</param>
        /// <param name="ids">name=>value IDs</param>
        /// <returns></returns>
        public static async Task <Dictionary <string, object> > GetMetadataValuesAsync(Context ctxt, Dictionary <int, long> ids)
        {
            var totalTimer = ScopeTiming.StartTiming();

            try
            {
                var retVal = new Dictionary <string, object>(ids.Count);
                if (ids.Count == 0)
                {
                    return(retVal);
                }

                await Names.CacheNamesAsync(ctxt, ids.Keys).ConfigureAwait(false);

                await Values.CacheValuesAsync(ctxt, ids.Values).ConfigureAwait(false);

                foreach (var kvp in ids)
                {
                    NameObj name = await Names.GetNameAsync(ctxt, kvp.Key).ConfigureAwait(false);

                    object value = await Values.GetValueAsync(ctxt, kvp.Value).ConfigureAwait(false);

                    retVal.Add(name.name, value);
                }
                return(retVal);
            }
            finally
            {
                ScopeTiming.RecordScope("NameValues.GetMetadataValuesAsync", totalTimer);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Internal use, get a summary of a text of an item and its metadata
        /// </summary>
        /// <param name="ctxt">Database connection</param>
        /// <param name="itemId">The item to summarize</param>
        /// <returns>Summary of item</returns>
        public static async Task <string> SummarizeItemAsync(Context ctxt, long itemId)
        {
            var sb = new StringBuilder();

            sb.AppendLine($"Item: {itemId}");

            int tableId =
                Utils.ConvertDbInt32(await ctxt.Db.ExecuteScalarAsync($"SELECT tableid FROM items WHERE id = {itemId}"));

            if (tableId < 0)
            {
                throw new MetaStringsException("Item not found: " + itemId);
            }

            string tableName = (await Tables.GetTableAsync(ctxt, tableId)).name;

            sb.AppendLine($"Table: {tableName} ({tableId})");

            long valueId =
                Utils.ConvertDbInt64(await ctxt.Db.ExecuteScalarAsync($"SELECT valueid FROM items WHERE id = {itemId}"));
            object value = await Values.GetValueAsync(ctxt, valueId);

            sb.AppendLine($"Value: {value} ({valueId})\n");

            sb.AppendLine("Metadata:");
            var metadata = await NameValues.GetMetadataValuesAsync(ctxt, GetItemDataAsync(ctxt, itemId).Result);

            foreach (var kvp in metadata)
            {
                sb.AppendLine($"{kvp.Key}: {kvp.Value}");
            }

            sb.AppendLine("Long Strings:");
            using (var reader = await ctxt.Db.ExecuteReaderAsync($"SELECT name, longstring FROM longstrings WHERE itemid = {itemId}"))
            {
                while (await reader.ReadAsync())
                {
                    sb.AppendLine($"{reader.GetString(0)}:\n{reader.GetString(1)}\n");
                }
            }

            return(sb.ToString());
        }
Beispiel #3
0
        public void TestItemData()
        {
            using (var ctxt = TestUtils.GetCtxt())
            {
                int  tableId = Tables.GetIdAsync(ctxt, "blet").Result;
                long itemId  = Items.GetIdAsync(ctxt, tableId, Values.GetIdAsync(ctxt, "monkey").Result).Result;

                {
                    var itemData = new Dictionary <int, long>();
                    itemData[Names.GetIdAsync(ctxt, tableId, "foo").Result]       = Values.GetIdAsync(ctxt, "bar").Result;
                    itemData[Names.GetIdAsync(ctxt, tableId, "something").Result] = Values.GetIdAsync(ctxt, "else").Result;
                    Items.SetItemData(ctxt, itemId, itemData);
                    ctxt.ProcessPostOpsAsync().Wait();

                    var metadata = Items.GetItemDataAsync(ctxt, itemId).Result;
                    Console.WriteLine($"metadata1 Dict contents ({metadata.Count}):");
                    Console.WriteLine(string.Join("\n", metadata.Select(kvp => $"{kvp.Key}: {kvp.Value}")));

                    foreach (var kvp in metadata)
                    {
                        string nameVal  = Names.GetNameAsync(ctxt, kvp.Key).Result.name;
                        string valueVal = Values.GetValueAsync(ctxt, kvp.Value).Result.ToString();
                        if (nameVal == "foo")
                        {
                            Assert.AreEqual("bar", valueVal);
                        }
                        else if (nameVal == "something")
                        {
                            Assert.AreEqual("else", valueVal);
                        }
                        else
                        {
                            Assert.Fail("Name not recognized: " + nameVal);
                        }
                    }
                }

                {
                    var itemData = new Dictionary <int, long>();
                    itemData[Names.GetIdAsync(ctxt, tableId, "foo").Result]       = Values.GetIdAsync(ctxt, "blet").Result;
                    itemData[Names.GetIdAsync(ctxt, tableId, "something").Result] = Values.GetIdAsync(ctxt, "monkey").Result;
                    Items.SetItemData(ctxt, itemId, itemData);
                    ctxt.ProcessPostOpsAsync().Wait();

                    var metadata = Items.GetItemDataAsync(ctxt, itemId).Result;
                    Console.WriteLine($"metadata2 Dict contents ({metadata.Count}):");
                    Console.WriteLine(string.Join("\n", metadata.Select(kvp => $"{kvp.Key}: {kvp.Value}")));

                    foreach (var kvp in metadata)
                    {
                        string nameVal  = Names.GetNameAsync(ctxt, kvp.Key).Result.name;
                        string valueVal = Values.GetValueAsync(ctxt, kvp.Value).Result.ToString();
                        if (nameVal == "foo")
                        {
                            Assert.AreEqual("blet", valueVal);
                        }
                        else if (nameVal == "something")
                        {
                            Assert.AreEqual("monkey", valueVal);
                        }
                        else
                        {
                            Assert.Fail("Name not recognized: " + nameVal);
                        }
                    }
                }
            }
        }