public async Task SetCurrentId(long newId) { if (newId <= 0) { throw new ArgumentException("newId must be greater than 0", "newId"); } var limitBytes = Encoding.UTF8.GetBytes(newId.ToString(CultureInfo.InvariantCulture)); var ct = CancellationToken.None; await _store.SaveData(_location, null, null, async (s) => { await s.WriteAsync(limitBytes, 0, limitBytes.Length, ct); return(limitBytes.Length); }, ct); // This will force a refresh on the Next _upperIdLimit = 0; }
public async Task <Metadata> SaveData(StoreLocation location, Metadata mdata, UpdateAuditInfo audit, Func <IWriteAsyncStream, Task> savingFunc, CancellationToken token, IEncryptor encryptor = null, SecureStoreOptions options = SecureStoreOptions.All) { LeoTrace.WriteLine("Saving: " + location.Container + ", " + location.BasePath + ", " + (location.Id.HasValue ? location.Id.Value.ToString() : "null")); var metadata = new Metadata(mdata); /**************************************************** * SETUP METADATA * ***************************************************/ if (encryptor != null) { metadata[MetadataConstants.EncryptionMetadataKey] = encryptor.Algorithm; } else { metadata.Remove(MetadataConstants.EncryptionMetadataKey); } if (options.HasFlag(SecureStoreOptions.Compress)) { if (_compressor == null) { throw new ArgumentException("Compression option should not be used if no compressor has been implemented", "options"); } metadata[MetadataConstants.CompressionMetadataKey] = _compressor.Algorithm; } else { metadata.Remove(MetadataConstants.CompressionMetadataKey); } /**************************************************** * PREPARE THE SAVE STREAM * ***************************************************/ var m = await _store.SaveData(location, metadata, audit, async (stream) => { LengthCounterStream counter = null; stream = stream.AddTransformer(s => { // Encrypt just before writing to the stream (if we need) if (encryptor != null) { s = encryptor.Encrypt(s, false); } // Compression comes right before encryption if (options.HasFlag(SecureStoreOptions.Compress)) { s = _compressor.CompressWriteStream(s); } // Always place the length counter stream counter = new LengthCounterStream(s); return(counter); }); await savingFunc(stream); await stream.Complete(token); return(counter.Length); }, token); /**************************************************** * POST SAVE TASKS (BACKUP, INDEX) * ***************************************************/ // The rest of the tasks are done asyncly var tasks = new List <Task>(); if (options.HasFlag(SecureStoreOptions.Backup)) { if (_backupQueue == null) { throw new ArgumentException("Backup option should not be used if no backup queue has been defined", "options"); } tasks.Add(_backupQueue.SendMessage(GetMessageDetails(location, metadata))); } if (options.HasFlag(SecureStoreOptions.Index)) { tasks.Add(ForceIndex(location, mdata)); } if (tasks.Count > 0) { await Task.WhenAll(tasks); } return(m); }