📄 gistfile.cpp
字号:
//--------------------------------------------------------------------// GiSTfile.cpp// ------------//// GiST - Generalized Search Tree // June 2001 release, Aalborg University// // This file is a revised version of a part of the original // libGiST release (version 0.9beta1) // Copyright (c) 1996, Regents of the University of California//#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#ifdef UNIX#include <unistd.h>#else#include <io.h>#endif#ifdef UNIX#define O_BINARY 0#endif#include "GiSTfile.h"//------------------------------------------------// The first page in the file has these "magic words"// and the head of the deleted page list.//static char magic[] = "GiST data file";//------------------------------------------------voidGiSTfile::Create(const char *filename){ if (IsOpen()) return; fileHandle = open(filename, O_RDWR | O_BINARY); if (fileHandle >= 0) { close(fileHandle); return; }#ifdef UNIX fileHandle = open(filename,O_BINARY | O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE | S_IRGRP | S_IWGRP);#else fileHandle = open(filename,O_BINARY | O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);#endif if (fileHandle < 0) return; SetOpen(1); /* Reserve page 0 */ char *page = new char[PageSize()]; memset(page, 0, PageSize()); memcpy(page, magic, sizeof magic); Write(0, page);// write(fileHandle, page, PageSize()); delete page; maxPage = 1;}//------------------------------------------------voidGiSTfile::Open(const char *filename){ char *page; if (IsOpen()) return; fileHandle = open(filename, O_RDWR | O_BINARY); if (fileHandle < 0) return; SetOpen(1); // Verify that the magic words are there page = new char[PageSize()]; Read(0, page);// read(fileHandle, page, PageSize()); if (memcmp(page, magic, sizeof(magic))) { close(fileHandle); SetOpen(0); delete page; return; } delete page; maxPage = lseek(fileHandle, 0, SEEK_END) / PageSize(); }//------------------------------------------------voidGiSTfile::Close(){ if (!IsOpen()) return; close(fileHandle); SetOpen(0);}//------------------------------------------------voidGiSTfile::Reset(){ if (!IsOpen()) return; char *page = new char[PageSize()]; memset(page, 0, PageSize()); memcpy(page, magic, sizeof magic); Write(0, page); delete page; maxPage = 1;}//------------------------------------------------voidGiSTfile::Read(GiSTpage page, char *buf){ if (IsOpen()) { lseek(fileHandle, page * PageSize(), SEEK_SET); read(fileHandle, buf, PageSize()); }}//------------------------------------------------voidGiSTfile::Write(GiSTpage page, const char *buf){ if (IsOpen()) { lseek(fileHandle, page * PageSize(), SEEK_SET); write(fileHandle, buf, PageSize()); }}//------------------------------------------------GiSTpageGiSTfile::Allocate(){ GiSTpage page; char *buf; if (!IsOpen()) return (0); // See if there's a deleted page buf = new char[PageSize()]; Read(0, buf); memcpy(&page, buf+sizeof(magic), sizeof(GiSTpage)); if (page) { // Reclaim this page Read(page, buf); Write(0, buf); } else { memset(buf, 0, PageSize()); page = maxPage++; Write(page, buf);// page = lseek(fileHandle, 0, SEEK_END) / PageSize();// write(fileHandle, buf, PageSize()); } delete buf; return page;}//------------------------------------------------voidGiSTfile::Deallocate(GiSTpage page){ char *buf; GiSTpage temp; if (!IsOpen()) return; // Get the old head of the list buf = new char[PageSize()]; Read(0, buf); memcpy(&temp, buf+sizeof(magic), sizeof(GiSTpage)); // Write the new head of the list memcpy(buf+sizeof(magic), &page, sizeof(GiSTpage)); Write(0, buf); // In our new head, put link to old head memcpy(buf+sizeof(magic), &temp, sizeof(GiSTpage)); Write(page, buf); delete buf;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -