public int ADDIndexBlock() { try { FileStreamIdx.Seek(FileStreamIdx.Length, 0); BinaryWriterIdx.Write(IndexBlock); } catch (Exception e) { StringLastError = e.Message; return(-1); } return(1); }
public int CreateIndex(string P_key, string P_value) { // Key Should contain ASCII 32-122 only KeyBytes = ASCIIEncoding.UTF8.GetBytes(P_key); uint RecordPointer = uint.MaxValue, NewRecordPointer = uint.MaxValue, IndexPointer = uint.MaxValue, NewIndexOffset = 0; String LastKey = ""; NewRecordPointer = (uint)LastPosition; /// Start of Next Key IndexOffset = 0; ByteIndex = 0; do { IndexPosition = (uint)(IndexOffset + (KeyBytes[ByteIndex] - 32) * 8); count++; try // Read next Branch (ASCII 32-122) { if (KeyBytes[ByteIndex] < 32 || KeyBytes[ByteIndex] > 122) { return(-52); // Validate Character Range } FileStreamIdx.Seek(IndexPosition, 0); RecordPointer = BinaryReaderIdx.ReadUInt32(); IndexPointer = BinaryReaderIdx.ReadUInt32(); } catch (Exception e) { StringLastError = e.Message; return(-1); } if (IndexPointer == uint.MaxValue) { try { FileStreamIdx.Seek(IndexPosition, 0); BinaryWriterIdx.Write(NewRecordPointer); BinaryWriterIdx.Write(IndexPosition); FileStreamIdx.Flush(); return(1); // Inserted new Branch successfully } catch (Exception e) { StringLastError = e.Message; return(-1); } } else { try { FileStreamData.Seek(RecordPointer, 0); LastKey = BinaryReaderData.ReadString(); LastKeyBytes = ASCIIEncoding.UTF8.GetBytes(LastKey); } catch (Exception e) { StringLastError = e.Message; return(-10); } Difference = GetDif(ref LastKeyBytes, ref KeyBytes); if (Difference == 0) { if (BinaryReaderData.PeekChar() == 0) { return(-3); } else { FileStreamData.Seek(RecordPointer, 0); BinaryWriterData.Write(P_key); BinaryWriterData.Write(false); BinaryWriterData.Write(P_value); BinaryWriterData.Flush(); return(-4); /// if the record flag is deleted, update record. } } else { if (Difference > 0) { if (IndexPointer == IndexPosition) { try { NewIndexOffset = (uint)FileStreamIdx.Length; FileStreamIdx.Seek(IndexPosition + 4, 0); BinaryWriterIdx.Write(NewIndexOffset); ADDIndexBlock(); IndexPosition = (uint)(NewIndexOffset + (KeyBytes[ByteIndex + 1] - 32) * 8); FileStreamIdx.Seek(IndexPosition, 0); BinaryWriterIdx.Write(NewRecordPointer); BinaryWriterIdx.Write(IndexPosition); FileStreamIdx.Flush(); return(1); // Inserted new key successfully } catch (Exception e) { StringLastError = e.Message; return(-16); } } else { IndexOffset = IndexPointer; } } else { if (IndexPointer == IndexPosition) { try { NewIndexOffset = (uint)FileStreamIdx.Length; FileStreamIdx.Seek(IndexPosition, 0); BinaryWriterIdx.Write(NewRecordPointer); BinaryWriterIdx.Write(NewIndexOffset); ADDIndexBlock(); NewRecordPointer = RecordPointer; KeyBytes = ASCIIEncoding.UTF8.GetBytes(LastKey); P_key = LastKey; IndexOffset = NewIndexOffset; IndexPosition = (uint)(NewIndexOffset + (KeyBytes[ByteIndex + 1] - 32) * 8); FileStreamIdx.Seek(IndexPosition, 0); BinaryWriterIdx.Write(NewRecordPointer); BinaryWriterIdx.Write(IndexPosition); FileStreamIdx.Flush(); return(1); // Inserted new key successfully } catch (Exception e) { StringLastError = e.Message; return(-17); } } else { try { FileStreamIdx.Seek(IndexPosition, 0); BinaryWriterIdx.Write(NewRecordPointer); NewRecordPointer = RecordPointer; KeyBytes = ASCIIEncoding.UTF8.GetBytes(LastKey); P_key = LastKey; FileStreamIdx.Flush(); IndexOffset = IndexPointer; } catch (Exception e) { StringLastError = e.Message; return(-18); } } } } } ByteIndex++; } while (ByteIndex < KeyBytes.Length); return(-20); }