You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ma...@apache.org on 2015/10/27 04:46:01 UTC

incubator-kylin git commit: KYLIN-596 Support Excel and Power BI

Repository: incubator-kylin
Updated Branches:
  refs/heads/2.x-staging 071c13b3e -> 52a5d9e5f


KYLIN-596 Support Excel and Power BI

Signed-off-by: honma <ho...@ebay.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/52a5d9e5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/52a5d9e5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/52a5d9e5

Branch: refs/heads/2.x-staging
Commit: 52a5d9e5f534144416a0d2843e128bf67dfc404c
Parents: 071c13b
Author: lidongsjtu <li...@126.com>
Authored: Wed Oct 14 14:45:02 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Tue Oct 27 11:45:06 2015 +0800

----------------------------------------------------------------------
 odbc/Common/JsonConverter.cpp              |  11 +-
 odbc/Common/StringUtils.cpp                |  12 ++
 odbc/Common/StringUtils.h                  |   4 +-
 odbc/Driver/GODBC.RC                       |  16 +--
 odbc/Driver/KO_CONN.CPP                    |   2 +-
 odbc/Driver/KO_CTLG.CPP                    |   5 +-
 odbc/Driver/KO_DESC.CPP                    |   5 +-
 odbc/Driver/KO_FETCH.CPP                   | 148 ++++++++++++++++++++----
 odbc/Driver/KO_INFO.CPP                    |  43 +++++--
 odbc/Driver/KO_UTILS.CPP                   |  44 ++++---
 odbc/Driver/driver.DEF                     |   1 +
 odbc/Installer(64bit)/Installer(64bit).isl |   2 +-
 odbc/Installer/Installer.isl               |   2 +-
 odbc/README.md                             |   4 +-
 14 files changed, 228 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Common/JsonConverter.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/JsonConverter.cpp b/odbc/Common/JsonConverter.cpp
