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

📄 partition.c

📁 linux 下用c++ 开发的一个小型数据库系统
💻 C
字号:
#include <sys/types.h>#include <functional>#include <string.h>#include <iostream>#include <sstream>#include <vector>using namespace std;#include "partition.h"// The Partition class splits a heap file into P partitions, using// a hash function provided by the caller. The hash function must// return an integer in the range 0 to P-1.//// Variable rel is a heap file that has already been opened by the// caller. fileName is the (base) name of the heap file, and will be// used as the base part of the partition file names which are of the// form fileName.p where p is in the range 0 to P-1.//// Returns OK if heap file was split successfully, otherwise an error// code is returned. If OK is returned, variable partName will return// the names of the partition files. The caller can open the partition// files as HeapFiles. The partition files are destroyed by the destructor// of the Partition class.Partition::Partition(HeapFileScan *rel, 		     const string &fileName, 		     const int P,		     const int (*hashfcn)(const Record & record,					  const int P),		     string* &partName, 		     Status &status) :  P(P), partName(NULL){  InsertFileScan **part;  int p;#ifdef DEBUGPART  cerr << "%%  Partitioning " << fileName << "..." << endl;#endif  // create list of partition heap files and file names  if (!(part = new InsertFileScan * [P]) || !(partName = new string[P])) {    status = INSUFMEM;    return;  }  // construct names of partition files (fileName.p where p = 0 to P-1)  // and create heap files on disk  for(p = 0; p < P; p++) {    stringstream  s;    s << "/tmp/" << fileName << '.' << p << ends;    partName[p] = s.str();    if (!(part[p] = new InsertFileScan(partName[p], status))) {      status = INSUFMEM;      return;    }    if (status != OK)      return;  }  this->partName = partName;  // perform a sequential scan on the file to be partitioned, and  // for each record read, get its hash value (using hash function  // provided by the caller) and then insert the record into the  // corresponding partition file  if ((status = rel->startScan(0, sizeof(int), INTEGER, NULL,			       EQ)) != OK)    return;  while(1) {    Record rec;    RID rid;    status = rel->scanNext(rid);    if (status != OK)      break;    if ((status = rel->getRecord(rec)) != OK)      return;    p = hashfcn(rec, P);    if ((status = part[p]->insertRecord(rec, rid)) != OK)      return;  }  if (status != OK && status != FILEEOF)    return;  // close partition files and deallocate memory  for(p = 0; p < P; p++)    delete part[p];  delete part;  if ((status = rel->endScan()) != OK)    return;  status = OK;  return;}// The destructor will destroy the heap files where partitions were stored.Partition::~Partition(){  if (!partName)    return;  for(int p = 0; p < P; p++) {    if (db.destroyFile(partName[p]) != OK)      cerr << "error destroying " << partName[p] << endl;  }  delete partName;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -