| 1 | #include "duckdb/storage/magic_bytes.hpp" |
|---|---|
| 2 | #include "duckdb/common/local_file_system.hpp" |
| 3 | #include "duckdb/storage/storage_info.hpp" |
| 4 | |
| 5 | namespace duckdb { |
| 6 | |
| 7 | DataFileType MagicBytes::CheckMagicBytes(FileSystem *fs_p, const string &path) { |
| 8 | LocalFileSystem lfs; |
| 9 | FileSystem &fs = fs_p ? *fs_p : lfs; |
| 10 | if (!fs.FileExists(filename: path)) { |
| 11 | return DataFileType::FILE_DOES_NOT_EXIST; |
| 12 | } |
| 13 | auto handle = fs.OpenFile(path, flags: FileFlags::FILE_FLAGS_READ); |
| 14 | |
| 15 | constexpr const idx_t MAGIC_BYTES_READ_SIZE = 16; |
| 16 | char buffer[MAGIC_BYTES_READ_SIZE]; |
| 17 | |
| 18 | handle->Read(buffer, nr_bytes: MAGIC_BYTES_READ_SIZE); |
| 19 | if (memcmp(s1: buffer, s2: "SQLite format 3\0", n: 16) == 0) { |
| 20 | return DataFileType::SQLITE_FILE; |
| 21 | } |
| 22 | if (memcmp(s1: buffer, s2: "PAR1", n: 4) == 0) { |
| 23 | return DataFileType::PARQUET_FILE; |
| 24 | } |
| 25 | if (memcmp(s1: buffer + MainHeader::MAGIC_BYTE_OFFSET, s2: MainHeader::MAGIC_BYTES, n: MainHeader::MAGIC_BYTE_SIZE) == 0) { |
| 26 | return DataFileType::DUCKDB_FILE; |
| 27 | } |
| 28 | return DataFileType::FILE_DOES_NOT_EXIST; |
| 29 | } |
| 30 | |
| 31 | } // namespace duckdb |
| 32 |