74505 {
74506 struct StringPattern {
74507 StringPattern(string pattern_p, FileNameSegmentType type) : pattern(std::move(pattern_p)), type(type) {
74508 }
74509
74510 string pattern;
74511 FileNameSegmentType type;
74512 };
74513 vector<StringPattern> patterns;
74514 patterns.emplace_back("{i}", FileNameSegmentType::OFFSET);
74515 patterns.emplace_back("{uuid}", FileNameSegmentType::UUID_V4);
74516 patterns.emplace_back("{uuidv4}", FileNameSegmentType::UUID_V4);
74517 patterns.emplace_back("{uuidv7}", FileNameSegmentType::UUID_V7);
74518
74519 idx_t current_pos = 0;
74520 segments.clear();
74521 for (idx_t i = 0; i < pattern.size(); i++) {
74522 if (pattern[i] != '{') {
74523 continue;
74524 }
74525
74526 idx_t remaining_length = pattern.size() - i;
74527 for (auto &pat : patterns) {
74528 if (remaining_length <
pat.pattern.size()) {
74529
74530 continue;
74531 }
74532 if (memcmp(
pat.pattern.c_str(), pattern.c_str() + i,
pat.pattern.size()) != 0) {
74533
74534 continue;
74535 }
74536
74537 if (i > current_pos) {
74538
74539 segments.emplace_back(pattern.substr(current_pos, i - current_pos));
74540 }
74541
74542 segments.emplace_back(
pat.type);
74543
74544
74545 i +=
pat.pattern.size() - 1;
74546 current_pos = i + 1;
74547 break;
74548 }
74549 }
74550
74551 if (current_pos < pattern.size()) {
74552 segments.emplace_back(pattern.substr(current_pos));
74553 }
74554 if (segments.size() == 1 && segments[0].type == FileNameSegmentType::LITERAL) {
74555
74556 segments.emplace_back(FileNameSegmentType::OFFSET);
74557 }
74558}