@@ -15,13 +15,10 @@ class TJsonDescribe : public TViewerPipeClient {
1515 using TThis = TJsonDescribe;
1616 using TBase = TViewerPipeClient;
1717 using TBase::ReplyAndPassAway;
18- TAutoPtr <TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19- TAutoPtr <TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
18+ TRequestResponse <TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19+ TRequestResponse <TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
2020 TAutoPtr<NKikimrViewer::TEvDescribeSchemeInfo> DescribeResult;
21- TJsonSettings JsonSettings;
22- ui32 Timeout = 0 ;
2321 bool ExpandSubElements = true ;
24- int Requests = 0 ;
2522
2623public:
2724 TJsonDescribe (IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
@@ -51,38 +48,36 @@ class TJsonDescribe : public TViewerPipeClient {
5148 if (NeedToRedirect ()) {
5249 return ;
5350 }
54- const auto & params (Event-> Get ()-> Request . GetParams ());
55- JsonSettings. EnumAsNumbers = ! FromStringWithDefault<bool >(params .Get (" enums" ), false );
56- JsonSettings. UI64AsString = !FromStringWithDefault< bool >(params. Get ( " ui64 " ), false ) ;
57- Timeout = FromStringWithDefault<ui32>(params. Get ( " timeout " ), 10000 );
58- ExpandSubElements = FromStringWithDefault<ui32>(params. Get ( " subs " ), ExpandSubElements) ;
59- InitConfig (params);
60-
61- if (params .Has (" schemeshard_id" )) {
51+ // for describe we keep old behavior where enums is false by default - for compatibility reasons
52+ if ( FromStringWithDefault<bool >(Params .Get (" enums" ), false )) {
53+ Proto2JsonConfig. EnumMode = TProto2JsonConfig::EnumValueMode::EnumName ;
54+ } else {
55+ Proto2JsonConfig. EnumMode = TProto2JsonConfig::EnumValueMode::EnumNumber ;
56+ }
57+ ExpandSubElements = FromStringWithDefault<ui32>(Params. Get ( " subs " ), ExpandSubElements);
58+ if (Params .Has (" schemeshard_id" )) {
6259 THolder<TEvSchemeShard::TEvDescribeScheme> request = MakeHolder<TEvSchemeShard::TEvDescribeScheme>();
63- FillParams (&request->Record , params );
64- ui64 schemeShardId = FromStringWithDefault<ui64>(params .Get (" schemeshard_id" ));
65- SendRequestToPipe ( ConnectTabletPipe ( schemeShardId) , request.Release ());
60+ FillParams (&request->Record , Params );
61+ ui64 schemeShardId = FromStringWithDefault<ui64>(Params .Get (" schemeshard_id" ));
62+ SchemeShardResult = MakeRequestToTablet<TEvSchemeShard::TEvDescribeSchemeResult>( schemeShardId, request.Release ());
6663 } else {
6764 THolder<TEvTxUserProxy::TEvNavigate> request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
68- FillParams (request->Record .MutableDescribePath (), params );
65+ FillParams (request->Record .MutableDescribePath (), Params );
6966 request->Record .SetUserToken (Event->Get ()->UserToken );
70- SendRequest (MakeTxProxyID (), request.Release ());
67+ SchemeShardResult = MakeRequest<TEvSchemeShard::TEvDescribeSchemeResult> (MakeTxProxyID (), request.Release ());
7168 }
72- ++Requests;
7369
74- if (params .Has (" path" )) {
70+ if (Params .Has (" path" )) {
7571 TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request (new NSchemeCache::TSchemeCacheNavigate ());
7672 NSchemeCache::TSchemeCacheNavigate::TEntry entry;
7773 entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpList;
7874 entry.SyncVersion = false ;
79- entry.Path = SplitPath (params .Get (" path" ));
75+ entry.Path = SplitPath (Params .Get (" path" ));
8076 request->ResultSet .emplace_back (entry);
81- SendRequest (MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (request));
82- ++Requests;
77+ CacheResult = MakeRequest<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (request));
8378 }
8479
85- Become (&TThis::StateRequestedDescribe, TDuration::MilliSeconds ( Timeout) , new TEvents::TEvWakeup ());
80+ Become (&TThis::StateRequestedDescribe, Timeout, new TEvents::TEvWakeup ());
8681 }
8782
8883 STATEFN (StateRequestedDescribe) {
@@ -95,27 +90,13 @@ class TJsonDescribe : public TViewerPipeClient {
9590 }
9691
9792 void Handle (TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev) {
98- SchemeShardResult = ev->Release ();
99- if (SchemeShardResult->GetRecord ().GetStatus () == NKikimrScheme::EStatus::StatusSuccess) {
100- ReplyAndPassAway ();
101- } else {
102- RequestDone (" TEvDescribeSchemeResult" );
103- }
93+ SchemeShardResult.Set (std::move (ev));
94+ RequestDone ();
10495 }
10596
106- void Handle (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev) {
107- CacheResult = ev->Release ();
108- RequestDone (" TEvNavigateKeySetResult" );
109- }
110-
111- void RequestDone (const char * name) {
112- --Requests;
113- if (Requests == 0 ) {
114- ReplyAndPassAway ();
115- }
116- if (Requests < 0 ) {
117- BLOG_CRIT (" Requests < 0 in RequestDone(" << name << " )" );
118- }
97+ void Handle (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
98+ CacheResult.Set (std::move (ev));
99+ RequestDone ();
119100 }
120101
121102 void FillDescription (NKikimrSchemeOp::TDirEntry* descr, ui64 schemeShardId) {
@@ -242,10 +223,10 @@ class TJsonDescribe : public TViewerPipeClient {
242223 }
243224
244225 void ReplyAndPassAway () override {
245- TStringStream json;
246- if (SchemeShardResult != nullptr && SchemeShardResult-> GetRecord (). GetStatus () == NKikimrScheme::EStatus::StatusSuccess ) {
226+ NJson::TJsonValue json;
227+ if (SchemeShardResult. IsOk () ) {
247228 DescribeResult = GetSchemeShardDescribeSchemeInfo ();
248- } else if (CacheResult != nullptr ) {
229+ } else if (CacheResult. IsOk () ) {
249230 NSchemeCache::TSchemeCacheNavigate *navigate = CacheResult->Request .Get ();
250231 Y_ABORT_UNLESS (navigate->ResultSet .size () == 1 );
251232 if (navigate->ErrorCount == 0 ) {
@@ -282,8 +263,7 @@ class TJsonDescribe : public TViewerPipeClient {
282263 const auto *descriptor = NKikimrScheme::EStatus_descriptor ();
283264 auto accessDeniedStatus = descriptor->FindValueByNumber (NKikimrScheme::StatusAccessDenied)->name ();
284265 if (DescribeResult->GetStatus () == accessDeniedStatus) {
285- Send (Event->Sender , new NMon::TEvHttpInfoRes (Viewer->GetHTTPFORBIDDEN (Event->Get ()), 0 , NMon::IEvHttpInfoRes::EContentType::Custom));
286- PassAway ();
266+ ReplyAndPassAway (GetHTTPFORBIDDEN (" text/plain" , " Forbidden" ));
287267 return ;
288268 }
289269 for (auto & child : *DescribeResult->MutablePathDescription ()->MutableChildren ()) {
@@ -294,16 +274,14 @@ class TJsonDescribe : public TViewerPipeClient {
294274 child.ClearParentPathId ();
295275 }
296276 }
297- TProtoToJson::ProtoToJson (json, *DescribeResult, JsonSettings );
277+ Proto2Json ( *DescribeResult, json );
298278 DecodeExternalTableContent (json);
299- } else {
300- json << " null" ;
301279 }
302280
303- ReplyAndPassAway (GetHTTPOKJSON (json. Str () ));
281+ ReplyAndPassAway (GetHTTPOKJSON (json));
304282 }
305283
306- void DecodeExternalTableContent (TStringStream & json) const {
284+ void DecodeExternalTableContent (NJson::TJsonValue & json) const {
307285 if (!DescribeResult) {
308286 return ;
309287 }
@@ -318,29 +296,21 @@ class TJsonDescribe : public TViewerPipeClient {
318296 }
319297
320298 NExternalSource::IExternalSourceFactory::TPtr externalSourceFactory{NExternalSource::CreateExternalSourceFactory ({}, nullptr , 50000 , nullptr , false , false , NYql::GetAllExternalDataSourceTypes ())};
321- NJson::TJsonValue root;
322299 const auto & sourceType = DescribeResult->GetPathDescription ().GetExternalTableDescription ().GetSourceType ();
323300 try {
324- NJson::ReadJsonTree (json.Str (), &root);
325- root[" PathDescription" ][" ExternalTableDescription" ].EraseValue (" Content" );
301+ json[" PathDescription" ][" ExternalTableDescription" ].EraseValue (" Content" );
326302 auto source = externalSourceFactory->GetOrCreate (sourceType);
327303 auto parameters = source->GetParameters (content);
328304 for (const auto & [key, items]: parameters) {
329305 NJson::TJsonValue array{NJson::EJsonValueType::JSON_ARRAY};
330306 for (const auto & item: items) {
331307 array.AppendValue (item);
332308 }
333- root [" PathDescription" ][" ExternalTableDescription" ][" Content" ][key] = array;
309+ json [" PathDescription" ][" ExternalTableDescription" ][" Content" ][key] = array;
334310 }
335311 } catch (...) {
336312 BLOG_CRIT (" Сan't unpack content for external table: " << sourceType << " , error: " << CurrentExceptionMessage ());
337313 }
338- json.Clear ();
339- json << root;
340- }
341-
342- void HandleTimeout () {
343- ReplyAndPassAway (GetHTTPGATEWAYTIMEOUT ());
344314 }
345315
346316 static YAML::Node GetSwagger () {
@@ -369,6 +339,7 @@ class TJsonDescribe : public TViewerPipeClient {
369339 .Name = " enums" ,
370340 .Description = " convert enums to strings" ,
371341 .Type = " boolean" ,
342+ .Default = " false" ,
372343 });
373344 yaml.AddParameter ({
374345 .Name = " ui64" ,
0 commit comments