@@ -471,6 +471,78 @@ CallResultV<protocol::TaskDescriptorPtrs> MetaDB::listTasks(std::vector<std::str
471471 return getValues<protocol::TaskDescriptor>(encodeMetaTaskKey (), MetaKeySpace::Task, corrupted_keys);
472472}
473473
474+ Error MetaDB::saveNamedCollection (
475+ const std::string & name, const protocol::NamedCollectionDescriptor & named_collection, AppliedSequence applied_sn)
476+ {
477+ return mergeKeyValue (
478+ encodeMetaNamedCollectionKey (name),
479+ cluster::serialize<std::string>(named_collection, /* version=*/ 1 ),
480+ applied_sn,
481+ " named_collection" );
482+ }
483+
484+ Error MetaDB::deleteNamedCollection (const std::string & name, AppliedSequence applied_sn)
485+ {
486+ return deleteKey (encodeMetaNamedCollectionKey (name), applied_sn, " named_collection" );
487+ }
488+
489+ Error MetaDB::deleteNamedCollection (const std::string & name)
490+ {
491+ return deleteKey (encodeMetaNamedCollectionKey (name), std::nullopt , " named_collection" );
492+ }
493+
494+ CallResultV<protocol::NamedCollectionDescriptorPtr> MetaDB::getNamedCollection (const std::string & name) const
495+ {
496+ return getValue<protocol::NamedCollectionDescriptor>(encodeMetaNamedCollectionKey (name), MetaKeySpace::NamedCollection);
497+ }
498+
499+ CallResultV<protocol::NamedCollectionDescriptorPtrs> MetaDB::getNamedCollection (const std::string & name, size_t versions_requested) const
500+ {
501+ return getValue<protocol::NamedCollectionDescriptor>(
502+ encodeMetaNamedCollectionKey (name), MetaKeySpace::NamedCollection, versions_requested);
503+ }
504+
505+ CallResultV<std::vector<std::string>> MetaDB::listNamedCollections () const
506+ {
507+ std::string prefix_start = encodeMetaNamedCollectionKey ();
508+ std::string prefix_end = prefix_start;
509+ DB::PrefixTreeEncode::keyPrefixEnd (prefix_end);
510+
511+ rocksdb::Slice prefix_start_slice = prefix_start;
512+ rocksdb::Slice prefix_end_slice = prefix_end;
513+
514+ rocksdb::ReadOptions options;
515+ options.auto_prefix_mode = true ;
516+ options.iterate_upper_bound = &prefix_end_slice;
517+
518+ std::unique_ptr<rocksdb::Iterator> iter{meta_db->NewIterator (options, default_cf_handle)};
519+
520+ CallResultV<std::vector<std::string>> result;
521+
522+ Error last_err;
523+
524+ iter->Seek (prefix_start_slice);
525+ while (iter->Valid ())
526+ {
527+ try
528+ {
529+ result.result .push_back (decodeMetaNamedCollectionKey (iter->key ().ToStringView ()));
530+ }
531+ catch (const Poco::Exception & e)
532+ {
533+ auto text = fmt::format (" Failed to decode value: key={} error={}" , iter->key ().ToStringView (), e.displayText ());
534+ last_err = Error (e.code (), text);
535+ LOG_ERROR (logger, " {}, will skip it" , text);
536+ }
537+ iter->Next ();
538+ }
539+
540+ if (result.result .empty () && last_err.hasError ())
541+ result.err .swap (last_err);
542+
543+ return result;
544+ }
545+
474546Error MetaDB::deleteMaterializedViewAssignment (const cluster::Stream & mv)
475547{
476548 return deleteKey (encodeMetaMaterializedViewAssignmentKey (mv.ns , mv.name ), {}, " MaterializedViewAssignment" );
0 commit comments