/// <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); } }
/// <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()); }
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); } } } } }