index ce3fdfa..3e081ad 100644
--- a/odbc/Common/JsonConverter.cpp
+++ b/odbc/Common/JsonConverter.cpp
@@ -149,19 +149,20 @@ void constructUnflattenResults ( SQLResponse* result, web::json::value& o_result
 
 std::unique_ptr<SQLResponse> SQLResponseFromJSON ( web::json::value & object ) {
     std::unique_ptr<SQLResponse> result ( new SQLResponse() );
-    web::json::value& o_columnMetas = object[U ( "columnMetas" )];
-    web::json::value& o_results = object[U ( "results" )];
+
     result->affectedRowCount = object[U ( "affectedRowCount" )].as_integer();
     result->isException = object[U ( "isException" )].as_bool();
+
     ASSIGN_IF_NOT_NULL ( result->exceptionMessage, object[U ( "exceptionMessage" )], as_string() );
     
-    if ( !o_columnMetas.is_null() ) {
-        for ( auto iter = o_columnMetas.as_array().begin(); iter != o_columnMetas.as_array().end(); ++iter ) {
+	if ( object[U ( "columnMetas" )].is_array()) {
+		web::json::array& columnMetasArray = object[U ( "columnMetas" )].as_array();
+        for ( auto iter = columnMetasArray.begin(); iter != columnMetasArray.end(); ++iter ) {
             result->columnMetas.push_back ( SelectedColumnMetaFromJSON ( *iter ) );
         }
     }
     
-    constructUnflattenResults ( result.get(), o_results );
+    constructUnflattenResults ( result.get(), object[U ( "results" )] );
     return result;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Common/StringUtils.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/StringUtils.cpp b/odbc/Common/StringUtils.cpp
index f31b75b..dd33773 100644
--- a/odbc/Common/StringUtils.cpp
+++ b/odbc/Common/StringUtils.cpp
@@ -179,6 +179,18 @@ std::unique_ptr<char[]> make_unique_str ( int size ) {
     return std::unique_ptr<char[]> ( new char[size + 1] );
 }
 
+void remove_char(char *src, const char tgt)
+{
+    char * fp = src;
+    while (*src) {
+        if (*src != tgt) {
+            *fp = *src;
+            fp++;
+        }
+        src++;
+    }
+    *fp = '\0' ;
+}
 
 
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Common/StringUtils.h
----------------------------------------------------------------------
diff --git a/odbc/Common/StringUtils.h b/odbc/Common/StringUtils.h
index d42796e..5aec343 100644
--- a/odbc/Common/StringUtils.h
+++ b/odbc/Common/StringUtils.h
@@ -41,4 +41,6 @@ void copyTrimmed ( char** dest, char* src );
 std::unique_ptr<char[]> str_base64_encode ( char* raw );
 std::unique_ptr<char[]> str_base64_decode ( char* enc );
 
-std::unique_ptr<char[]> make_unique_str ( int size );
\ No newline at end of file
+std::unique_ptr<char[]> make_unique_str ( int size );
+
+void remove_char(char *src, const char tgt);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/GODBC.RC
----------------------------------------------------------------------
diff --git a/odbc/Driver/GODBC.RC b/odbc/Driver/GODBC.RC
index da9a478..4a14c42 100644
--- a/odbc/Driver/GODBC.RC
+++ b/odbc/Driver/GODBC.RC
@@ -99,15 +99,15 @@ LTEXT           "Server Host", IDC_STATIC, 49, 16, 38, 8
 LTEXT           "Port", IDC_STATIC, 69, 32, 14, 8
 EDITTEXT        IDC_SERVER, 92, 14, 110, 12, ES_AUTOHSCROLL
 EDITTEXT        IDC_PORT, 92, 31, 30, 12, ES_AUTOHSCROLL
+LTEXT           "(only https service permitted)", IDC_STATIC, 93, 45, 90, 8
 LTEXT           "Username", IDC_STATIC, 52, 60, 33, 8
 LTEXT           "Password", IDC_STATIC, 54, 79, 32, 8
 EDITTEXT        IDC_UID, 92, 59, 111, 12, ES_AUTOHSCROLL
 EDITTEXT        IDC_PWD, 92, 76, 111, 13, ES_PASSWORD | ES_AUTOHSCROLL
-DEFPUSHBUTTON   "Done", IDOK, 91, 138, 50, 14, WS_DISABLED
-LTEXT           "(only https service permitted)", IDC_STATIC, 93, 45, 90, 8
-COMBOBOX        IDC_COMBO1, 92, 117, 112, 30, CBS_DROPDOWN | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
 PUSHBUTTON      "Connect", IDC_CONNECT, 91, 95, 111, 14
 LTEXT           "Project", IDC_STATIC, 61, 119, 23, 8
+COMBOBOX        IDC_COMBO1, 92, 117, 112, 30, CBS_DROPDOWN | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
+DEFPUSHBUTTON   "Done", IDOK, 91, 138, 50, 14, WS_DISABLED
 END
 
 IDD_DSN_CFG2 DIALOGEX 0, 0, 263, 204
@@ -116,21 +116,21 @@ CAPTION "Kylin DSN Configuration Dialog"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
 PUSHBUTTON      "Cancel", IDCANCEL, 145, 167, 50, 14
+LTEXT           "&DSN Name", IDC_STATIC, 49, 17, 37, 8
 LTEXT           "Server Host", IDC_STATIC, 48, 35, 38, 8
 LTEXT           "Port", IDC_STATIC, 72, 52, 14, 8
+EDITTEXT        IDC_DSNNAME, 93, 14, 102, 12, ES_AUTOHSCROLL
 EDITTEXT        IDC_SERVER, 93, 33, 102, 12, ES_AUTOHSCROLL
 EDITTEXT        IDC_PORT, 93, 50, 30, 12, ES_AUTOHSCROLL
+LTEXT           "(only https service permitted)", IDC_STATIC, 94, 66, 90, 8
 LTEXT           "Username", IDC_STATIC, 53, 82, 33, 8
 LTEXT           "Password", IDC_STATIC, 55, 102, 32, 8
 EDITTEXT        IDC_UID, 93, 79, 102, 12, ES_AUTOHSCROLL
 EDITTEXT        IDC_PWD, 93, 97, 102, 13, ES_PASSWORD | ES_AUTOHSCROLL
-DEFPUSHBUTTON   "Done", IDOK, 84, 167, 50, 14, WS_DISABLED
-LTEXT           "&DSN Name", IDC_STATIC, 49, 17, 37, 8
-EDITTEXT        IDC_DSNNAME, 93, 14, 102, 12, ES_AUTOHSCROLL
-LTEXT           "(only https service permitted)", IDC_STATIC, 94, 66, 90, 8
-PUSHBUTTON      "Test", IDC_BTEST, 94, 117, 102, 14
+PUSHBUTTON      "Connect", IDC_BTEST, 94, 117, 102, 14
 LTEXT           "Project", IDC_STATIC, 63, 145, 23, 8
 COMBOBOX        IDC_COMBO1, 94, 143, 101, 30, CBS_DROPDOWN | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
+DEFPUSHBUTTON   "Done", IDOK, 84, 167, 50, 14, WS_DISABLED
 END
 
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/KO_CONN.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_CONN.CPP b/odbc/Driver/KO_CONN.CPP
index 14a2a06..7c3c43d 100644
--- a/odbc/Driver/KO_CONN.CPP
+++ b/odbc/Driver/KO_CONN.CPP
@@ -530,7 +530,7 @@ eGoodBad CvtStrToKeyValues ( CStrPtr pStr, Word pMaxLen, Word* pNumPair, struct
         else {
             //There may exist ; in PWD
             for ( x = 0;  i < len; x ++, i ++ ) {
-                if ( strncmp ( &pStr[i], ";SERVER=", 8 ) == 0 )
+                if ( strnicmp ( &pStr[i], ";SERVER=", 8 ) == 0 )
                 { break; }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/KO_CTLG.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_CTLG.CPP b/odbc/Driver/KO_CTLG.CPP
index 51f9e7d..dc23551 100644
--- a/odbc/Driver/KO_CTLG.CPP
+++ b/odbc/Driver/KO_CTLG.CPP
@@ -127,6 +127,10 @@ RETCODE SQL_API SQLColumns ( SQLHSTMT        pStmt,
                               pCtlgName, pCtlgNameLen, pSchemaName, pSchemaNameLen, pTableName, pTableNameLen, pColumnName, pColumnNameLen ) );
     __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
     _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+
+	// Some application will bring '\\' into table name
+	remove_char(( char* )pTableName, '\\');
+
     // feed stmt structure with response
     std::unique_ptr<SQLResponse> p = SQLResponse::MakeResp4SQLColumns ( ( ( pODBCStmt ) pStmt )->Conn->meta.get(),
                                      ( char* ) pTableName, ( char* ) pColumnName );
@@ -138,7 +142,6 @@ RETCODE SQL_API SQLColumns ( SQLHSTMT        pStmt,
     return SQL_SUCCESS;
 }
 
-
 // -----------------------------------------------------------------------
 // to get the list of column names which make a row unqiue or r updateable
 // ------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/KO_DESC.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_DESC.CPP b/odbc/Driver/KO_DESC.CPP
index 5e15745..9d9e14a 100644
--- a/odbc/Driver/KO_DESC.CPP
+++ b/odbc/Driver/KO_DESC.CPP
@@ -2465,6 +2465,7 @@ RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDesc
             * ( ( Long* ) pDataPtr ) = 0;
             break;
             
+		case SQL_COLUMN_LENGTH://3
         case SQL_DESC_LENGTH://1003
         case SQL_DESC_DISPLAY_SIZE://6
             if ( isANSI )
@@ -2554,7 +2555,8 @@ RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDesc
             }
             
             break;
-            
+
+		case SQL_COLUMN_PRECISION: //4
         case SQL_DESC_PRECISION: //1005
             * ( ( Long* ) pDataPtr ) = pDescItem->precision;
             __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "precision is returned as %i ", * ( ( Word* ) pDataPtr ) ) );
@@ -2565,6 +2567,7 @@ RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDesc
             * ( ( Word* ) pDataPtr ) = SQL_FALSE;
             break;
             
+		case SQL_COLUMN_SCALE: //5
         case SQL_DESC_SCALE://1006
             * ( ( Long* ) pDataPtr ) = pDescItem->scale;
             __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "scale is returned as %i ", * ( ( Word* ) pDataPtr ) ) );

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/KO_FETCH.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_FETCH.CPP b/odbc/Driver/KO_FETCH.CPP
index 1a87e09..99a3ed2 100644
--- a/odbc/Driver/KO_FETCH.CPP
+++ b/odbc/Driver/KO_FETCH.CPP
@@ -162,6 +162,10 @@ RETCODE  _SQLColAttribute_basic ( SQLHSTMT        pStmt,
         case SQL_DESC_UNNAMED:
         case SQL_DESC_UNSIGNED:
         case SQL_DESC_UPDATABLE:
+		// added for Excel
+        case SQL_COLUMN_LENGTH:
+		case SQL_COLUMN_PRECISION:
+		case SQL_COLUMN_SCALE:
             _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pNumValuePtr, -1, NULL , isANSI );
             break;
             
@@ -324,15 +328,21 @@ SQLRETURN SQL_API _SQLDescribeCol_basic ( SQLHSTMT        pStmt,
     }
     
     // COL-NAME ie title
-    
     if ( pColNamePtr ) {
         _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_BASE_COLUMN_NAME, pColNamePtr,
                               pColNameSize, pColNameSizePtr ? &n : NULL, isANSI );
                               
-        if ( pColNameSizePtr )
-        { *pColNameSizePtr = ( Word ) n; }
+	    // here should return length of characters
+        if ( pColNameSizePtr ) { 
+			if (isANSI) {
+				*pColNameSizePtr = ( Word ) n; 
+			}
+			else {
+		     	*pColNameSizePtr = ( Word ) ( n / 2 ); 
+			}
+		}
         
-        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "name: %s", pColNamePtr ) );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, (wchar_t*)pColNamePtr ) );
     }
     
     // COL-DATA TYPE
