11#include < zvec/ailego/buffer/buffer_pool.h>
22#include < zvec/core/framework/index_logger.h>
33
4+ #if defined(_MSC_VER)
5+ static ssize_t zvec_pread (int fd, void *buf, size_t count, size_t offset) {
6+ HANDLE handle = reinterpret_cast <HANDLE>(_get_osfhandle (fd));
7+ if (handle == INVALID_HANDLE_VALUE) return -1 ;
8+ OVERLAPPED ov = {};
9+ ov.Offset = static_cast <DWORD>(offset & 0xFFFFFFFF );
10+ ov.OffsetHigh = static_cast <DWORD>(offset >> 32 );
11+ DWORD bytes_read = 0 ;
12+ if (!ReadFile (handle, buf, static_cast <DWORD>(count), &bytes_read, &ov)) {
13+ return -1 ;
14+ }
15+ return static_cast <ssize_t >(bytes_read);
16+ }
17+ #endif
18+
419namespace zvec {
520namespace ailego {
621
@@ -167,13 +182,23 @@ void LPMap::recycle(moodycamel::ConcurrentQueue<char *> &free_buffers) {
167182}
168183
169184VecBufferPool::VecBufferPool (const std::string &filename) {
185+ #if defined(_MSC_VER)
186+ fd_ = _open (filename.c_str (), O_RDONLY | _O_BINARY);
187+ #else
170188 fd_ = open (filename.c_str (), O_RDONLY);
189+ #endif
171190 if (fd_ < 0 ) {
172191 throw std::runtime_error (" Failed to open file: " + filename);
173192 }
193+ #if defined(_MSC_VER)
194+ struct _stat64 st;
195+ if (_fstat64 (fd_, &st) < 0 ) {
196+ _close (fd_);
197+ #else
174198 struct stat st;
175199 if (fstat (fd_, &st) < 0 ) {
176200 ::close (fd_);
201+ #endif
177202 throw std::runtime_error (" Failed to stat file: " + filename);
178203 }
179204 file_size_ = st.st_size ;
@@ -247,7 +272,11 @@ char *VecBufferPool::acquire_buffer(block_id_t block_id, size_t offset,
247272 }
248273 }
249274
275+ #if defined(_MSC_VER)
276+ ssize_t read_bytes = zvec_pread (fd_, buffer, size, offset);
277+ #else
250278 ssize_t read_bytes = pread (fd_, buffer, size, offset);
279+ #endif
251280 if (read_bytes != static_cast <ssize_t >(size)) {
252281 LOG_ERROR (" Buffer pool failed to read file at offset: %zu" , offset);
253282 free_buffers_.enqueue (buffer);
@@ -257,7 +286,11 @@ char *VecBufferPool::acquire_buffer(block_id_t block_id, size_t offset,
257286}
258287
259288int VecBufferPool::get_meta (size_t offset, size_t length, char *buffer) {
289+ #if defined(_MSC_VER)
290+ ssize_t read_bytes = zvec_pread (fd_, buffer, length, offset);
291+ #else
260292 ssize_t read_bytes = pread (fd_, buffer, length, offset);
293+ #endif
261294 if (read_bytes != static_cast <ssize_t >(length)) {
262295 LOG_ERROR (" Buffer pool failed to read file at offset: %zu" , offset);
263296 return -1 ;
0 commit comments