コード例 #1
0
        public void ReadRecord(int Position, object Tag, OnReadHandler CB)
        {
            DataBlock d = new DataBlock(this, Position, new DataBlock.OnReadHandler(ReadDataBlockSink), new object[3] {
                CB, "", Tag
            });

            PendingReadTable[d] = d;
        }
コード例 #2
0
        internal DataBlock(FileHashDB READER_sender, int offset, OnReadHandler rCB, object Tag)
        {
            OnRead += rCB;
            _Tag    = Tag;
            CB      = new AsyncCallback(ReadBlockSink);
            f       = READER_sender;

            f.SeekLock.WaitOne();
            f.fstream.Seek((long)offset, SeekOrigin.Begin);
            f.fstream.BeginRead(buffer, 0, 512, CB, offset);
            f.SeekLock.ReleaseMutex();
        }
コード例 #3
0
        internal DataBlock(FileHashDB READER_sender, int offset, OnReadHandler rCB, object Tag)
        {
            OnRead += rCB;
            _Tag = Tag;
            CB = new AsyncCallback(ReadBlockSink);
            f = READER_sender;

            f.SeekLock.WaitOne();
            f.fstream.Seek((long)offset,SeekOrigin.Begin);
            f.fstream.BeginRead(buffer,0,512,CB,offset);
            f.SeekLock.ReleaseMutex();
        }
コード例 #4
0
        private void ReadDataBlockSink(DataBlock sender, string key, byte[] ReadBuffer, object Tag)
        {
            PendingReadTable.Remove(sender);
            object[]      State = (object[])Tag;
            OnReadHandler CB    = (OnReadHandler)State[0];
            string        KEY   = (string)State[1];
            object        _Tag  = State[2];

            if (CB != null)
            {
                CB(this, KEY, ReadBuffer, _Tag);
            }
        }
