public override void Write(ObjectStoreEntry entry) { }
public override void Write(ObjectStoreEntry entry) { using (var ms = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, entry.Value); using (var cnn = getConnection()) using (var cmd = cnn.CreateCommand()) { cmd.CommandText = INSERT_SQL; cmd.Parameters.Add(new SqlParameter() { ParameterName = "@STORE_ID", Value = ComponentDirector.StoreGUID }); cmd.Parameters.Add(new SqlParameter() { ParameterName = "@OBJECT_ID", Value = entry.Key }); cmd.Parameters.Add(new SqlParameter() { ParameterName = "@CONTENT", SqlDbType = SqlDbType.VarBinary, Value = ms.GetBuffer() } ); cmd.ExecuteNonQuery(); } } }
public override void Delete(ObjectStoreEntry entry) { }
public override void Delete(ObjectStoreEntry entry) { using (var cnn = getConnection()) using (var cmd = cnn.CreateCommand()) { cmd.CommandText = DELETE_SQL; cmd.Parameters.Add(new SqlParameter() { ParameterName = "@STORE_ID", Value = ComponentDirector.StoreGUID }); cmd.Parameters.Add(new SqlParameter() { ParameterName = "@OBJECT_ID", Value = entry.Key }); cmd.Parameters.Add(new SqlParameter() { ParameterName = "@PURGE_AFTER_DAYS", Value = m_PurgeAfterDays }); cmd.ExecuteNonQuery(); } }
public override IEnumerable<ObjectStoreEntry> LoadAll() { var now = App.LocalizedTime; using (var cnn = getConnection()) using (var cmd = cnn.CreateCommand()) { cmd.CommandText = SELECT_SQL; cmd.Parameters.Add(new SqlParameter() { ParameterName = "@STORE_ID", Value = ComponentDirector.StoreGUID }); using (var reader = cmd.ExecuteReader()) while (reader.Read()) { if (m_LoadLimit > 0 && m_LoadSize > m_LoadLimit) { WriteLog(MessageType.Info, "Load limit imposed", m_LoadLimit.ToString() + " bytes"); yield break; } Guid oid = (Guid)reader["OBJECT_ID"]; byte[] buf = reader["OBJECT_CONTENT"] as byte[]; BinaryFormatter formatter = new BinaryFormatter(); var entry = new ObjectStoreEntry(); try { entry.Value = formatter.Deserialize(new MemoryStream(buf)); } catch (Exception error) { WriteLog(MessageType.Error, "Deserialization error: " + error.Message, oid.ToString()); continue; } m_LoadSize += buf.Length; entry.Key = oid; entry.LastTime = now; entry.Status = ObjectStoreEntryStatus.Normal; yield return entry; }//while reader.read() } }
// storePath: c:\root // Guid: facaca23423434dada // -> // c:\root\fa\ca\ca23423434dada.faca private string getFileName(ObjectStoreEntry entry) { var key = entry.Key.ToString(); var path = Path.Combine(getStorePath(), key.Substring(0,2), key.Substring(2,2)); if (!Directory.Exists(path)) Directory.CreateDirectory(path); return Path.Combine(path, key.Substring(4)+'.'+key.Substring(0,4));//for better file system tree balancing, first 4 chars moved as extension to the back }
private ObjectStoreEntry readFile(string fname, ISerializer serializer, DateTime now, ref long priorLoadSize, Stopwatch clock) { using (var fs = new FileStream(fname, FileMode.Open))//, FileAccess.Read, FileShare.Read, 64*1024, FileOptions.SequentialScan)) { var entry = new ObjectStoreEntry(); try { entry.Value = serializer.Deserialize(fs); } catch (Exception error) { WriteLog(MessageType.Error, "Deserialization error: " + error.Message, fname, FROM); return null; } Interlocked.Add( ref m_LoadSize, fs.Length); if (m_LoadSize-priorLoadSize > 32*1024*1024) { WriteLog(MessageType.Info, string.Format("Loaded disk bytes {0} in {1}", LoadSize, clock.Elapsed), null, FROM); priorLoadSize = m_LoadSize; } entry.Key = getGUIDFromFileName(fname); entry.LastTime = now; entry.Status = ObjectStoreEntryStatus.Normal; return entry; } }
public override void Delete(ObjectStoreEntry entry) { File.Delete(getFileName(entry)); }
public override void Write(ObjectStoreEntry entry) { using (var fs = new FileStream(getFileName(entry), FileMode.Create)) { m_Serializer.Serialize(fs, entry.Value); } }
/// <summary> /// Puts an object reference "value" into store identified by the "key". /// The object is written in the provider when call count to this method equals to CheckOut() /// </summary> public void CheckIn(Guid key, object value, int msTimeout = 0) { if (Status != ControlStatus.Active) return; if (value==null) { Delete(key); return; } var bucket = getBucket(key); ObjectStoreEntry entry = null; bool isnew = false; lock (bucket) { if (!bucket.TryGetValue(key, out entry)) { isnew = true; entry = new ObjectStoreEntry(); entry.Key = key; entry.Status = ObjectStoreEntryStatus.ChekedIn; entry.LastTime = App.LocalizedTime; entry.MsTimeout = msTimeout; entry.Value = value; bucket.Add(key, entry); } } if (!isnew) lock (entry) { if (entry.Status == ObjectStoreEntryStatus.Deleted) return; if (entry.CheckoutCount>0) entry.CheckoutCount--; if (entry.CheckoutCount==0) entry.Status = ObjectStoreEntryStatus.ChekedIn; entry.LastTime = App.LocalizedTime; entry.MsTimeout = msTimeout; entry.Value = value; } }