ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/GiST/GiSTfile.cpp
Revision: 1.1
Committed: Sun May 6 00:45:51 2001 UTC (23 years, 1 month ago) by root
Branch: MAIN
CVS Tags: HEAD
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 // -*- Mode: C++ -*-
2    
3     // GiSTfile.cpp
4     //
5     // Copyright (c) 1996, Regents of the University of California
6     // $Header: /usr/local/devel/GiST/libGiST/libGiST/GiSTfile.cpp,v 1.1.1.1 1996/08/06 23:47:21 jmh Exp $
7    
8     #include <stdio.h>
9     #include <sys/types.h>
10     #include <sys/stat.h>
11     #include <fcntl.h>
12     #include <string.h>
13     #ifdef UNIX
14     #include <unistd.h>
15     #else
16     #include <io.h>
17     #endif
18    
19     #ifdef UNIX
20     #define O_BINARY 0
21     #endif
22    
23     #include "GiSTfile.h"
24    
25     // The first page in the file has these "magic words"
26     // and the head of the deleted page list.
27     static char magic[]="GiST data file";
28    
29     void
30     GiSTfile::Create(const char *filename)
31     {
32     if(IsOpen()) return;
33     fileHandle=open(filename, O_RDWR|O_BINARY);
34     if(fileHandle>=0) {
35     close(fileHandle);
36     return;
37     }
38     fileHandle=open(filename, O_BINARY|O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE);
39     if(fileHandle<0) return;
40     SetOpen(1);
41    
42     /* Reserve page 0 */
43     char *page=new char[PageSize()];
44    
45     memset(page, 0, PageSize());
46     memcpy(page, magic, sizeof magic);
47     write(fileHandle, page, PageSize());
48     delete page;
49     }
50    
51     void
52     GiSTfile::Open(const char *filename)
53     {
54     char *page;
55    
56     if(IsOpen()) return;
57     fileHandle=open(filename, O_RDWR|O_BINARY);
58     if(fileHandle<0) return;
59     // Verify that the magic words are there
60     page=new char[PageSize()];
61     read(fileHandle, page, PageSize());
62     if(memcmp(page, magic, sizeof(magic))) {
63     close(fileHandle);
64     delete page;
65     return;
66     }
67     delete page;
68     SetOpen(1);
69     }
70    
71     void
72     GiSTfile::Close()
73     {
74     if(!IsOpen()) return;
75     close(fileHandle);
76     SetOpen(0);
77     }
78    
79     void
80     GiSTfile::Read(GiSTpage page, char *buf)
81     {
82     if(IsOpen()) {
83     lseek(fileHandle, page*PageSize(), SEEK_SET);
84     read(fileHandle, buf, PageSize());
85     }
86     }
87    
88     void
89     GiSTfile::Write(GiSTpage page, const char *buf)
90     {
91     if(IsOpen()) {
92     lseek(fileHandle, page*PageSize(), SEEK_SET);
93     write(fileHandle, buf, PageSize());
94     }
95     }
96    
97     GiSTpage
98     GiSTfile::Allocate()
99     {
100     GiSTpage page;
101     char *buf;
102    
103     if(!IsOpen()) return (0);
104     // See if there's a deleted page
105     buf=new char[PageSize()];
106     Read(0, buf);
107     memcpy(&page, buf+sizeof(magic), sizeof(GiSTpage));
108     if(page) {
109     // Reclaim this page
110     Read(page, buf);
111     Write(0, buf);
112     }
113     else {
114     page=lseek(fileHandle, 0, SEEK_END)/PageSize();
115     memset(buf, 0, PageSize());
116     write(fileHandle, buf, PageSize());
117     }
118     delete buf;
119     return page;
120     }
121    
122     void
123     GiSTfile::Deallocate(GiSTpage page)
124     {
125     char *buf;
126     GiSTpage temp;
127    
128     if(!IsOpen()) return;
129     // Get the old head of the list
130     buf=new char[PageSize()];
131     Read(0, buf);
132     memcpy(&temp, buf+sizeof(magic), sizeof(GiSTpage));
133     // Write the new head of the list
134     memcpy(buf+sizeof(magic), &page, sizeof(GiSTpage));
135     Write(0, buf);
136     // In our new head, put link to old head
137     memcpy(buf+sizeof(magic), &temp, sizeof(GiSTpage));
138     Write(page, buf);
139     delete buf;
140     }