@@ -405,7 +415,7 @@ SQLRETURN SQL_API SQLDescribeCol ( SQLHSTMT        pStmt,
 
 // -----------------------------------------------------------------------
 // to bind a column to with details from application --- TO ARD
-// kylin specific, no chagne required
+// kylin specific, no change required
 // -----------------------------------------------------------------------
 
 /*
@@ -613,21 +623,6 @@ RETCODE SQL_API SQLFetchScroll ( SQLHSTMT        pStatementHandle,
     return SQL_ERROR;
 }
 
-// -----------------------------------------------------------------------
-// to retrieve long data for a single column in the result set using multiple calls
-// -----------------------------------------------------------------------
-
-RETCODE SQL_API SQLGetData ( SQLHSTMT        pStmt,
-                             SQLUSMALLINT    pColNum,
-                             SQLSMALLINT     pgtType,
-                             SQLPOINTER      pDataPtr,
-                             SQLINTEGER      pDataSize,
-                             SQLINTEGER*     pDataSizePtr ) {
-    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetData called" ) );
-    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetData not implemented" ) );
-    return SQL_ERROR;
-}
-
 
 // -----------------------------------------------------------------------
 // to send data for a parameter or column to the driver at statement execution time
@@ -647,8 +642,30 @@ RETCODE SQL_API SQLPutData ( SQLHSTMT       pStmt,
 
 RETCODE SQL_API SQLMoreResults ( HSTMT pStmt ) {
     __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLMoreResults called" ) );
-    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLMoreResults not implemented" ) );
-    return SQL_ERROR;
+
+	pODBCStmt odbcStmt = (pODBCStmt)pStmt;
+	if (odbcStmt->IRD.RowDesc != NULL ) {
+        // ------- THIS CASE SHOULD NOT OCCUR ----------
+        // check if position is currently unknown
+        if ( odbcStmt->CurRowsetStartRow == NULL && odbcStmt->CurRowsetStartRowPos == 0 ) {
+            // position to first row ( both the pointers )
+            if (GetIfExist ( odbcStmt->IRD.RowDesc->results, 1 ) )
+			{
+				return SQL_SUCCESS;
+			}
+        }
+        // -----------------------------------------------
+        // position to next row if already position is known
+        else if ( odbcStmt->CurRowsetEndRow != NULL ) {
+            // position to next row
+			if (GetIfExist ( odbcStmt->IRD.RowDesc->results, odbcStmt->CurRowsetEndRowPos ) )
+			{
+				return SQL_SUCCESS;
+			}
+        }
+		return SQL_NO_DATA;
+    }
+	return SQL_ERROR;
 }
 
 // -----------------------------------------------------------------------
@@ -1010,8 +1027,7 @@ RETCODE SQL_API _SQLFetchMoveNext ( pODBCStmt pStmt ) {
     __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLFetch MoveNext is called" ) );
     
     // check if there is some response of type resultset
-    if (
-        pStmt->IRD.RowDesc != NULL ) {
+    if (pStmt->IRD.RowDesc != NULL ) {
         // ------- THIS CASE SHOULD NOT OCCUR ----------
         
         // check if position is currently unknown
@@ -1181,7 +1197,7 @@ RETCODE SQL_API _SQLFetch ( pODBCStmt    pStmt,
         // LOOP to fetch cols of one row
         
         // loop to put data in all bound cols
-        for ( ardcol = ard->BindCols; ardcol != NULL; ardcol = ardcol->Next ) {
+		for ( ardcol = ard->BindCols; ardcol != NULL; ardcol = ardcol->Next ) {
             __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Get one column:" ) );
             // get data using _SQLFetchCol
             s = _SQLFetchCol ( pStmt, ardcol, rowdesc, rowdata );
@@ -1229,3 +1245,85 @@ RETCODE SQL_API _SQLFetch ( pODBCStmt    pStmt,
     }
 }
 
+
+// -----------------------------------------------------------------------
+// to retrieve long data for a single column in the result set using multiple calls
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetData ( SQLHSTMT        pStmt,
+								SQLUSMALLINT    pColNum,
+								SQLSMALLINT     pDataType,
+								SQLPOINTER      pDataPtr,
+								SQLLEN      pDataSize,
+								SQLLEN*     pDataSizePtr ) {
+	__CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+
+	__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetData called, ColNum: %d, TgtType: %d, ValuePtr: %d, Capacity: %d",
+                              pColNum, pDataType, pDataPtr, pDataSize ) );
+	
+	if ( pColNum < 1 || pColNum > (( pODBCStmt )pStmt)->IRD.DescCount ) {
+		_SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "07009", -1, "Dynamic SQL error-invalid descriptor index" );
+        return SQL_ERROR;
+	}
+	
+	pODBCARD		ard;
+	pARDItem		ardcol;
+	SQLRowContent*	rowdata;
+	SQLResponse*	rowdesc;
+	SQLSMALLINT		tgtPDataType;
+
+	ard = & ( ( ( pODBCStmt ) pStmt )->ARD );
+	rowdata = ((pODBCStmt)pStmt)->CurRowsetEndRow;
+	rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get();
+
+	if ( rowdata == NULL ) {
+		_SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "HY010", -1, "CLI-specific condition-function sequence error" );
+        return SQL_ERROR;
+	}
+	
+	ardcol = _SQLGetARDItem ( ard, pColNum );
+	if (ardcol != NULL) {
+		/* It's illegal to call SQLGetdata for a "bound" Column */
+		_SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "07009", -1, "dynamic SQL error-invalid descriptor index" );
+        return SQL_ERROR;
+	}
+
+	// convert C data type to SQL data type
+	switch (pDataType)
+	{
+		case SQL_C_SBIGINT:
+		case SQL_C_SLONG:
+		case SQL_C_SSHORT:
+		case SQL_C_STINYINT:
+			tgtPDataType = pDataType - SQL_SIGNED_OFFSET;
+			break;
+		case SQL_C_ULONG:
+		case SQL_C_USHORT:
+		case SQL_C_UTINYINT:
+		case SQL_C_UBIGINT:
+			tgtPDataType = pDataType - SQL_UNSIGNED_OFFSET;
+			break;
+		default:
+			tgtPDataType = pDataType;
+			break;
+	}
+
+	// manually bind column information to output
+	RETCODE ret = SQLBindCol(pStmt, pColNum, tgtPDataType, pDataPtr, pDataSize, pDataSizePtr);
+	if (ret != SQL_SUCCESS) {
+		return ret;
+	}
+
+	ardcol = _SQLGetARDItem ( ard, pColNum );
+	ret = _SQLFetchCol ( (pODBCStmt)pStmt, ardcol, rowdesc, rowdata );
+	if (ret != SQL_SUCCESS) {
+		return ret;
+	}
+	_SQLDetachARDItem(ard, ardcol);
+
+	/*unique_ptr<char[]> temp2 ( wchar2char ( ( wchar_t* ) pDataPtr ) );
+	__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Data1: %s", temp2.get()));
+	__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Size1: %d", *pDataSizePtr));*/
+
+	return SQL_SUCCESS;
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/KO_INFO.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_INFO.CPP b/odbc/Driver/KO_INFO.CPP
index 10a8d5b..5a36508 100644
--- a/odbc/Driver/KO_INFO.CPP
+++ b/odbc/Driver/KO_INFO.CPP
@@ -50,6 +50,7 @@
 //
 // ----------------------------------------------------------------------------
 #include "stdafx.h"
