duckdb 0.2.10-dev333.0 → 0.2.10-dev337.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "duckdb",
3
3
  "main": "./lib/duckdb.js",
4
- "version": "0.2.10-dev333.0",
4
+ "version": "0.2.10-dev337.0",
5
5
  "description": "DuckDB node.js API",
6
6
  "gypfile": true,
7
7
  "dependencies": {
package/src/duckdb.cpp CHANGED
@@ -20327,14 +20327,18 @@ extern "C" WINBASEAPI BOOL WINAPI GetPhysicallyInstalledSystemMemory(PULONGLONG)
20327
20327
  namespace duckdb {
20328
20328
 
20329
20329
  static void AssertValidFileFlags(uint8_t flags) {
20330
- // cannot combine Read and Write flags
20331
- D_ASSERT(!(flags & FileFlags::FILE_FLAGS_READ && flags & FileFlags::FILE_FLAGS_WRITE));
20332
- // cannot combine Read and CREATE/Append flags
20333
- D_ASSERT(!(flags & FileFlags::FILE_FLAGS_READ && flags & FileFlags::FILE_FLAGS_APPEND));
20334
- D_ASSERT(!(flags & FileFlags::FILE_FLAGS_READ && flags & FileFlags::FILE_FLAGS_FILE_CREATE));
20335
- D_ASSERT(!(flags & FileFlags::FILE_FLAGS_READ && flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW));
20330
+ #ifdef DEBUG
20331
+ bool is_read = flags & FileFlags::FILE_FLAGS_READ;
20332
+ bool is_write = flags & FileFlags::FILE_FLAGS_WRITE;
20333
+ // require either READ or WRITE (or both)
20334
+ D_ASSERT(is_read || is_write);
20335
+ // CREATE/Append flags require writing
20336
+ D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_APPEND));
20337
+ D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_FILE_CREATE));
20338
+ D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW));
20336
20339
  // cannot combine CREATE and CREATE_NEW flags
20337
20340
  D_ASSERT(!(flags & FileFlags::FILE_FLAGS_FILE_CREATE && flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW));
20341
+ #endif
20338
20342
  }
20339
20343
 
20340
20344
  #ifndef _WIN32
@@ -20367,6 +20371,31 @@ public:
20367
20371
  int fd;
20368
20372
  };
20369
20373
 
