| 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 | 
