|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace RaptorDB
{
internal class BoolIndex
{
public BoolIndex(string path, string filename)
{
// create file
_filename = filename;
if (_filename.Contains(".") == false) _filename += ".idx";
_path = path;
if (_path.EndsWith(Path.DirectorySeparatorChar.ToString()) == false)
_path += Path.DirectorySeparatorChar.ToString();
if (File.Exists(_path + _filename))
ReadFile();
}
private WAHBitArray _bits = new WAHBitArray();
private string _filename;
private string _path;
private object _lock = new object();
private bool _inMemory = false;
public WAHBitArray GetBits()
{
return _bits.Copy();
}
public void Set(object key, int recnum)
{
_bits.Set(recnum, (bool)key);
}
public void FreeMemory()
{
// free memory
_bits.FreeMemory();
}
public void Shutdown()
{
// shutdown
if (_inMemory == false)
WriteFile();
}
public void SaveIndex()
{
if (_inMemory == false)
WriteFile();
}
public void InPlaceOR(WAHBitArray left)
{
_bits = _bits.Or(left);
}
private void WriteFile()
{
WAHBitArray.TYPE t;
uint[] ints = _bits.GetCompressed(out t);
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
bw.Write((byte)t);// write new format with the data type byte
foreach (var i in ints)
{
bw.Write(i);
}
File.WriteAllBytes(_path + _filename, ms.ToArray());
}
private void ReadFile()
{
byte[] b = File.ReadAllBytes(_path + _filename);
WAHBitArray.TYPE t = WAHBitArray.TYPE.WAH;
int j = 0;
if (b.Length % 4 > 0) // new format with the data type byte
{
t = (WAHBitArray.TYPE)Enum.ToObject(typeof(WAHBitArray.TYPE), b[0]);
j = 1;
}
List<uint> ints = new List<uint>();
for (int i = 0; i < b.Length / 4; i++)
{
ints.Add((uint)Helper.ToInt32(b, (i * 4) + j));
}
_bits = new WAHBitArray(t, ints.ToArray());
}
internal void FixSize(int size)
{
_bits.Length = size;
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Mehdi first started programming when he was 8 on BBC+128k machine in 6512 processor language, after various hardware and software changes he eventually came across .net and c# which he has been using since v1.0.
He is formally educated as a system analyst Industrial engineer, but his programming passion continues.
* Mehdi is the 5th person to get 6 out of 7 Platinum's on Code-Project (13th Jan'12)
* Mehdi is the 3rd person to get 7 out of 7 Platinum's on Code-Project (26th Aug'16)