+#include "JsonConverter.h"
 
 // -----------------------------------------------------------------------
 // to get driver related information
@@ -592,9 +593,10 @@ RETCODE SQL_API SQLGetInfoW ( SQLHDBC                    pConn,
                                       pBufferLength, pStringLengthPtr ) );
     }
     
-    if ( pStringLengthPtr ) {
+	//// *2 is already done in _SQLCopyWCharData()
+    /*if ( pStringLengthPtr ) {
         *pStringLengthPtr = ( *pStringLengthPtr ) * 2;
-    }
+    }*/
     
     return SQL_SUCCESS;
 }
@@ -1137,19 +1139,44 @@ RETCODE SQL_API SQLGetInfo ( SQLHDBC         pConn,
     return SQL_SUCCESS;
 }
 
-
 // -----------------------------------------------------------------------
 // to get type related information, this communicates with the server
 // -----------------------------------------------------------------------
+RETCODE SQL_API _SQLGetTypeInfoBasic ( HSTMT pStmt, SWORD pDataType ) {
+    __CHK_HANDLE(pStmt,SQL_HANDLE_STMT,SQL_ERROR);
+    
+	std::unique_ptr<SQLResponse> p;
+	try {
+		wstring info = U("{\"columnMetas\":[{\"isNullable\":0,\"displaySize\":10,\"label\":\"TYPE_NAME\",\"name\":\"TYPE_NAME\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"DATA_TYPE\",\"name\":\"DATA_TYPE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"COLUMN_SIZE\",\"name\":\"COLUMN_SIZE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":10,\"scal
 e\":0,\"columnType\":4,\"columnTypeName\":\"INTEGER\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"LITERAL_PREFIX?\",\"name\":\"LITERAL_PREFIX?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"LITERAL_SUFFIX?\",\"name\":\"LITERAL_SUFFIX?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoI
 ncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"CREATE_PARAMS?\",\"name\":\"CREATE_PARAMS?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"NULLABLE\",\"name\":\"NULLABLE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"CASE_SENSITIVE?\",\"name\":\"CASE_SENSITIVE?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null
 ,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"SEARCHABLE?\",\"name\":\"SEARCHABLE?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"UNSIGNED_ATTRIBUTE??\",\"name\":\"UNSIGNED_ATTRIBUTE??\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":tr
 ue,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"FIXED_PREC_SCALE???\",\"name\":\"FIXED_PREC_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"AUTO_UNIQUE_VALUE?\",\"name\":\"AUTO_UNIQUE_VALUE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"LOCAL_TYPE_NAME???\",\"name\":\"LOCAL_TYPE_NAME???\",\"schemaName\":null
 ,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"MINIMUM_SCALE???\",\"name\":\"MINIMUM_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"MAXIMUM_SCALE???\",\"name\":\"MAXIMUM_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"se
 archable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"SQL_DATA_TYPE?? ?\",\"name\":\"SQL_DATA_TYPE?? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"SQL_DATETIME_SUB?? ??\",\"name\":\"SQL_DATETIME_SUB?? ??\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"NUM_PREC_RADIX?? ? ?\"
 ,\"name\":\"NUM_PREC_RADIX?? ? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"INTEGER\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"INTERVAL_PRECISION?? ? ?\",\"name\":\"INTERVAL_PRECISION?? ? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false}],\"results\":[[\"char\",\"1\",\"255\",\"'\",\"'\",null,\"1\",\"0\",\"3\",null,\"0\",null,\"char\",null,null,\"1\",null,null,null]],\"affectedRowCount\":0,\"isException\":false,\"exceptionMessage\":null,\"duration\":0,\"partial\":false}
 ");
+		web::json::value v = web::json::value::parse ( info );
+		p = SQLResponseFromJSON ( v );
+	}
+    catch ( const exception& e ) {
+        std::stringstream ss;
+        ss << "The error message is: " << e.what();
+        std::string s = ss.str();
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, s.c_str() ) );
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLGetTypeInfoW", "01000", -1, ( char* ) s.c_str() );
+        return SQL_ERROR;
+    }
 
