Browse Source

php api 'Status' command accept boolean param and returns last query meta in persistent sessions.

git-svn-id: svn://svn.sphinxsearch.com/sphinx/trunk@3844 406a0c4d-033a-0410-8de8-e80135713968
klirichek 13 years ago
parent
commit
11eec14cdc
2 changed files with 21 additions and 9 deletions
  1. 5 3
      api/sphinxapi.php
  2. 16 6
      src/searchd.cpp

+ 5 - 3
api/sphinxapi.php

@@ -33,7 +33,7 @@ define ( "VER_COMMAND_SEARCH",		0x11D );
 define ( "VER_COMMAND_EXCERPT",		0x104 );
 define ( "VER_COMMAND_UPDATE",		0x103 );
 define ( "VER_COMMAND_KEYWORDS",	0x100 );
-define ( "VER_COMMAND_STATUS",		0x100 );
+define ( "VER_COMMAND_STATUS",		0x101 );
 define ( "VER_COMMAND_QUERY",		0x100 );
 define ( "VER_COMMAND_FLUSHATTRS",	0x100 );
 
@@ -1740,8 +1740,10 @@ class SphinxClient
 	// status
 	//////////////////////////////////////////////////////////////////////////
 
-	function Status ()
+	function Status ($session=false)
 	{
+        assert ( is_bool($session) );
+
 		$this->_MBPush ();
 		if (!( $fp = $this->_Connect() ))
 		{
@@ -1749,7 +1751,7 @@ class SphinxClient
 			return false;
 		}
 
-		$req = pack ( "nnNN", SEARCHD_COMMAND_STATUS, VER_COMMAND_STATUS, 4, 1 ); // len=4, body=1
+		$req = pack ( "nnNN", SEARCHD_COMMAND_STATUS, VER_COMMAND_STATUS, 4, $session?0:1 ); // len=4, body=1
 		if ( !( $this->_Send ( $fp, $req, 12 ) ) ||
 			 !( $response = $this->_GetResponse ( $fp, VER_COMMAND_STATUS ) ) )
 		{

+ 16 - 6
src/searchd.cpp

@@ -534,7 +534,7 @@ enum
 	VER_COMMAND_EXCERPT		= 0x104,
 	VER_COMMAND_UPDATE		= 0x103,
 	VER_COMMAND_KEYWORDS	= 0x100,
-	VER_COMMAND_STATUS		= 0x100,
+	VER_COMMAND_STATUS		= 0x101,
 	VER_COMMAND_FLUSHATTRS	= 0x100,
 	VER_COMMAND_SPHINXQL	= 0x100,
 	VER_COMMAND_PING		= 0x100
@@ -10525,7 +10525,7 @@ void SendSearchResponse ( SearchHandler_c & tHandler, InputBuffer_c & tReq, int
 }
 
 
-void HandleCommandSearch ( int iSock, int iVer, InputBuffer_c & tReq )
+void HandleCommandSearch ( int iSock, int iVer, InputBuffer_c & tReq, CSphQueryResultMeta* pMeta )
 {
 	MEMORY ( SPH_MEM_SEARCH_NONSQL );
 
@@ -10569,6 +10569,9 @@ void HandleCommandSearch ( int iSock, int iVer, InputBuffer_c & tReq )
 		iTotalAgentPredictedTime += tHandler.m_dResults[i].m_iAgentPredictedTime;
 	}
 
+	if ( pMeta )
+		*pMeta = tHandler.m_dResults[tHandler.m_dResults.GetLength()-1];
+
 	g_tStatsMutex.Lock();
 	g_pStats->m_iPredictedTime += iTotalPredictedTime;
 	g_pStats->m_iAgentPredictedTime += iTotalAgentPredictedTime;
@@ -13353,7 +13356,7 @@ void BuildMeta ( VectorLike & dStatus, const CSphQueryResultMeta & tMeta )
 }
 
 
-void HandleCommandStatus ( int iSock, int iVer, InputBuffer_c & tReq )
+void HandleCommandStatus ( int iSock, int iVer, InputBuffer_c & tReq, const CSphQueryResultMeta* pMeta )
 {
 	if ( !CheckCommandVersion ( iVer, VER_COMMAND_STATUS, tReq ) )
 		return;
@@ -13364,8 +13367,14 @@ void HandleCommandStatus ( int iSock, int iVer, InputBuffer_c & tReq )
 		return;
 	}
 
+	bool bGlobalStat = tReq.GetDword ();
+
 	VectorLike dStatus;
-	BuildStatus ( dStatus );
+
+	if ( bGlobalStat || !pMeta )
+		BuildStatus ( dStatus );
+	else
+		BuildMeta ( dStatus, *pMeta );
 
 	int iRespLen = 8; // int rows, int cols
 	ARRAY_FOREACH ( i, dStatus )
@@ -13481,6 +13490,7 @@ void HandleClientSphinx ( int iSock, const char * sClientIP, ThdDesc_t * pThd )
 	}
 
 	int iPconnIdle = 0;
+	CSphQueryResultMeta dMyMeta;
 	do
 	{
 		// in "persistent connection" mode, we want interruptible waits
@@ -13588,7 +13598,7 @@ void HandleClientSphinx ( int iSock, const char * sClientIP, ThdDesc_t * pThd )
 		sphLogDebugv ( "conn %s("INT64_FMT"): got command %d, handling", sClientIP, iCID, iCommand );
 		switch ( iCommand )
 		{
-			case SEARCHD_COMMAND_SEARCH:	HandleCommandSearch ( iSock, iCommandVer, tBuf ); break;
+			case SEARCHD_COMMAND_SEARCH:	HandleCommandSearch ( iSock, iCommandVer, tBuf, &dMyMeta ); break;
 			case SEARCHD_COMMAND_EXCERPT:	HandleCommandExcerpt ( iSock, iCommandVer, tBuf ); break;
 			case SEARCHD_COMMAND_KEYWORDS:	HandleCommandKeywords ( iSock, iCommandVer, tBuf ); break;
 			case SEARCHD_COMMAND_UPDATE:	HandleCommandUpdate ( iSock, iCommandVer, tBuf ); break;
@@ -13597,7 +13607,7 @@ void HandleClientSphinx ( int iSock, const char * sClientIP, ThdDesc_t * pThd )
 				iTimeout = 1;
 				sphLogDebugv ( "conn %s("INT64_FMT"): pconn is now %s", sClientIP, iCID, bPersist ? "on" : "off" );
 				break;
-			case SEARCHD_COMMAND_STATUS:	HandleCommandStatus ( iSock, iCommandVer, tBuf ); break;
+			case SEARCHD_COMMAND_STATUS:	HandleCommandStatus ( iSock, iCommandVer, tBuf, &dMyMeta ); break;
 			case SEARCHD_COMMAND_FLUSHATTRS:HandleCommandFlush ( iSock, iCommandVer, tBuf ); break;
 			case SEARCHD_COMMAND_SPHINXQL:	HandleCommandSphinxql ( iSock, iCommandVer, tBuf ); break;
 			case SEARCHD_COMMAND_PING:		HandleCommandPing ( iSock, iCommandVer, tBuf ); break;