/// <summary> /// Reads persisted state from the backing store and deserializes it into the the target /// grain state object. /// </summary> /// <param name="grainType">A string holding the name of the grain class.</param> /// <param name="grainReference">Represents the long-lived identity of the grain.</param> /// <param name="grainState">A reference to an object to hold the persisted state of the grain.</param> /// <returns>Completion promise for this operation.</returns> public async Task ReadStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { if (DataManager == null) throw new ArgumentException("DataManager property not initialized"); var entityData = await DataManager.Read(grainState.GetType().Name, grainReference.ToKeyString()); if (entityData != null) { ConvertFromStorageFormat(grainState, entityData); } }
public async Task WriteStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { var stateName = grainState.GetType().Name; var key = grainReference.ToKeyString(); var id = string.Format(CultureInfo.InvariantCulture, "{0}/{1}", stateName, key); using (IAsyncDocumentSession session = this.documentStore.OpenAsyncSession()) { await session.StoreAsync(grainState, id); await session.SaveChangesAsync(); } }
public async Task ReadStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { var stateName = grainState.GetType().Name; var key = grainReference.ToKeyString(); var id = string.Format(CultureInfo.InvariantCulture, "{0}/{1}", stateName, key); using (IAsyncDocumentSession session = this.documentStore.OpenAsyncSession()) { var state = await session.LoadAsync<RavenJObject>(id); if (state != null) { grainState.SetAll(state.ToDictionary(x => x.Key, x => x.Value.Value<object>())); } } }
public async Task ClearStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { var stateName = grainState.GetType().Name; var key = grainReference.ToKeyString(); var id = string.Format(CultureInfo.InvariantCulture, "{0}/{1}", stateName, key); using (IAsyncDocumentSession session = this.documentStore.OpenAsyncSession()) { session.Advanced.Defer(new DeleteCommandData { Key = id }); await session.SaveChangesAsync(); } }
/// <summary> /// Constructs a grain state instance by deserializing a JSON document. /// </summary> /// <param name="grainState">Grain state to be populated for storage.</param> /// <param name="entityData">JSON storage format representaiton of the grain state.</param> protected static void ConvertFromStorageFormat(GrainState grainState, string entityData) { JavaScriptSerializer deserializer = new JavaScriptSerializer(); object data = deserializer.Deserialize(entityData, grainState.GetType()); var dict = ((GrainState)data).AsDictionary(); grainState.SetAll(dict); }
/// <summary> /// Removes grain state from its backing store, if found. /// </summary> /// <param name="grainType">A string holding the name of the grain class.</param> /// <param name="grainReference">Represents the long-lived identity of the grain.</param> /// <param name="grainState">An object holding the persisted state of the grain.</param> /// <returns></returns> public Task ClearStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { if (DataManager == null) throw new ArgumentException("DataManager property not initialized"); DataManager.Delete(grainState.GetType().Name, grainReference.ToKeyString()); return TaskDone.Done; }
/// <summary> /// Writes the persisted state from a grain state object into its backing store. /// </summary> /// <param name="grainType">A string holding the name of the grain class.</param> /// <param name="grainReference">Represents the long-lived identity of the grain.</param> /// <param name="grainState">A reference to an object holding the persisted state of the grain.</param> /// <returns>Completion promise for this operation.</returns> public Task WriteStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { if (DataManager == null) throw new ArgumentException("DataManager property not initialized"); var entityData = ConvertToStorageFormat(grainState); return DataManager.Write(grainState.GetType().Name, grainReference.ToKeyString(), entityData); }
private string GetTableName(GrainState grainState) { if (Table != null && Table.Length > 0) return Table; return grainState.GetType().Name; //use grain name generator if no table provided }
public async Task ReadStateAsync(string grainType, GrainReference grainReference, GrainState grainState) { var con = await GetFreeConnection(); var table = GetTableName(grainState); string keyAsString = GetKey(grainReference); string query; if (CustomTable) query = string.Format("select * from `{0}` where `guid` = \"{1}\";", table, MySqlHelper.EscapeString(keyAsString)); else query = string.Format("select * from `{0}` where `guid` = \"{1}\" AND `type` = \"{2}\";", table, MySqlHelper.EscapeString(keyAsString), MySqlHelper.EscapeString(grainType)); using (var cmd = new MySqlCommand(query, con)) { using (var reader = await cmd.ExecuteReaderAsync()) { if (await reader.ReadAsync()) { Dictionary<string, object> dict = new Dictionary<string, object>(); for (int i = 0; i < reader.FieldCount; ++i) dict.Add(reader.GetName(i), reader.GetValue(i)); if (dict.ContainsKey("data")) { try { var data = (GrainState) Newtonsoft.Json.JsonConvert.DeserializeObject(dict["data"].ToString(), grainState.GetType()); grainState.SetAll(data.AsDictionary()); } catch { grainState.SetAll(null); /* corruption? */ } } else grainState.SetAll(null); } } } await AddFreeConnection(con); }