private void updateMarked(chapterRec rec) { //calc size int estimateSize = rec.marked.Length * 2; resizeTmpBuff(estimateSize); rec.markedLen = (UInt32)Encoding.UTF8.GetBytes(rec.marked, 0, rec.marked.Length, t_buff, 0); UInt32 newSize = 4 + 4 + rec.keyLen + 4 + rec.markedLen; if (rec.size > newSize) { m_file.seekWriteCursor((int)rec.offset + 4 + 4 + (int)rec.keyLen); //hdr + keysize + keylen m_file.writeInt32((int)rec.markedLen); m_file.writeData(t_buff, (int)rec.markedLen); } else { //mark rec as delete m_file.seekWriteCursor((int)rec.offset); UInt32 hdr = (UInt32)(rec.size / c_pageSize) | c_fDeleted; m_file.writeInt32((int)hdr); m_deltedItem.Add(new chapterRec { size = rec.size, offset = rec.offset }); addMarked(rec); } }
private readBdError nextChapter(out chapterRec rec) { rec = new chapterRec(); rec.offset = (UInt32)m_file.readCursor; UInt32 hdr; bool ret = m_file.readData(t_page, (int)c_pageSize); if (!ret) { return(readBdError.eof); } hdr = BitConverter.ToUInt32(t_page, 0); rec.size = (hdr & c_nPageMark) * c_pageSize; if ((rec.size + rec.offset) > m_file.Size) { return(readBdError.dbMalform); } if ((hdr & c_fDeleted) != 0) { rec.isDeleted = true; return(readBdError.deletedRec); } if (rec.size > t_buff.Length) { Array.Resize <byte>(ref t_buff, (int)rec.size); } t_page.CopyTo(t_buff, 0); UInt32 nRead = c_pageSize; for (; nRead < rec.size; nRead += c_pageSize) { ret = m_file.readData(t_page, (int)c_pageSize); Debug.Assert(ret); t_page.CopyTo(t_buff, (int)nRead); } UInt32 iCursor = 4; rec.keyLen = BitConverter.ToUInt32(t_buff, (int)iCursor); iCursor += 4; rec.key = Encoding.UTF8.GetString(t_buff, (int)iCursor, (int)rec.keyLen); iCursor += rec.keyLen; rec.markedLen = BitConverter.ToUInt32(t_buff, (int)iCursor); iCursor += 4; rec.marked = Encoding.UTF8.GetString(t_buff, (int)iCursor, (int)rec.markedLen); return(readBdError.success); }
chapterRec findRec(string key) { chapterRec rec = null; if (m_cache.ContainsKey(key)) { rec = m_cache[key]; } else if (m_dict.ContainsKey(key)) { rec = m_dict[key]; m_cache.Add(key, rec); } return(rec); }
private void addMarked(chapterRec rec) { //estimate req size UInt32 size = 4 + 8 + (UInt32)(rec.key.Length + rec.marked.Length) * 2; size = (size + c_pageSize - 1) & ~(c_pageSize - 1); resizeTmpBuff((int)size); UInt32 offset = 4; rec.keyLen = (UInt32)Encoding.UTF8.GetBytes(rec.key, 0, rec.key.Length, t_buff, (int)offset + 4); BitConverter.GetBytes(rec.keyLen).CopyTo(t_buff, (int)offset); offset += rec.keyLen + 4; rec.markedLen = (UInt32)Encoding.UTF8.GetBytes(rec.marked, 0, rec.marked.Length, t_buff, (int)offset + 4); BitConverter.GetBytes(rec.keyLen).CopyTo(t_buff, (int)offset); size = (rec.markedLen + offset + 4 + c_pageSize - 1) & ~(c_pageSize - 1); BitConverter.GetBytes(size / c_pageSize).CopyTo(t_buff, 0); //find in delete list var reuse = delListFind(size); if (reuse != null) { m_deltedItem.Remove(reuse); rec.offset = reuse.offset; m_file.seekWriteCursor((int)rec.offset); rec.isDeleted = false; m_file.writeData(t_buff, (int)size); rec.size = reuse.size; Debug.Assert(size <= reuse.size); } else { //seek to end of file m_file.seekWriteCursor(-1); rec.offset = (UInt32)m_file.writeCursor; rec.isDeleted = false; m_file.writeData(t_buff, (int)size); rec.size = size; } }
public void getMarked(chapterInfo c) { c.markedIndexs = new List <int>(); string key = c.path; chapterRec rec = findRec(key); if (rec == null) { return; } var arr = rec.marked.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var i in arr) { c.markedIndexs.Add(int.Parse(i)); } }
public void saveMarked(chapterInfo c) { string key = c.path; chapterRec rec = findRec(key); if (rec != null) { rec.marked = string.Join(";", c.markedIndexs); updateMarked(rec); } else { var newrec = new chapterRec() { key = c.path, marked = string.Join(";", c.markedIndexs) }; addMarked(newrec); m_cache.Add(key, newrec); m_dict.Add(key, newrec); } }
readBdError firstChapter(out chapterRec rec) { rec = null; m_file.seekReadCursor(0); return(nextChapter(out rec)); }