@@ -15,13 +15,10 @@ class TJsonDescribe : public TViewerPipeClient {
15
15
using TThis = TJsonDescribe;
16
16
using TBase = TViewerPipeClient;
17
17
using TBase::ReplyAndPassAway;
18
- TAutoPtr <TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19
- TAutoPtr <TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
18
+ TRequestResponse <TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19
+ TRequestResponse <TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
20
20
TAutoPtr<NKikimrViewer::TEvDescribeSchemeInfo> DescribeResult;
21
- TJsonSettings JsonSettings;
22
- ui32 Timeout = 0 ;
23
21
bool ExpandSubElements = true ;
24
- int Requests = 0 ;
25
22
26
23
public:
27
24
TJsonDescribe (IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
@@ -51,38 +48,36 @@ class TJsonDescribe : public TViewerPipeClient {
51
48
if (NeedToRedirect ()) {
52
49
return ;
53
50
}
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" )) {
62
59
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 ());
66
63
} else {
67
64
THolder<TEvTxUserProxy::TEvNavigate> request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
68
- FillParams (request->Record .MutableDescribePath (), params );
65
+ FillParams (request->Record .MutableDescribePath (), Params );
69
66
request->Record .SetUserToken (Event->Get ()->UserToken );
70
- SendRequest (MakeTxProxyID (), request.Release ());
67
+ SchemeShardResult = MakeRequest<TEvSchemeShard::TEvDescribeSchemeResult> (MakeTxProxyID (), request.Release ());
71
68
}
72
- ++Requests;
73
69
74
- if (params .Has (" path" )) {
70
+ if (Params .Has (" path" )) {
75
71
TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request (new NSchemeCache::TSchemeCacheNavigate ());
76
72
NSchemeCache::TSchemeCacheNavigate::TEntry entry;
77
73
entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpList;
78
74
entry.SyncVersion = false ;
79
- entry.Path = SplitPath (params .Get (" path" ));
75
+ entry.Path = SplitPath (Params .Get (" path" ));
80
76
request->ResultSet .emplace_back (entry);
81
- SendRequest (MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (request));
82
- ++Requests;
77
+ CacheResult = MakeRequest<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (request));
83
78
}
84
79
85
- Become (&TThis::StateRequestedDescribe, TDuration::MilliSeconds ( Timeout) , new TEvents::TEvWakeup ());
80
+ Become (&TThis::StateRequestedDescribe, Timeout, new TEvents::TEvWakeup ());
86
81
}
87
82
88
83
STATEFN (StateRequestedDescribe) {
@@ -95,27 +90,13 @@ class TJsonDescribe : public TViewerPipeClient {
95
90
}
96
91
97
92
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 ();
104
95
}
105
96
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 ();
119
100
}
120
101
121
102
void FillDescription (NKikimrSchemeOp::TDirEntry* descr, ui64 schemeShardId) {
@@ -242,10 +223,10 @@ class TJsonDescribe : public TViewerPipeClient {
242
223
}
243
224
244
225
void ReplyAndPassAway () override {
245
- TStringStream json;
246
- if (SchemeShardResult != nullptr && SchemeShardResult-> GetRecord (). GetStatus () == NKikimrScheme::EStatus::StatusSuccess ) {
226
+ NJson::TJsonValue json;
227
+ if (SchemeShardResult. IsOk () ) {
247
228
DescribeResult = GetSchemeShardDescribeSchemeInfo ();
248
- } else if (CacheResult != nullptr ) {
229
+ } else if (CacheResult. IsOk () ) {
249
230
NSchemeCache::TSchemeCacheNavigate *navigate = CacheResult->Request .Get ();
250
231
Y_ABORT_UNLESS (navigate->ResultSet .size () == 1 );
251
232
if (navigate->ErrorCount == 0 ) {
@@ -282,8 +263,7 @@ class TJsonDescribe : public TViewerPipeClient {
282
263
const auto *descriptor = NKikimrScheme::EStatus_descriptor ();
283
264
auto accessDeniedStatus = descriptor->FindValueByNumber (NKikimrScheme::StatusAccessDenied)->name ();
284
265
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" ));
287
267
return ;
288
268
}
289
269
for (auto & child : *DescribeResult->MutablePathDescription ()->MutableChildren ()) {
@@ -294,16 +274,14 @@ class TJsonDescribe : public TViewerPipeClient {
294
274
child.ClearParentPathId ();
295
275
}
296
276
}
297
- TProtoToJson::ProtoToJson (json, *DescribeResult, JsonSettings );
277
+ Proto2Json ( *DescribeResult, json );
298
278
DecodeExternalTableContent (json);
299
- } else {
300
- json << " null" ;
301
279
}
302
280
303
- ReplyAndPassAway (GetHTTPOKJSON (json. Str () ));
281
+ ReplyAndPassAway (GetHTTPOKJSON (json));
304
282
}
305
283
306
- void DecodeExternalTableContent (TStringStream & json) const {
284
+ void DecodeExternalTableContent (NJson::TJsonValue & json) const {
307
285
if (!DescribeResult) {
308
286
return ;
309
287
}
@@ -318,29 +296,21 @@ class TJsonDescribe : public TViewerPipeClient {
318
296
}
319
297
320
298
NExternalSource::IExternalSourceFactory::TPtr externalSourceFactory{NExternalSource::CreateExternalSourceFactory ({}, nullptr , 50000 , nullptr , false , false , NYql::GetAllExternalDataSourceTypes ())};
321
- NJson::TJsonValue root;
322
299
const auto & sourceType = DescribeResult->GetPathDescription ().GetExternalTableDescription ().GetSourceType ();
323
300
try {
324
- NJson::ReadJsonTree (json.Str (), &root);
325
- root[" PathDescription" ][" ExternalTableDescription" ].EraseValue (" Content" );
301
+ json[" PathDescription" ][" ExternalTableDescription" ].EraseValue (" Content" );
326
302
auto source = externalSourceFactory->GetOrCreate (sourceType);
327
303
auto parameters = source->GetParameters (content);
328
304
for (const auto & [key, items]: parameters) {
329
305
NJson::TJsonValue array{NJson::EJsonValueType::JSON_ARRAY};
330
306
for (const auto & item: items) {
331
307
array.AppendValue (item);
332
308
}
333
- root [" PathDescription" ][" ExternalTableDescription" ][" Content" ][key] = array;
309
+ json [" PathDescription" ][" ExternalTableDescription" ][" Content" ][key] = array;
334
310
}
335
311
} catch (...) {
336
312
BLOG_CRIT (" Сan't unpack content for external table: " << sourceType << " , error: " << CurrentExceptionMessage ());
337
313
}
338
- json.Clear ();
339
- json << root;
340
- }
341
-
342
- void HandleTimeout () {
343
- ReplyAndPassAway (GetHTTPGATEWAYTIMEOUT ());
344
314
}
345
315
346
316
static YAML::Node GetSwagger () {
@@ -369,6 +339,7 @@ class TJsonDescribe : public TViewerPipeClient {
369
339
.Name = " enums" ,
370
340
.Description = " convert enums to strings" ,
371
341
.Type = " boolean" ,
342
+ .Default = " false" ,
372
343
});
373
344
yaml.AddParameter ({
374
345
.Name = " ui64" ,
0 commit comments