⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gistfile.cpp

📁 此文件包含了在linux下实现tpr-tree索引的源代码
💻 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 + -