@@ -899,9 +899,11 @@ static void HttpHandlerIndexPage ( CSphVector<BYTE> & dData )
899
899
class JsonRequestBuilder_c : public RequestBuilder_i
900
900
{
901
901
public:
902
- JsonRequestBuilder_c ( const char * szQuery, CSphString sEndpoint )
903
- : m_sEndpoint ( std::move ( sEndpoint ) )
904
- , m_tQuery ( szQuery )
902
+ JsonRequestBuilder_c ( const char * szQuery, CSphString sEndpoint , const CSphString & sRawQuery , const CSphString & sFullUrl )
903
+ : m_sEndpoint ( std::move ( sEndpoint ) )
904
+ , m_tQuery ( szQuery )
905
+ , m_sRawQuery ( sRawQuery )
906
+ , m_sFullUrl ( sFullUrl )
905
907
{
906
908
// fixme: we can implement replacing indexes in a string (without parsing) if it becomes a performance issue
907
909
}
@@ -917,23 +919,28 @@ class JsonRequestBuilder_c : public RequestBuilder_i
917
919
auto tWr = APIHeader ( tOut, SEARCHD_COMMAND_JSON, VER_COMMAND_JSON ); // API header
918
920
tOut.SendString ( m_sEndpoint.cstr () );
919
921
tOut.SendString ( sRequest .cstr () );
922
+ tOut.SendString ( m_sRawQuery.cstr () );
923
+ tOut.SendString ( m_sFullUrl.cstr () );
920
924
}
921
925
922
926
private:
923
927
CSphString m_sEndpoint;
924
928
mutable JsonObj_c m_tQuery;
929
+ const CSphString & m_sRawQuery;
930
+ const CSphString & m_sFullUrl;
925
931
};
926
932
927
933
928
934
class JsonReplyParser_c : public ReplyParser_i
929
935
{
930
936
public:
931
- JsonReplyParser_c ( int & iAffected, int & iWarnings )
937
+ JsonReplyParser_c ( int & iAffected, int & iWarnings, SearchFailuresLog_c & tFails )
932
938
: m_iAffected ( iAffected )
933
939
, m_iWarnings ( iWarnings )
940
+ , m_tFails ( tFails )
934
941
{}
935
942
936
- bool ParseReply ( MemInputBuffer_c & tReq, AgentConn_t & ) const final
943
+ bool ParseReply ( MemInputBuffer_c & tReq, AgentConn_t & tAgent ) const final
937
944
{
938
945
CSphString sEndpoint = tReq.GetString ();
939
946
EHTTP_ENDPOINT eEndpoint = StrToHttpEndpoint ( sEndpoint );
@@ -945,12 +952,18 @@ class JsonReplyParser_c : public ReplyParser_i
945
952
tReq.GetBytes ( dResult.Begin (), (int )uLength );
946
953
dResult[uLength] = ' \0 ' ;
947
954
948
- return sphGetResultStats ( (const char *)dResult.Begin (), m_iAffected, m_iWarnings, eEndpoint==EHTTP_ENDPOINT::JSON_UPDATE );
955
+ CSphString sError ;
956
+ bool bOk = sphGetResultStats ( (const char *)dResult.Begin (), m_iAffected, m_iWarnings, eEndpoint==EHTTP_ENDPOINT::JSON_UPDATE, sError );
957
+ if ( !sError .IsEmpty () )
958
+ m_tFails.Submit ( tAgent.m_tDesc .m_sIndexes , nullptr , sError .cstr () );
959
+
960
+ return bOk;
949
961
}
950
962
951
963
protected:
952
964
int & m_iAffected;
953
965
int & m_iWarnings;
966
+ SearchFailuresLog_c & m_tFails;
954
967
};
955
968
956
969
std::unique_ptr<QueryParser_i> CreateQueryParser ( bool bJson ) noexcept
@@ -963,17 +976,17 @@ std::unique_ptr<RequestBuilder_i> CreateRequestBuilder ( Str_t sQuery, const Sql
963
976
if ( tStmt.m_bJson )
964
977
{
965
978
assert ( !tStmt.m_sEndpoint .IsEmpty () );
966
- return std::make_unique<JsonRequestBuilder_c> ( sQuery .first , tStmt.m_sEndpoint );
979
+ return std::make_unique<JsonRequestBuilder_c> ( sQuery .first , tStmt.m_sEndpoint , tStmt. m_sRawQuery , tStmt. m_sFullUrl );
967
980
} else
968
981
{
969
982
return std::make_unique<SphinxqlRequestBuilder_c> ( sQuery , tStmt );
970
983
}
971
984
}
972
985
973
- std::unique_ptr<ReplyParser_i> CreateReplyParser ( bool bJson, int & iUpdated, int & iWarnings )
986
+ std::unique_ptr<ReplyParser_i> CreateReplyParser ( bool bJson, int & iUpdated, int & iWarnings, SearchFailuresLog_c & tFails )
974
987
{
975
988
if ( bJson )
976
- return std::make_unique<JsonReplyParser_c> ( iUpdated, iWarnings );
989
+ return std::make_unique<JsonReplyParser_c> ( iUpdated, iWarnings, tFails );
977
990
else
978
991
return std::make_unique<SphinxqlReplyParser_c> ( &iUpdated, &iWarnings );
979
992
}
@@ -1815,15 +1828,28 @@ class HttpJsonUpdateTraits_c
1815
1828
const ResultSetFormat_e m_eFormat = ResultSetFormat_e::MntSearch;
1816
1829
};
1817
1830
1831
+ static void SetQueryOptions ( const OptionsHash_t & hOpts, SqlStmt_t & tStmt )
1832
+ {
1833
+ if ( tStmt.m_eStmt ==STMT_UPDATE || tStmt.m_eStmt ==STMT_DELETE )
1834
+ {
1835
+ const CSphString * pRawQuery = hOpts ( " raw_query" );
1836
+ if ( pRawQuery )
1837
+ tStmt.m_sRawQuery = *pRawQuery;
1838
+ const CSphString * pFullUrl = hOpts ( " full_url" );
1839
+ if ( pFullUrl )
1840
+ tStmt.m_sFullUrl = *pFullUrl;
1841
+ }
1842
+ }
1818
1843
1819
- class HttpHandler_JsonUpdate_c : public HttpHandler_c , HttpJsonUpdateTraits_c
1844
+ class HttpHandler_JsonUpdate_c : public HttpHandler_c , HttpJsonUpdateTraits_c, HttpOptionTrait_t
1820
1845
{
1821
1846
protected:
1822
1847
Str_t m_sQuery;
1823
1848
1824
1849
public:
1825
- explicit HttpHandler_JsonUpdate_c ( Str_t sQuery )
1826
- : m_sQuery ( sQuery )
1850
+ explicit HttpHandler_JsonUpdate_c ( Str_t sQuery , const OptionsHash_t & tOptions )
1851
+ : HttpOptionTrait_t ( tOptions )
1852
+ , m_sQuery ( sQuery )
1827
1853
{}
1828
1854
1829
1855
bool Process () final
@@ -1833,6 +1859,7 @@ class HttpHandler_JsonUpdate_c : public HttpHandler_c, HttpJsonUpdateTraits_c
1833
1859
tStmt.m_bJson = true ;
1834
1860
tStmt.m_tQuery .m_eQueryType = QUERY_JSON;
1835
1861
tStmt.m_sEndpoint = HttpEndpointToStr ( EHTTP_ENDPOINT::JSON_UPDATE );
1862
+ tStmt.m_eStmt = STMT_UPDATE;
1836
1863
1837
1864
DocID_t tDocId = 0 ;
1838
1865
if ( !ParseQuery ( tStmt, tDocId ) )
@@ -1841,6 +1868,8 @@ class HttpHandler_JsonUpdate_c : public HttpHandler_c, HttpJsonUpdateTraits_c
1841
1868
return false ;
1842
1869
}
1843
1870
1871
+ SetQueryOptions ( m_tOptions, tStmt );
1872
+
1844
1873
JsonObj_c tResult = JsonNull;
1845
1874
bool bResult = ProcessQuery ( tStmt, tDocId, tResult );
1846
1875
@@ -1868,14 +1897,15 @@ class HttpHandler_JsonUpdate_c : public HttpHandler_c, HttpJsonUpdateTraits_c
1868
1897
class HttpHandler_JsonDelete_c final : public HttpHandler_JsonUpdate_c
1869
1898
{
1870
1899
public:
1871
- explicit HttpHandler_JsonDelete_c ( Str_t sQuery )
1872
- : HttpHandler_JsonUpdate_c ( sQuery )
1900
+ explicit HttpHandler_JsonDelete_c ( Str_t sQuery , const OptionsHash_t & tOptions )
1901
+ : HttpHandler_JsonUpdate_c ( sQuery , tOptions )
1873
1902
{}
1874
1903
1875
1904
protected:
1876
1905
bool ParseQuery ( SqlStmt_t & tStmt, DocID_t & tDocId ) final
1877
1906
{
1878
1907
tStmt.m_sEndpoint = HttpEndpointToStr ( EHTTP_ENDPOINT::JSON_DELETE );
1908
+ tStmt.m_eStmt = STMT_DELETE;
1879
1909
return sphParseJsonDelete ( m_sQuery, tStmt, tDocId, m_sError );
1880
1910
}
1881
1911
@@ -2090,6 +2120,8 @@ class HttpHandler_JsonBulk_c : public HttpHandler_c, public HttpJsonUpdateTraits
2090
2120
iLastTxStartLine = iCurLine;
2091
2121
}
2092
2122
2123
+ SetQueryOptions ( m_tOptions, tStmt );
2124
+
2093
2125
switch ( tStmt.m_eStmt )
2094
2126
{
2095
2127
case STMT_INSERT:
@@ -2309,14 +2341,14 @@ static std::unique_ptr<HttpHandler_c> CreateHttpHandler ( EHTTP_ENDPOINT eEndpoi
2309
2341
if ( tSource.GetError () )
2310
2342
return nullptr ;
2311
2343
else
2312
- return std::make_unique<HttpHandler_JsonUpdate_c> ( sQuery ); // json
2344
+ return std::make_unique<HttpHandler_JsonUpdate_c> ( sQuery , tOptions ); // json
2313
2345
2314
2346
case EHTTP_ENDPOINT::JSON_DELETE:
2315
2347
SetQuery ( tSource.ReadAll () );
2316
2348
if ( tSource.GetError () )
2317
2349
return nullptr ;
2318
2350
else
2319
- return std::make_unique<HttpHandler_JsonDelete_c> ( sQuery ); // json
2351
+ return std::make_unique<HttpHandler_JsonDelete_c> ( sQuery , tOptions ); // json
2320
2352
2321
2353
case EHTTP_ENDPOINT::JSON_BULK:
2322
2354
return std::make_unique<HttpHandler_JsonBulk_c> ( tSource, tOptions ); // json
@@ -2394,15 +2426,14 @@ HttpProcessResult_t ProcessHttpQuery ( CharStream_c & tSource, Str_t & sSrcQuery
2394
2426
return tRes;
2395
2427
}
2396
2428
2397
- void sphProcessHttpQueryNoResponce ( const CSphString & sEndpoint , const CSphString & sQuery , CSphVector<BYTE> & dResult )
2429
+ void ProcessHttpJsonQuery ( const CSphString & sQuery , OptionsHash_t & hOptions , CSphVector<BYTE> & dResult )
2398
2430
{
2399
- OptionsHash_t hOptions;
2400
- hOptions.Add ( sEndpoint , " endpoint" );
2431
+ http_method eReqType = HTTP_POST;
2401
2432
2402
2433
BlobStream_c tQuery ( sQuery );
2403
2434
Str_t sSrcQuery ;
2404
- HttpProcessResult_t tRes = ProcessHttpQuery ( tQuery, sSrcQuery , hOptions, dResult, false , HTTP_GET );
2405
- ProcessHttpQueryBuddy ( tRes, sSrcQuery , hOptions, dResult, false , HTTP_GET );
2435
+ HttpProcessResult_t tRes = ProcessHttpQuery ( tQuery, sSrcQuery , hOptions, dResult, false , eReqType );
2436
+ ProcessHttpQueryBuddy ( tRes, sSrcQuery , hOptions, dResult, false , eReqType );
2406
2437
}
2407
2438
2408
2439
static bool IsCompressed ( const OptionsHash_t & hOptions )
@@ -3282,6 +3313,8 @@ bool HttpHandlerEsBulk_c::ProcessTnx ( const VecTraits_T<BulkTnx_t> & dTnx, VecT
3282
3313
bool bAction = false ;
3283
3314
JsonObj_c tResult = JsonNull;
3284
3315
3316
+ SetQueryOptions ( m_hOpts, tStmt );
3317
+
3285
3318
switch ( tStmt.m_eStmt )
3286
3319
{
3287
3320
case STMT_INSERT:
0 commit comments