Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 81918200CC4 for ; Thu, 29 Jun 2017 07:48:11 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 8034F160C0F; Thu, 29 Jun 2017 05:48:11 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id AD934160BFF for ; Thu, 29 Jun 2017 07:48:10 +0200 (CEST) Received: (qmail 38099 invoked by uid 500); 29 Jun 2017 05:48:09 -0000 Mailing-List: contact commits-help@kylin.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@kylin.apache.org Delivered-To: mailing list commits@kylin.apache.org Received: (qmail 37792 invoked by uid 99); 29 Jun 2017 05:48:09 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 29 Jun 2017 05:48:09 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id A3238E96B8; Thu, 29 Jun 2017 05:48:08 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: liyang@apache.org To: commits@kylin.apache.org Date: Thu, 29 Jun 2017 05:48:14 -0000 Message-Id: <9e57c5092e3a4e26b751a46f21948f01@git.apache.org> In-Reply-To: <5c54acc397574cbba0f56a8055b84d7a@git.apache.org> References: <5c54acc397574cbba0f56a8055b84d7a@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [07/50] kylin git commit: minor, improve odbc performance archived-at: Thu, 29 Jun 2017 05:48:11 -0000 minor, improve odbc performance Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/51f22e28 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/51f22e28 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/51f22e28 Branch: refs/heads/master Commit: 51f22e284467f23c8aeeed8ea79e5133ddd1141e Parents: f32165e Author: lidongsjtu Authored: Thu Jun 15 17:03:20 2017 +0800 Committer: Hongbin Ma Committed: Thu Jun 15 21:17:54 2017 +0800 ---------------------------------------------------------------------- odbc/Common/REST.cpp | 67 +++++++++++++++++++++-------------- odbc/Common/REST.h | 1 + odbc/Driver/KO_DIAG.CPP | 17 ++++----- odbc/Driver/KO_EXEC.CPP | 6 ++-- odbc/TestDLL/SimpleQueryTest.cpp | 6 ++-- 5 files changed, 57 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/51f22e28/odbc/Common/REST.cpp ---------------------------------------------------------------------- diff --git a/odbc/Common/REST.cpp b/odbc/Common/REST.cpp index 858ecd4..8f0c7bb 100644 --- a/odbc/Common/REST.cpp +++ b/odbc/Common/REST.cpp @@ -280,34 +280,28 @@ std::unique_ptr restGetMeta ( char* serverAddr, long port, ch wstring cookQuery ( wchar_t* p ) { - wchar_t* q = new wchar_t[wcslen ( p ) + 1]; - wcscpy ( q, p ); - - for ( int i = 0; i < ( int ) wcslen ( q ); i++ ) - { - if ( q[i] == '\r' || q[i] == '\n' || q[i] == '\t' ) - { - q[i] = ' '; - } - } - - wstring ret ( q ); - delete[] q; - size_t pos = 0; + std::wstringstream wss; - for ( size_t pos = 0;; pos += 2 ) + int l = wcslen ( p ); + for ( int i = 0; i < l; i++ ) { - pos = ret . find ( L"\"", pos ); - - if ( pos == wstring::npos ) + if ( p[i] == L'\r' || p[i] == L'\n' || p[i] == L'\t' ) { - break; - } - - ret . insert ( pos, L"\\" ); + wss << L' '; + } + + else if (p[i] == L'"') + { + wss << L"\\\""; + } + + else + { + wss << p[i]; + } } - return ret; + return wss.str(); } wstring getBodyString ( http_response& response ) @@ -389,10 +383,15 @@ std::unique_ptr convertToSQLResponse ( int statusFlag, wstring requestQuery ( wchar_t* rawSql, char* serverAddr, long port, char* username, char* passwd, char* project, + bool isPrepare, int* statusFlag) { //using local cache to intercept probing queries - const wchar_t* cachedQueryRes = loadCache ( rawSql ); + const wchar_t* cachedQueryRes = NULL; + + if (isPrepare) { + cachedQueryRes = loadCache ( rawSql ); + } if ( cachedQueryRes != NULL ) { @@ -404,8 +403,24 @@ wstring requestQuery ( wchar_t* rawSql, char* serverAddr, long port, char* usern wstring serverAddrW = completeServerStr ( serverAddr, port ); http_client_config config; config . set_timeout ( utility::seconds ( 36000 ) ); + + //uncomment these lines for debug with proxy + //wstring p = L"http://127.0.0.1:8888"; + //config.set_proxy(web_proxy(p)); + http_client session ( serverAddrW, config ); - http_request request = makeRequest ( username, passwd, L"/kylin/api/query", methods::POST ); + http_request request; + + if (!isPrepare) + { + request = makeRequest ( username, passwd, L"/kylin/api/query", methods::POST ); + } + + else + { + request = makeRequest ( username, passwd, L"/kylin/api/query/prestate", methods::POST ); + } + wstring sql = cookQuery ( rawSql ); std::wstringstream wss; wss << L"{ \"acceptPartial\": false, \"project\" : \"" << project << L"\", " << " \"sql\" : \"" << sql << L"\" }" ; @@ -444,7 +459,7 @@ wstring requestQuery ( wchar_t* rawSql, char* serverAddr, long port, char* usern wstring ret = getBodyString ( response ); - if (*statusFlag == 1) + if (*statusFlag == 1 && isPrepare) { storeCache(rawSql, ret.c_str()); } http://git-wip-us.apache.org/repos/asf/kylin/blob/51f22e28/odbc/Common/REST.h ---------------------------------------------------------------------- diff --git a/odbc/Common/REST.h b/odbc/Common/REST.h index f70d7d5..60c14a7 100644 --- a/odbc/Common/REST.h +++ b/odbc/Common/REST.h @@ -38,4 +38,5 @@ std::unique_ptr convertToSQLResponse ( int status, wstring requestQuery ( wchar_t* rawSql, char* serverAddr, long port, char* username, char* passwd, char* project, + bool isPrepare, int* statusFlag); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/kylin/blob/51f22e28/odbc/Driver/KO_DIAG.CPP ---------------------------------------------------------------------- diff --git a/odbc/Driver/KO_DIAG.CPP b/odbc/Driver/KO_DIAG.CPP index ac313e7..def819c 100644 --- a/odbc/Driver/KO_DIAG.CPP +++ b/odbc/Driver/KO_DIAG.CPP @@ -644,7 +644,8 @@ RETCODE SQL_API SQLGetDiagRec ( SQLSMALLINT pHandleType, pODBCDiagRow _SQLPutDiagRow ( pODBCDiag pDiag, StrPtr pFunc, StrPtr pState, Long pNativeErrorCode, StrPtr pMsgArgs, va_list pArgs ) { - Char s[4096]; // arbitary and maximum length of message + // to avoid: TST1003: The message for sqlstate '01000' is longer than SQL_MAX_MESSAGE_LENGTH - 1. + Char s[SQL_MAX_MESSAGE_LENGTH - 1]; // arbitary and maximum length of message pODBCDiagRow l; pODBCDiagRow r; @@ -660,7 +661,7 @@ pODBCDiagRow _SQLPutDiagRow ( pODBCDiag pDiag, StrPtr pFunc, StrPtr pState, Long // check if there is some message if ( pMsgArgs ) { - vsprintf ( s + strlen ( s ), pMsgArgs, pArgs ); + vsnprintf ( s + strlen ( s ), SQL_MAX_MESSAGE_LENGTH - 2 - strlen(s), pMsgArgs, pArgs ); } else @@ -1110,13 +1111,13 @@ void _ODBCLogMsg ( LogLevel level, const char* pMsgArgs, ... ) break; } - time_t now = time ( 0 ); - struct tm tstruct; - char buffer[100]; - tstruct = *localtime ( &now ); - strftime ( buffer, 100, "%Y-%m-%d.%X", &tstruct ); + char ts[24]; + SYSTEMTIME sys; + GetLocalTime( &sys ); + sprintf( ts, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds); + _write ( gLogFile, "[", 1 ); - _write ( gLogFile, buffer, strlen ( buffer ) ); + _write ( gLogFile, ts, strlen ( ts ) ); _write ( gLogFile, "]", 1 ); // MSG PARSING http://git-wip-us.apache.org/repos/asf/kylin/blob/51f22e28/odbc/Driver/KO_EXEC.CPP ---------------------------------------------------------------------- diff --git a/odbc/Driver/KO_EXEC.CPP b/odbc/Driver/KO_EXEC.CPP index 514375e..8a8992c 100644 --- a/odbc/Driver/KO_EXEC.CPP +++ b/odbc/Driver/KO_EXEC.CPP @@ -129,7 +129,7 @@ RETCODE SQL_API _SQLExecStmtFromReq ( pODBCStmt pStmt, bool pPrepared ) { try { __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "start to call rest api" ) ); response = requestQuery ( pStmt->Stmt, pStmt->Conn->Server, pStmt->Conn->ServerPort, pStmt->Conn->UserName, pStmt->Conn->Password, - pStmt->Conn->Project, &status ); + pStmt->Conn->Project, pPrepared, &status ); __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "received and uncompressed rest response:" ) ); p = convertToSQLResponse(status, response); __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "parsed to SQLResponse" ) ); @@ -207,7 +207,7 @@ RETCODE SQL_API SQLPrepareW ( SQLHSTMT pStmt, ( ( pODBCStmt ) pStmt )->Prepared = 1; - return _SQLExecStmtFromReq((pODBCStmt)pStmt,1); + return _SQLExecStmtFromReq((pODBCStmt)pStmt, 1); //return SQL_SUCCESS; } @@ -230,7 +230,7 @@ RETCODE SQL_API SQLExecute ( HSTMT pStmt ) { } // excute the request - x = _SQLExecStmtFromReq ( ( pODBCStmt ) pStmt, 1 ); + x = _SQLExecStmtFromReq ( ( pODBCStmt ) pStmt, 0 ); return x; } http://git-wip-us.apache.org/repos/asf/kylin/blob/51f22e28/odbc/TestDLL/SimpleQueryTest.cpp ---------------------------------------------------------------------- diff --git a/odbc/TestDLL/SimpleQueryTest.cpp b/odbc/TestDLL/SimpleQueryTest.cpp index 7f857a9..9705b5e 100644 --- a/odbc/TestDLL/SimpleQueryTest.cpp +++ b/odbc/TestDLL/SimpleQueryTest.cpp @@ -23,7 +23,7 @@ void simpleQueryTest () //Intercept query test { int status; - wstring s = requestQuery ( L"SELECT 1", KServerAddr, KPort, KUserName, KPassword, KDefaultProject, &status ); + wstring s = requestQuery ( L"SELECT 1", KServerAddr, KPort, KUserName, KPassword, KDefaultProject, false, &status ); std::unique_ptr y = convertToSQLResponse(status, s); if ( ( int ) y -> results . size () != 1 ) @@ -34,7 +34,7 @@ void simpleQueryTest () //Ungzipped Query Test { int status; - wstring s = requestQuery ( L"select cal_dt from test_kylin_fact limit 1", KServerAddr, KPort, KUserName, KPassword, KDefaultProject, &status ); + wstring s = requestQuery ( L"select cal_dt from test_kylin_fact limit 1", KServerAddr, KPort, KUserName, KPassword, KDefaultProject, false, &status ); std::unique_ptr y = convertToSQLResponse(status, s); if ( ( int ) y -> results . size () != 1 ) @@ -45,7 +45,7 @@ void simpleQueryTest () //zipped Query Test { int status; - wstring s = requestQuery ( L"select * from test_kylin_fact limit 12", KServerAddr, KPort, KUserName, KPassword, KDefaultProject, &status ); + wstring s = requestQuery ( L"select * from test_kylin_fact limit 12", KServerAddr, KPort, KUserName, KPassword, KDefaultProject, false, &status ); std::unique_ptr y = convertToSQLResponse(status, s); if ( ( int ) y -> results . size () != 12 )