annotate spp/src/BamIndex.cpp @ 15:e689b83b0257 draft

Uploaded
author zzhou
date Tue, 27 Nov 2012 16:15:21 -0500
parents ce08b0efa3fd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
1 // ***************************************************************************
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
2 // BamIndex.cpp (c) 2009 Derek Barnett
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
3 // Marth Lab, Department of Biology, Boston College
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
4 // All rights reserved.
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
5 // ---------------------------------------------------------------------------
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
6 // Last modified: 22 November 2010 (DB)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
7 // ---------------------------------------------------------------------------
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
8 // Provides index functionality - both for the default (standardized) BAM
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
9 // index format (.bai) as well as a BamTools-specific (nonstandard) index
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
10 // format (.bti).
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
11 // ***************************************************************************
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
12
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
13 #include <BamIndex.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
14 #include <BamReader.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
15 #include <BGZF.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
16 #include <BamStandardIndex_p.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
17 #include <BamToolsIndex_p.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
18 using namespace BamTools;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
19 using namespace BamTools::Internal;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
20
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
21 #include <cstdio>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
22 #include <cstdlib>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
23 #include <algorithm>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
24 #include <iostream>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
25 #include <map>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
26 using namespace std;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
27
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
28 // --------------------------------------------------
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
29 // BamIndex factory methods
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
30
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
31 // returns index based on BAM filename 'stub'
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
32 // checks first for preferred type, returns that type if found
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
33 // (if not found, attmempts to load other type(s), returns 0 if NONE found)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
34 //
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
35 // ** default preferred type is BamToolsIndex ** use this anytime it exists
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
36 BamIndex* BamIndex::FromBamFilename(const std::string& bamFilename,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
37 BamTools::BgzfData* bgzf,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
38 BamTools::BamReader* reader,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
39 const BamIndex::PreferredIndexType& type)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
40 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
41 // ---------------------------------------------------
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
42 // attempt to load preferred type first
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
43
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
44 const std::string bamtoolsIndexFilename = bamFilename + ".bti";
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
45 const bool bamtoolsIndexExists = BamTools::FileExists(bamtoolsIndexFilename);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
46 if ( (type == BamIndex::BAMTOOLS) && bamtoolsIndexExists )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
47 return new BamToolsIndex(bgzf, reader);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
48
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
49 const std::string standardIndexFilename = bamFilename + ".bai";
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
50 const bool standardIndexExists = BamTools::FileExists(standardIndexFilename);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
51 if ( (type == BamIndex::STANDARD) && standardIndexExists )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
52 return new BamStandardIndex(bgzf, reader);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
53
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
54 // ----------------------------------------------------
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
55 // preferred type could not be found, try other (non-preferred) types
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
56 // if none found, return 0
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
57
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
58 if ( bamtoolsIndexExists ) return new BamToolsIndex(bgzf, reader);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
59 if ( standardIndexExists ) return new BamStandardIndex(bgzf, reader);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
60 return 0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
61 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
62
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
63 // returns index based on explicitly named index file (or 0 if not found)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
64 BamIndex* BamIndex::FromIndexFilename(const std::string& indexFilename,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
65 BamTools::BgzfData* bgzf,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
66 BamTools::BamReader* reader)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
67 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
68 // see if specified file exists
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
69 const bool indexExists = BamTools::FileExists(indexFilename);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
70 if ( !indexExists ) return 0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
71
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
72 const std::string bamtoolsIndexExtension(".bti");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
73 const std::string standardIndexExtension(".bai");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
74
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
75 // if has bamtoolsIndexExtension
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
76 if ( indexFilename.find(bamtoolsIndexExtension) == (indexFilename.length() - bamtoolsIndexExtension.length()) )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
77 return new BamToolsIndex(bgzf, reader);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
78
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
79 // if has standardIndexExtension
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
80 if ( indexFilename.find(standardIndexExtension) == (indexFilename.length() - standardIndexExtension.length()) )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
81 return new BamStandardIndex(bgzf, reader);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
82
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
83 // otherwise, unsupported file type
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
84 return 0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
85 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
86
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
87 // -------------------------------
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
88 // BamIndex implementation
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
89
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
90 // ctor
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
91 BamIndex::BamIndex(BamTools::BgzfData* bgzf, BamTools::BamReader* reader)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
92 : m_BGZF(bgzf)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
93 , m_reader(reader)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
94 , m_cacheMode(BamIndex::LimitedIndexCaching)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
95 , m_indexStream(0)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
96 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
97 if ( m_reader && m_reader->IsOpen() )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
98 m_references = m_reader->GetReferenceData();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
99 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
100
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
101 // dtor
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
102 BamIndex::~BamIndex(void) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
103 if ( IsOpen() )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
104 fclose(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
105 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
106
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
107 // return true if FILE* is open
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
108 bool BamIndex::IsOpen(void) const {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
109 return ( m_indexStream != 0 );
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
110 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
111
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
112 // loads existing data from file into memory
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
113 bool BamIndex::Load(const string& filename) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
114
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
115 // open index file, abort on error
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
116 if ( !OpenIndexFile(filename, "rb") ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
117 fprintf(stderr, "ERROR: Unable to open the BAM index file %s for reading.\n", filename.c_str());
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
118 return false;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
119 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
120
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
121 // check magic number
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
122 if ( !LoadHeader() ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
123 fclose(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
124 return false;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
125 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
126
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
127 // load reference data (but only keep in memory if full caching requested)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
128 bool saveInitialLoad = ( m_cacheMode == BamIndex::FullIndexCaching );
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
129 if ( !LoadAllReferences(saveInitialLoad) ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
130 fclose(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
131 return false;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
132 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
133
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
134 // update index cache based on selected mode
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
135 UpdateCache();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
136
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
137 // return success
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
138 return true;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
139 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
140
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
141 // opens index file for reading/writing, return true if opened OK
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
142 bool BamIndex::OpenIndexFile(const string& filename, const string& mode) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
143 m_indexStream = fopen(filename.c_str(), mode.c_str());
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
144 return ( m_indexStream != 0 );
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
145 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
146
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
147 // rewind index file to beginning of index data, return true if rewound OK
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
148 bool BamIndex::Rewind(void) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
149 return ( fseek64(m_indexStream, DataBeginOffset(), SEEK_SET) == 0 );
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
150 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
151
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
152 // change the index caching behavior
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
153 void BamIndex::SetCacheMode(const BamIndexCacheMode mode) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
154 if ( mode != m_cacheMode ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
155 m_cacheMode = mode;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
156 UpdateCache();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
157 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
158 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
159
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
160 // updates in-memory cache of index data, depending on current cache mode
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
161 void BamIndex::UpdateCache(void) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
162
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
163 // skip if file not open
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
164 if ( !IsOpen() ) return;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
165
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
166 // reflect requested cache mode behavior
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
167 switch ( m_cacheMode ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
168
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
169 case (BamIndex::FullIndexCaching) :
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
170 Rewind();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
171 LoadAllReferences(true);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
172 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
173
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
174 case (BamIndex::LimitedIndexCaching) :
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
175 if ( HasFullDataCache() )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
176 KeepOnlyFirstReferenceOffsets();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
177 else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
178 ClearAllData();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
179 SkipToFirstReference();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
180 LoadFirstReference(true);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
181 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
182 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
183 case(BamIndex::NoIndexCaching) :
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
184 ClearAllData();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
185 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
186 default :
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
187 // unreachable
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
188 ;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
189 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
190 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
191
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
192 // writes in-memory index data out to file
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
193 bool BamIndex::Write(const string& bamFilename) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
194
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
195 // open index file for writing
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
196 string indexFilename = bamFilename + Extension();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
197 if ( !OpenIndexFile(indexFilename, "wb") ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
198 fprintf(stderr, "ERROR: Could not open file to save index.\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
199 return false;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
200 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
201
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
202 // write index header data
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
203 if ( !WriteHeader() ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
204 fprintf(stderr, "ERROR: There was a problem writing index metadata to new index file.\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
205 fflush(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
206 fclose(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
207 exit(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
208 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
209
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
210 // write main index data
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
211 if ( !WriteAllReferences() ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
212 fprintf(stderr, "ERROR: There was a problem writing index data to new index file.\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
213 fflush(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
214 fclose(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
215 exit(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
216 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
217
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
218 // flush any remaining output, rewind file, and return success
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
219 fflush(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
220 fclose(m_indexStream);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
221
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
222 // re-open index file for later reading
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
223 if ( !OpenIndexFile(indexFilename, "rb") ) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
224 fprintf(stderr, "ERROR: Could not open newly created index file for reading.\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
225 return false;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
226 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
227
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
228 // return success/failure of write
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
229 return true;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
230 }