20374
+ static FileType GetFileTypeInternal(int fd) {
20375
+ struct stat s;
20376
+ if (fstat(fd, &s) == -1) {
20377
+ return FileType::FILE_TYPE_INVALID;
20378
+ }
20379
+ switch (s.st_mode & S_IFMT) {
20380
+ case S_IFBLK:
20381
+ return FileType::FILE_TYPE_BLOCKDEV;
20382
+ case S_IFCHR:
20383
+ return FileType::FILE_TYPE_CHARDEV;
20384
+ case S_IFIFO:
20385
+ return FileType::FILE_TYPE_FIFO;
20386
+ case S_IFDIR:
20387
+ return FileType::FILE_TYPE_DIR;
20388
+ case S_IFLNK:
20389
+ return FileType::FILE_TYPE_LINK;
20390
+ case S_IFREG:
20391
+ return FileType::FILE_TYPE_REGULAR;
20392
+ case S_IFSOCK:
20393
+ return FileType::FILE_TYPE_SOCKET;
20394
+ default:
20395
+ return FileType::FILE_TYPE_INVALID;
20396
+ }
20397
+ }
20398
+
20370
20399
  unique_ptr<FileHandle> LocalFileSystem::OpenFile(const string &path, uint8_t flags, FileLockType lock_type,
20371
20400
  FileCompressionType compression, FileOpener *opener) {
20372
20401
  if (compression != FileCompressionType::UNCOMPRESSED) {
@@ -20377,12 +20406,21 @@ unique_ptr<FileHandle> LocalFileSystem::OpenFile(const string &path, uint8_t fla
20377
20406
 
20378
20407
  int open_flags = 0;
20379
20408
  int rc;
20380
- if (flags & FileFlags::FILE_FLAGS_READ) {
20409
+ bool open_read = flags & FileFlags::FILE_FLAGS_READ;
20410
+ bool open_write = flags & FileFlags::FILE_FLAGS_WRITE;
20411
+ if (open_read && open_write) {
20412
+ open_flags = O_RDWR;
20413
+ } else if (open_read) {
20381
20414
  open_flags = O_RDONLY;
20415
+ } else if (open_write) {
20416
+ open_flags = O_WRONLY;
20382
20417
  } else {
20418
+ throw InternalException("READ, WRITE or both should be specified when opening a file");
20419
+ }
20420
+ if (open_write) {
20383
20421
  // need Read or Write
20384
20422
  D_ASSERT(flags & FileFlags::FILE_FLAGS_WRITE);
20385
- open_flags = O_RDWR | O_CLOEXEC;
20423
+ open_flags |= O_CLOEXEC;
20386
20424
  if (flags & FileFlags::FILE_FLAGS_FILE_CREATE) {
20387
20425
  open_flags |= O_CREAT;
20388
20426
  } else if (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW) {
@@ -20418,15 +20456,19 @@ unique_ptr<FileHandle> LocalFileSystem::OpenFile(const string &path, uint8_t fla
20418
20456
  // #endif
20419
20457
  if (lock_type != FileLockType::NO_LOCK) {
20420
20458
  // set lock on file
20421
- struct flock fl;
20422
- memset(&fl, 0, sizeof fl);
20423
- fl.l_type = lock_type == FileLockType::READ_LOCK ? F_RDLCK : F_WRLCK;
20424
- fl.l_whence = SEEK_SET;
20425
- fl.l_start = 0;
20426
- fl.l_len = 0;
20427
- rc = fcntl(fd, F_SETLK, &fl);
20428
- if (rc == -1) {
20429
- throw IOException("Could not set lock on file \"%s\": %s", path, strerror(errno));
20459
+ // but only if it is not an input/output stream
20460
+ auto file_type = GetFileTypeInternal(fd);
20461
+ if (file_type != FileType::FILE_TYPE_FIFO && file_type != FileType::FILE_TYPE_SOCKET) {
20462
+ struct flock fl;
20463
+ memset(&fl, 0, sizeof fl);
20464
+ fl.l_type = lock_type == FileLockType::READ_LOCK ? F_RDLCK : F_WRLCK;
20465
+ fl.l_whence = SEEK_SET;
20466
+ fl.l_start = 0;
20467
+ fl.l_len = 0;
20468
+ rc = fcntl(fd, F_SETLK, &fl);
20469
+ if (rc == -1) {
20470
+ throw IOException("Could not set lock on file \"%s\": %s", path, strerror(errno));
20471
+ }
20430
20472
  }
20431
20473
  }
20432
20474
  return make_unique<UnixFileHandle>(*this, path, fd);
@@ -20512,28 +20554,7 @@ time_t LocalFileSystem::GetLastModifiedTime(FileHandle &handle) {
20512
20554
 
20513
20555
  FileType LocalFileSystem::GetFileType(FileHandle &handle) {
20514
20556
  int fd = ((UnixFileHandle &)handle).fd;
20515
- struct stat s;
20516
- if (fstat(fd, &s) == -1) {
20517
- return FileType::FILE_TYPE_INVALID;
20518
- }
20519
- switch (s.st_mode & S_IFMT) {
20520
- case S_IFBLK:
20521
- return FileType::FILE_TYPE_BLOCKDEV;
20522
- case S_IFCHR:
20523
- return FileType::FILE_TYPE_CHARDEV;
20524
- case S_IFIFO:
20525
- return FileType::FILE_TYPE_FIFO;
20526
- case S_IFDIR:
20527
- return FileType::FILE_TYPE_DIR;
20528
- case S_IFLNK:
20529
- return FileType::FILE_TYPE_LINK;
20530
- case S_IFREG:
20531
- return FileType::FILE_TYPE_REGULAR;
20532
- case S_IFSOCK:
20533
- return FileType::FILE_TYPE_SOCKET;
20534
- default:
20535
- return FileType::FILE_TYPE_INVALID;
20536
- }
20557
+ return GetFileTypeInternal(fd);
20537
20558
  }
20538
20559
 
20539
20560
  void LocalFileSystem::Truncate(FileHandle &handle, int64_t new_size) {
@@ -20736,14 +20757,21 @@ unique_ptr<FileHandle> LocalFileSystem::OpenFile(const string &path, uint8_t fla
20736
20757
  DWORD share_mode;
20737
20758
  DWORD creation_disposition = OPEN_EXISTING;
20738
20759
  DWORD flags_and_attributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED;
20739
- if (flags & FileFlags::FILE_FLAGS_READ) {
20760
+ bool open_read = flags & FileFlags::FILE_FLAGS_READ;
20761
+ bool open_write = flags & FileFlags::FILE_FLAGS_WRITE;
20762
+ if (open_read && open_write) {
20763
+ desired_access = GENERIC_READ | GENERIC_WRITE;
20764
+ share_mode = 0;
20765
+ } else if (open_read) {
20740
20766
  desired_access = GENERIC_READ;
20741
20767
  share_mode = FILE_SHARE_READ;
20742
- } else {
20743
- // need Read or Write
20744
- D_ASSERT(flags & FileFlags::FILE_FLAGS_WRITE);
20745
- desired_access = GENERIC_READ | GENERIC_WRITE;
20768
+ } else if (open_write) {
20769
+ desired_access = GENERIC_WRITE;
20746
20770
  share_mode = 0;
20771
+ } else {
20772
+ throw InternalException("READ, WRITE or both should be specified when opening a file");
20773
+ }
20774
+ if (open_write) {
20747
20775
  if (flags & FileFlags::FILE_FLAGS_FILE_CREATE) {
20748
20776
  creation_disposition = OPEN_ALWAYS;
20749
20777
  } else if (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW) {
@@ -146502,7 +146530,7 @@ SingleFileBlockManager::SingleFileBlockManager(DatabaseInstance &db, string path
146502
146530
  flags = FileFlags::FILE_FLAGS_READ;
146503
146531
  lock = FileLockType::READ_LOCK;
146504
146532
  } else {
146505
- flags = FileFlags::FILE_FLAGS_WRITE;
146533
+ flags = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_READ;
146506
146534
  lock = FileLockType::WRITE_LOCK;
146507
146535
  if (create_new) {
146508
146536
  flags |= FileFlags::FILE_FLAGS_FILE_CREATE;
package/src/duckdb.hpp CHANGED
@@ -10,8 +10,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
10
10
 
11
11
  #pragma once
12
12
  #define DUCKDB_AMALGAMATION 1
13
- #define DUCKDB_SOURCE_ID "0e6969fa8"
14
- #define DUCKDB_VERSION "0.2.10-dev333"
13
+ #define DUCKDB_SOURCE_ID "ee3e405a9"
14
+ #define DUCKDB_VERSION "0.2.10-dev337"
15
15
  //===----------------------------------------------------------------------===//
16
16
  // DuckDB
17
17
  //