-//TODO
-RETCODE SQL_API SQLGetTypeInfo ( HSTMT pStmt, SWORD pDataType ) {
-    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfo called, Stmt: %d, DataType: %d", ( Long ) pStmt,
-                              pDataType ) );
-    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetType Info is not supported" ) );
+	if ( p == NULL ||  p->isException == true || PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) {
+        return SQL_ERROR;
+    }
     return SQL_SUCCESS;
 }
 
+RETCODE SQL_API SQLGetTypeInfo ( HSTMT pStmt, SWORD pDataType ) {
+	__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfo called, Stmt: %d, DataType: %d", ( Long ) pStmt, pDataType ) );
+
+	return _SQLGetTypeInfoBasic(pStmt, pDataType);
+}
+
+RETCODE SQL_API SQLGetTypeInfoW ( HSTMT pStmt, SWORD pDataType ) {
+	__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfoW called, Stmt: %d, DataType: %d", ( Long ) pStmt, pDataType ) );
+
+	return _SQLGetTypeInfoBasic(pStmt, pDataType);
+}
 
 // -----------------------------------------------------------------------
 // to get function related information

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/KO_UTILS.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_UTILS.CPP b/odbc/Driver/KO_UTILS.CPP
index a085dca..275c93b 100644
--- a/odbc/Driver/KO_UTILS.CPP
+++ b/odbc/Driver/KO_UTILS.CPP
@@ -80,7 +80,7 @@ eGoodBad GetDateFromString ( const char* pDateStr, struct tagDATE_STRUCT* pDateS
     }
 }
 
