Example #1
0
 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();
              }
              }
        }
Example #3
0
 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);
   }
 }
Example #10
0
    /// <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;
        }

    }