/// <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) { object data = JsonConvert.DeserializeObject(entityData, grainState.GetType(), GrainStateMongoDataManager.JsonSetting); var dict = ((GrainState)data).AsDictionary(); grainState.SetAll(dict); }
public async Task ReadStateAsync(string grainType, GrainReference grainId, GrainState grainState) { try { var blobName = GetBlobName(grainType, grainId); var blob = container.GetBlockBlobReference(blobName); var exists = await blob.ExistsAsync(); if (!exists) { return; } var text = await blob.DownloadTextAsync(); if (string.IsNullOrWhiteSpace(text)) { return; } var data = JsonConvert.DeserializeObject(text, grainState.GetType(), settings); var dict = (( GrainState )data).AsDictionary(); grainState.SetAll(dict); grainState.Etag = blob.Properties.ETag; } catch (Exception ex) { Log.Error(0, ex.ToString()); } }
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 }
/// <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); }
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); }
/// <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)); }
/// <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 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(); } }
public async Task ReadStateAsync(string grainType, GrainReference grainId, GrainState grainState) { try { var blobName = GetBlobName(grainType, grainId); var blob = container.GetBlockBlobReference(blobName); string text; try { text = await blob.DownloadTextAsync(); } catch (StorageException exception) { var errorCode = exception.RequestInformation.ExtendedErrorInformation.ErrorCode; if (errorCode == BlobErrorCodeStrings.ContainerNotFound || errorCode == BlobErrorCodeStrings.BlobNotFound) { return; } throw; } if (string.IsNullOrWhiteSpace(text)) { return; } var data = JsonConvert.DeserializeObject(text, grainState.GetType(), settings); var dict = ((GrainState)data).AsDictionary(); grainState.SetAll(dict); grainState.Etag = blob.Properties.ETag; } catch (Exception ex) { Log.Error(0, ex.ToString()); throw; } }
public async Task ReadStateAsync( string grainType, GrainReference grainId, GrainState grainState ) { try { var blobName = GetBlobName( grainType, grainId ); var blob = container.GetBlockBlobReference( blobName ); var exists = await blob.ExistsAsync(); if( !exists ) { return; } var text = await blob.DownloadTextAsync(); if( string.IsNullOrWhiteSpace( text ) ) { return; } var data = JsonConvert.DeserializeObject( text, grainState.GetType(), settings ); var dict = ( ( GrainState )data ).AsDictionary(); grainState.SetAll( dict ); grainState.Etag = blob.Properties.ETag; } catch( Exception ex ) { Log.Error( 0, ex.ToString() ); } }