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; }
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(); }
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(); }
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); } }
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); } } } }
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; } }
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); } }
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; } }
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; }
public void RegisterReadSubscriber(OnReadHandler subscriber) { player.OnRead += subscriber; }