コード例 #5
0
        public FileHashDB(string FullFilePath, short _BlockSize, OnReadyHandler rCB)
        {
            Map          = new Hashtable();
            ObjectReadCB = new OnReadHandler(ReadObjectSink);
            OnReady     += rCB;
            MaxBlockSize = _BlockSize;
            fstream      = new FileStream(FullFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
            DBFileInfo   = new FileInfo(FullFilePath);
            DeleteBuffer = new byte[MaxBlockSize];
            DeleteCB     = new AsyncCallback(DeleteSink);
            ClearCB      = new AsyncCallback(ClearSink);
            MemoryStream ms = new MemoryStream();

            byte[] x = BitConverter.GetBytes((short)0);
            ms.Write(x, 0, x.Length);
            ms.Write(x, 0, x.Length);
            ClearBlock = ms.ToArray();
            ms.Close();

            if (fstream.Length > 0)
            {
                // Already Exists
                SeekLock.WaitOne();
                fstream.Seek(0, SeekOrigin.Begin);
                fstream.BeginRead(InitBuffer, 0, 10, new AsyncCallback(InitSink), null);
                SeekLock.ReleaseMutex();
            }
            else
            {
                IndexFilePath = DBFileInfo.FullName.Substring(0, DBFileInfo.FullName.Length - DBFileInfo.Extension.Length) + ".idx";

                // Initialize File Header
                byte[] BlockSize = BitConverter.GetBytes((short)MaxBlockSize);
                byte[] bUpdateID = BitConverter.GetBytes(UpdateID);
                byte[] eVersion  = BitConverter.GetBytes(EngineVersion);
                SeekLock.WaitOne();
                fstream.Seek(0, SeekOrigin.Begin);
                InitializeCounter = 3;
                fstream.BeginWrite(BlockSize, 0, 2, new AsyncCallback(InitHeaderSink), null);
                fstream.BeginWrite(bUpdateID, 0, 4, new AsyncCallback(InitHeaderSink), null);
                fstream.BeginWrite(eVersion, 0, 4, new AsyncCallback(InitHeaderSink), null);
                SeekLock.ReleaseMutex();
                if (Interlocked.Decrement(ref InitializeCounter) == 0)
                {
                    if (OnReady != null)
                    {
                        OnReady(this, null);
                    }
                }
            }
        }
コード例 #6
0
        public void ReadRecord(string KEY, object Tag, OnReadHandler CB)
        {
            object kobj = Map[KEY];

            if (kobj == null)
            {
                if (CB != null)
                {
                    CB(this, KEY, new byte[0], Tag);
                }
                return;
            }
            else
            {
                int       i = (int)kobj;
                DataBlock d = new DataBlock(this, i, new DataBlock.OnReadHandler(ReadDataBlockSink), new object[3] {
                    CB, KEY, Tag
                });
                PendingReadTable[d] = d;
            }
        }
コード例 #7
0
        public FileHashDB(short _BlockSize, bool KEYS)
        {
            if(KEYS) Map = new Hashtable();
            ObjectReadCB = new OnReadHandler(ReadObjectSink);
            string FullFilePath = Guid.NewGuid().ToString();
            tfc = new TempFileCollection();
            tfc.AddFile(FullFilePath,false);

            MaxBlockSize = _BlockSize;
            fstream = new FileStream(FullFilePath,FileMode.Create,FileAccess.ReadWrite,FileShare.Read);
            DBFileInfo = new FileInfo(FullFilePath);
            DeleteBuffer = new byte[MaxBlockSize];
            DeleteCB = new AsyncCallback(DeleteSink);
            ClearCB = new AsyncCallback(ClearSink);
            MemoryStream ms = new MemoryStream();
            byte[] x = BitConverter.GetBytes((short)0);
            ms.Write(x,0,x.Length);
            ms.Write(x,0,x.Length);
            ClearBlock = ms.ToArray();
            ms.Close();

            IndexFilePath = DBFileInfo.FullName.Substring(0,DBFileInfo.FullName.Length-DBFileInfo.Extension.Length) + ".idx";
            tfc.AddFile(IndexFilePath,false);

            // Initialize File Header
            byte[] BlockSize = BitConverter.GetBytes((short)MaxBlockSize);
            byte[] bUpdateID = BitConverter.GetBytes(UpdateID);
            byte[] eVersion = BitConverter.GetBytes(EngineVersion);
            SeekLock.WaitOne();
            fstream.Seek(0,SeekOrigin.Begin);
            InitializeCounter = 3;
            fstream.BeginWrite(BlockSize,0,2,new AsyncCallback(InitHeaderSink),null);
            fstream.BeginWrite(bUpdateID,0,4,new AsyncCallback(InitHeaderSink),null);
            fstream.BeginWrite(eVersion,0,4,new AsyncCallback(InitHeaderSink),null);
            SeekLock.ReleaseMutex();
            if(Interlocked.Decrement(ref InitializeCounter)==0)
            {
                if(OnReady!=null) OnReady(this,null);
            }
        }
コード例 #8
0
 public void ReadRecord(string KEY, object Tag, OnReadHandler CB)
 {
     object kobj = Map[KEY];
     if(kobj==null)
     {
         if(CB!=null) CB(this,KEY,new byte[0],Tag);
         return;
     }
     else
     {
         int i = (int)kobj;
         DataBlock d = new DataBlock(this,i,new DataBlock.OnReadHandler(ReadDataBlockSink),new object[3]{CB,KEY,Tag});
         PendingReadTable[d] = d;
     }
 }
コード例 #9
0
 public void ReadRecord(int Position, object Tag, OnReadHandler CB)
 {
     DataBlock d = new DataBlock(this,Position,new DataBlock.OnReadHandler(ReadDataBlockSink),new object[3]{CB,"",Tag});
     PendingReadTable[d] = d;
 }
コード例 #10
0
 public void RegisterReadSubscriber(OnReadHandler subscriber)
 {
     player.OnRead += subscriber;
 }