-//Timestamps in text files have to use the format yyyy-mm-dd hh:mm:ss[.f...]
+//Timestamps in text files have to use the format yyyy-mm-dd or yyyy-mm-dd hh:mm:ss[.f...]
 eGoodBad    GetTimestampFromString ( const char* pStr, struct tagTIMESTAMP_STRUCT* pTimestampStruct ) {
     char    val[10];
     short   x;
@@ -93,7 +93,7 @@ eGoodBad    GetTimestampFromString ( const char* pStr, struct tagTIMESTAMP_STRUC
         p++;
     }
     
-    if ( ( p - pStr ) != 10 || ( x < 19 ) ) {
+    if ( ( p - pStr ) != 10 || ( x < 19 && x != 10) ) {
         __ODBCPOPMSG ( _ODBCPopMsg ( "Invalid timestamp string for conversion: %s", pStr ) );
         return BAD;
     }
@@ -116,19 +116,29 @@ eGoodBad    GetTimestampFromString ( const char* pStr, struct tagTIMESTAMP_STRUC
     strncpy ( val, pStr, 4 );
     val[4] = 0;
     pTimestampStruct->year   = atoi ( val );
-    //convert hour
-    strncpy ( val, pStr + hour, 2 );
-    val[2] = 0;
-    pTimestampStruct->hour = atoi ( val );
-    //convert minute
-    strncpy ( val, pStr + minute, 2 );
-    val[2] = 0;
-    pTimestampStruct->minute = atoi ( val );
-    //convert second
-    strncpy ( val, pStr + second, 2 );
-    val[2] = 0;
-    pTimestampStruct->second = atoi ( val );
-    
+
+	if (x > 10)
+	{
+		//convert hour
+		strncpy ( val, pStr + hour, 2 );
+		val[2] = 0;
+		pTimestampStruct->hour = atoi ( val );
+		//convert minute
+		strncpy ( val, pStr + minute, 2 );
+		val[2] = 0;
+		pTimestampStruct->minute = atoi ( val );
+		//convert second
+		strncpy ( val, pStr + second, 2 );
+		val[2] = 0;
+		pTimestampStruct->second = atoi ( val );
+	}
+	else
+	{
+		pTimestampStruct->hour = 0;
+		pTimestampStruct->minute = 0;
+		pTimestampStruct->second = 0;
+	}
+
     if ( x >= 21 ) {
         pTimestampStruct->fraction = atoi ( pStr + frag );
     }
@@ -283,7 +293,7 @@ RETCODE SQL_API _SQLCopyWCharDataW ( pODBCDiag pDiag, void* pTgtDataPtr, Long pD
             // does all of it fit with null char
             if ( pDataBufSize >= ( n + 1 ) ) {
                 memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, 2 * ( n + 1 ) );
-                ( ( wchar_t* ) pTgtDataPtr ) [n] = '\0';
+                ( ( wchar_t* ) pTgtDataPtr ) [n] = L'\0';
                 //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"_SQLCopyWCharDataW has been called, the target string(not truncated) is :"));
                 //unique_ptr<char[]> temp2(wchar2char( (wchar_t*)pTgtDataPtr));
                 //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,temp2.get()));
@@ -297,7 +307,7 @@ RETCODE SQL_API _SQLCopyWCharDataW ( pODBCDiag pDiag, void* pTgtDataPtr, Long pD
                 memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, 2 * ( pDataBufSize - 1 ) );
                 ( ( wchar_t* ) pTgtDataPtr ) [pDataBufSize - 1] = 0;
                 //__ODBCLOG(_ODBCLogMsg(LogLevel_WARN,"_SQLCopyWCharDataW has been called, the target string is(truncated) :"));
-                unique_ptr<char[]> temp ( wchar2char ( ( wchar_t* ) pTgtDataPtr ) );
+                //unique_ptr<char[]> temp ( wchar2char ( ( wchar_t* ) pTgtDataPtr ) );
                 //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG, temp.get()));
                 //return SQL_SUCCESS_WITH_INFO may cause error in tableau
                 //if ( pDiag )

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Driver/driver.DEF
----------------------------------------------------------------------
diff --git a/odbc/Driver/driver.DEF b/odbc/Driver/driver.DEF
index bade189..f1cf975 100644
--- a/odbc/Driver/driver.DEF
+++ b/odbc/Driver/driver.DEF
@@ -33,6 +33,7 @@ EXPORTS
 	SQLGetInfo
 	SQLGetInfoW
 	SQLGetTypeInfo
+	SQLGetTypeInfoW
 	SQLParamData
 	SQLPutData
 	SQLStatistics

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Installer(64bit)/Installer(64bit).isl
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit).isl b/odbc/Installer(64bit)/Installer(64bit).isl
index e8b81c6..d8b25ee 100644
--- a/odbc/Installer(64bit)/Installer(64bit).isl
+++ b/odbc/Installer(64bit)/Installer(64bit).isl
@@ -4376,7 +4376,7 @@ UwBpAG4AZwBsAGUASQBtAGEAZwBlAAEARQB4AHAAcgBlAHMAcwA=
 		<row><td>PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS</td><td>##IDS_PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS##</td><td/></row>
 		<row><td>ProductCode</td><td>{C8B1B296-2F8B-423F-97D5-429C9B6D2AE6}</td><td/></row>
 		<row><td>ProductName</td><td>KylinODBCDriver (x64)</td><td/></row>
-		<row><td>ProductVersion</td><td>0.6.1000</td><td/></row>
+		<row><td>ProductVersion</td><td>0.7.0000</td><td/></row>
 		<row><td>ProgressType0</td><td>install</td><td/></row>
 		<row><td>ProgressType1</td><td>Installing</td><td/></row>
 		<row><td>ProgressType2</td><td>installed</td><td/></row>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/Installer/Installer.isl
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer.isl b/odbc/Installer/Installer.isl
index cc8a40f..8beb61d 100644
--- a/odbc/Installer/Installer.isl
+++ b/odbc/Installer/Installer.isl
@@ -4357,7 +4357,7 @@ UwBpAG4AZwBsAGUASQBtAGEAZwBlAAEARQB4AHAAcgBlAHMAcwA=
 		<row><td>PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS</td><td>##IDS_PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS##</td><td/></row>
 		<row><td>ProductCode</td><td>{A920FB5E-591B-4537-901D-7D0303088884}</td><td/></row>
 		<row><td>ProductName</td><td>KylinODBCDriver (x86)</td><td/></row>
-		<row><td>ProductVersion</td><td>0.6.1000</td><td/></row>
+		<row><td>ProductVersion</td><td>0.7.0000</td><td/></row>
 		<row><td>ProgressType0</td><td>install</td><td/></row>
 		<row><td>ProgressType1</td><td>Installing</td><td/></row>
 		<row><td>ProgressType2</td><td>installed</td><td/></row>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/52a5d9e5/odbc/README.md
----------------------------------------------------------------------
diff --git a/odbc/README.md b/odbc/README.md
index e0bc0e2..585b061 100644
--- a/odbc/README.md
+++ b/odbc/README.md
@@ -3,7 +3,7 @@
 
 ODBC Driver to interactive with Kylin REST server
 
-The projects is written as a Visual Studio 2012 project. The entry of the project is KylinODBC.sln. Mind the VS version.
+The projects are organized as a Visual Studio 2012 solution. The entry of the solution is KylinODBC.sln. Mind the VS version.
 
 
 ## Contents in the folder
@@ -13,7 +13,7 @@ KylinODBC                  - Root folder containing the workspace. All the proje
 
 KylinODBC\TestDll         - Contains a simple ODBC client that can be used to test your driver as well as connect to any ODBC data source. 
 
-KylinODBC\Common           - Shared data types, utiliy tools, etc.
+KylinODBC\Common           - Shared data types, utility tools, etc.
 
 KylinODBC\Driver           - Contains code for Kylin ODBC driver. Note that the entire functionality has not been implemented but is enough to get you data into most standard ODBC clients like Tableau, provided you have set up a rest server to serve the query requests. Note that the header file is a very important starting point for understanding this driver.