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/07/15 11:42:34 UTC

[01/14] incubator-kylin git commit: add odbc driver to maven repository

Repository: incubator-kylin
Updated Branches:
  refs/heads/0.8 480453ec1 -> d1dcfd155


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/testqueries.txt
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/testqueries.txt b/odbc/TestDLL/testqueries.txt
new file mode 100644
index 0000000..4b71e89
--- /dev/null
+++ b/odbc/TestDLL/testqueries.txt
@@ -0,0 +1,82 @@
+
+
+
+
+
+select lstg_format_name, sum(price) as GMV from  test_kylin_fact where lstg_format_name='FP-GTC' group by lstg_format_name order by lstg_format_name
+
+select LSTG_FORMAT_NAME, sum(price)as GMV, count(1) as TRANS_CNT from  test_kylin_fact group by LSTG_FORMAT_NAME order by LSTG_FORMAT_NAME
+
+
+select test_kylin_fact.lstg_format_name, sum(price) as GMV, count(*) as TRANS_CNT  from  test_kylin_fact group by test_kylin_fact.lstg_format_name order by test_kylin_fact.lstg_format_name
+
+select test_kylin_fact.lstg_format_name,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from  test_kylin_fact group by test_kylin_fact.lstg_format_name having sum(price)>5000  order by test_kylin_fact.lstg_format_name
+
+select test_kylin_fact.lstg_format_name,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT  from  test_kylin_fact where test_kylin_fact.lstg_format_name is null group by test_kylin_fact.lstg_format_name having sum(price)>5000 and count(*)>72 order by  test_kylin_fact.lstg_format_name
+
+select test_kylin_fact.lstg_format_name,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT  from  test_kylin_fact where test_kylin_fact.lstg_format_name is not null group by test_kylin_fact.lstg_format_name  having sum(price)>5000 or  count(*)>20 order by  test_kylin_fact.lstg_format_name
+
+select test_kylin_fact.lstg_format_name,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT  from  test_kylin_fact where test_kylin_fact.lstg_format_name='FP-GTC' group by test_kylin_fact.lstg_format_name having sum(price)>5000 or count(*)>20 order by  test_kylin_fact.lstg_format_name
+
+select test_kylin_fact.lstg_format_name,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from  test_kylin_fact where test_kylin_fact.lstg_format_name='FP-GTC' group by test_kylin_fact.lstg_format_name order by  test_kylin_fact.lstg_format_name
+
+select test_cal_dt.week_beg_dt, count(*) as TRANS_CNT from  test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt   group by test_cal_dt.week_beg_dt order by test_cal_dt.week_beg_dt
+
+select test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from  test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt  where test_kylin_fact.lstg_format_name='FP-GTC'  and  test_cal_dt.week_beg_dt  between DATE '2013-05-01' and DATE '2013-08-01' group by test_cal_dt.week_beg_dt order by test_cal_dt.week_beg_dt
+
+select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from  test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt  where test_cal_dt.week_beg_dt  between DATE '2013-05-01' and DATE '2013-08-01' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt having sum(price)>500 order by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt
+
+select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT  from  test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt  where  test_cal_dt.week_beg_dt  >= DATE '2013-02-10' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt order by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt 
+
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,sum(test_kylin_fact.price) as GMV , count(*) as trans_cnt FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id  AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id group by  test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id where  test_cal_dt.week_beg_dt between DATE '2013-09-01' and DATE '2013-10-01' and test_category_groupings.meta_categ_name='Collectibles' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id where  test_cal_dt.week_beg_dt between DATE '2013-09-01' and DATE '2013-10-01' and test_category_groupings.categ_lvl2_name='Comics' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name  
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id where  test_cal_dt.week_beg_dt between DATE '2013-09-01' and DATE '2013-10-01' and test_category_groupings.meta_categ_name='Collectibles' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name  
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id where  test_cal_dt.week_beg_dt between DATE '2013-09-01' and DATE '2013-10-01' and test_category_groupings.categ_lvl3_name='Other' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_cal_dt.week_beg_dt between DATE '2013-02-01' and DATE '2013-03-01' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_grouping
 s.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_cal_dt.week_beg_dt between DATE '2013-02-01' and DATE '2013-10-01' and site_name='Canada' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name 
 ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_cal_dt.week_beg_dt between DATE '2013-02-01' and DATE '2013-10-01' and site_name='Ebay' and test_category_groupings.categ_lvl3_name='Other' and test_kylin_fact.lstg_format_name='Auction' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name  
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id INNER JOIN test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd group by  test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_ty
 pe_desc  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id INNER JOIN test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd where test_cal_dt.week_beg_dt between DATE '2013-01-01' and DATE '2013-06-01'  group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kyl
 in_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc  
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id INNER JOIN test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd where test_cal_dt.week_beg_dt between DATE '2013-01-01' and DATE '2013-06-04'  and (test_category_groupings.meta_categ_name='Collectibles' or test_category_groupings.meta_categ_name='Clothing, Shoes & Accessories') and  test_category_groupings.
 categ_lvl3_name <>'Other' and test_sites.site_name='Ebay' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc  order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc  
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id INNER JOIN test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd where  (test_category_groupings.meta_categ_name='Collectibles' or test_category_groupings.categ_lvl3_name='Dresses')  and test_sites.site_name='Ebay' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_group
 ings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,test_seller_type_dim.seller_type_desc 
+
+
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id  AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id group by  test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name 
+
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_sites.site_name = '英国' group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_grouping
 s.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lst
 g_format_name ,test_sites.site_name 
+
+SELECT test_kylin_fact.seller_id ,test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 group by  test_kylin_fact.seller_id ,test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name order by  test_kylin_fact.seller_id ,test_cal_dt.week_beg_dt ,test_category_gr
 oupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 group by  test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name order by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_gr
 oupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name 
+
+SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 or test_kylin_fact.lstg_format_name = 'FP-non GTC' group by  test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name order by  test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_
 category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,test_kylin_fact.lstg_format_name ,test_sites.site_name 
+
+SELECT test_category_groupings.meta_categ_name ,sum(test_kylin_fact.price) as GMV_SUM ,max(test_kylin_fact.price) as GMV_MAX ,min(test_kylin_fact.price) as GMV_MIN ,count(*) as TRANS_CNT FROM test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt INNER JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id INNER JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 or test_kylin_fact.lstg_format_name = 'FP-non GTC' group by  test_category_groupings.meta_categ_name order by test_category_groupings.meta_categ_name
+
+select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from  test_kylin_fact INNER JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where (test_kylin_fact.lstg_format_name > '') and ( 	(test_kylin_fact.lstg_format_name='FP-GTC') 	OR 	(test_cal_dt.week_beg_dt  between DATE '2013-05-20' and DATE '2013-05-21') ) and ( 	(test_kylin_fact.lstg_format_name='ABIN') 	OR 	(test_cal_dt.week_beg_dt  between DATE '2013-05-20' and DATE '2013-05-21') ) group by test_cal_dt.week_beg_dt order by test_cal_dt.week_beg_dt 
+
+select lstg_format_name, sum(price) as GMV from  test_kylin_fact where lstg_format_name not in ('FP-GTC', 'ABIN') group by lstg_format_name order by lstg_format_name
+
+select  sum(price) as GMV from  test_kylin_fact 
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/ThirdPartyLibraries.txt
----------------------------------------------------------------------
diff --git a/odbc/ThirdPartyLibraries.txt b/odbc/ThirdPartyLibraries.txt
new file mode 100644
index 0000000..5bcd28b
--- /dev/null
+++ b/odbc/ThirdPartyLibraries.txt
@@ -0,0 +1,9 @@
+1.C++ REST SDK
+	http://katyscode.wordpress.com/2014/04/01/how-to-statically-link-the-c-rest-sdk-casablanca/
+
+2.VLD
+
+3.ZLIB
+	http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html
+	compile with MT
+	add /safeseh to bld_ml.bat
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/doc/reference/0205agarwal.zip
----------------------------------------------------------------------
diff --git a/odbc/doc/reference/0205agarwal.zip b/odbc/doc/reference/0205agarwal.zip
new file mode 100644
index 0000000..4f8e642
Binary files /dev/null and b/odbc/doc/reference/0205agarwal.zip differ

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/doc/reference/ODBC Driver Development.docx
----------------------------------------------------------------------
diff --git a/odbc/doc/reference/ODBC Driver Development.docx b/odbc/doc/reference/ODBC Driver Development.docx
new file mode 100644
index 0000000..a88c953
Binary files /dev/null and b/odbc/doc/reference/ODBC Driver Development.docx differ

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/"odbc/doc/\345\246\202\344\275\225\345\256\232\345\210\266\344\270\200\344\270\252\345\237\272\344\272\216REST Service\347\232\204ODBC\351\251\261\345\212\250\347\250\213\345\272\217.docx"
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/ipch/driver-646534d9/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/ipch/driver-646534d9/.gitignore b/odbc/ipch/driver-646534d9/.gitignore
new file mode 100644
index 0000000..5136c16
--- /dev/null
+++ b/odbc/ipch/driver-646534d9/.gitignore
@@ -0,0 +1 @@
+*.ipch


[06/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/driver.vcxproj.filters
----------------------------------------------------------------------
diff --git a/odbc/Driver/driver.vcxproj.filters b/odbc/Driver/driver.vcxproj.filters
new file mode 100644
index 0000000..5f3debd
--- /dev/null
+++ b/odbc/Driver/driver.vcxproj.filters
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{efeb7ed9-b598-42d8-967a-3719de638898}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{0f3d4b31-2e15-4c60-a636-0e2b88c156b8}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{7665d88b-ed3f-46ef-9f54-b8d45fb141d5}</UniqueIdentifier>
+      <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="KO_ALLOC.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_ATTR.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_CONN.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_CTLG.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_DESC.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_DIAG.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_DTYPE.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_EXEC.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_FETCH.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_INFO.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_PARAM.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_UTILS.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KylinODBC.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="KO_CONFIG.CPP">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="resource.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="KylinODBC.H">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="stdafx.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="GODBC.RC">
+      <Filter>Resource Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <CustomBuild Include="driver.DEF">
+      <Filter>Source Files</Filter>
+    </CustomBuild>
+  </ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/driver.vcxproj.user
----------------------------------------------------------------------
diff --git a/odbc/Driver/driver.vcxproj.user b/odbc/Driver/driver.vcxproj.user
new file mode 100644
index 0000000..a375ae3
--- /dev/null
+++ b/odbc/Driver/driver.vcxproj.user
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/resource.h
----------------------------------------------------------------------
diff --git a/odbc/Driver/resource.h b/odbc/Driver/resource.h
new file mode 100644
index 0000000..2669bab
--- /dev/null
+++ b/odbc/Driver/resource.h
@@ -0,0 +1,32 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by GODBC.RC
+//
+#define IDOK2                           3
+#define IDD_DSN_CFG1                    101
+#define IDD_DSN_CFG2                    102
+#define IDC_DSNNAME                     1000
+#define IDC_SERVER                      1001
+#define IDC_PORT                        1002
+#define IDC_UID                         1003
+#define IDC_PWD                         1004
+#define IDC_BTEST                       1005
+#define IDC_CONNECT                     1006
+#define IDC_COMBO1                      1007
+
+#define IDC_COMPANY                     1008
+#define IDC_PREV                        1009
+#define IDC_DATABASE                    1010
+#define IDC_SERVER2                     1011
+#define IDC_BUTTON1                     1012
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        108
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1015
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/stdafx.cpp
----------------------------------------------------------------------
diff --git a/odbc/Driver/stdafx.cpp b/odbc/Driver/stdafx.cpp
new file mode 100644
index 0000000..1577c4e
--- /dev/null
+++ b/odbc/Driver/stdafx.cpp
@@ -0,0 +1 @@
+#include "stdafx.h"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/stdafx.h
----------------------------------------------------------------------
diff --git a/odbc/Driver/stdafx.h b/odbc/Driver/stdafx.h
new file mode 100644
index 0000000..a1c80d2
--- /dev/null
+++ b/odbc/Driver/stdafx.h
@@ -0,0 +1,3 @@
+#pragma message("Compiling precompiled headers. \n")
+
+#include "KylinODBC.h"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/version.props
----------------------------------------------------------------------
diff --git a/odbc/Driver/version.props b/odbc/Driver/version.props
new file mode 100644
index 0000000..1329bf6
--- /dev/null
+++ b/odbc/Driver/version.props
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <CppRestBaseFileName>cpprest</CppRestBaseFileName>
+    <CppRestSDKVersionMajor>1</CppRestSDKVersionMajor>
+    <CppRestSDKVersionMinor>4</CppRestSDKVersionMinor>
+    <CppRestSDKVersionRevision>0</CppRestSDKVersionRevision>
+    <CppRestSDKVersionFileSuffix>$(CppRestSDKVersionMajor)_$(CppRestSDKVersionMinor)</CppRestSDKVersionFileSuffix>
+    <CppRestSDKVersionString>$(CppRestSDKVersionMajor).$(CppRestSDKVersionMinor)</CppRestSDKVersionString>
+  </PropertyGroup>
+<!--
+  Note: remember to regenerate guiddefs.wxi files using gen_guids_for_msi.ps1 whenever major or minor version file changes
+-->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/x64/Release/Intermediate/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Driver/x64/Release/Intermediate/.gitignore b/odbc/Driver/x64/Release/Intermediate/.gitignore
new file mode 100644
index 0000000..62bb106
--- /dev/null
+++ b/odbc/Driver/x64/Release/Intermediate/.gitignore
@@ -0,0 +1,2 @@
+*.lastbuildstate
+*.res


[07/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KylinODBC.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KylinODBC.CPP b/odbc/Driver/KylinODBC.CPP
new file mode 100644
index 0000000..bca2748
--- /dev/null
+++ b/odbc/Driver/KylinODBC.CPP
@@ -0,0 +1,352 @@
+
+// ---------------------------------------------------------------------------------
+//
+// File:    GODBC32.CPP
+//
+// Author:  Hongbin Ma
+//
+// Purpose: Entry point for the Kylin ODBC
+//          Contains the DllMain as entry point function
+//          Contains log initialization-deinitialization function
+//          Contains in commented form the deprecated functions
+//          Contains more details about the driver as comments
+//          Finally compiled into a DLL
+//
+// Note:    The driver is supposed to be an ODBC 3.0 driver.
+//          If you're to study the code,
+//          Take a look at KylinODBC.h to learn about the prerequisites
+//
+// ----------------------------------------------------------------------------------
+#include "stdafx.h"
+
+#include <stdio.h>
+
+
+// ------------------------- global variables -------------------------
+HINSTANCE   ghInstDLL   = 0;
+Long        gLogFile    = -1;
+Word        gLogUsage   = 0;
+
+
+// -----------------------------------------------------------------------
+// DLL enrty point
+// -----------------------------------------------------------------------
+
+BOOL WINAPI  DllMain ( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
+    // note
+    // key functions it needs to perform
+    // 1. initialize the log system if in debug mode
+    
+    // Perform actions based on the reason for calling.
+    switch ( fdwReason ) {
+        case DLL_PROCESS_ATTACH:
+            // Initialize once for each new process.
+            // Return FALSE to fail DLL load.
+            OutputDebugString ( "Process Attached\n" ); // for DBMON
+            // start log
+            _ODBCLogStart ();
+            #ifdef _DEBUG
+            MessageBox ( GetDesktopWindow(), "Entry into driver DLL - PROCESS_ATTACH",  "Kylin ODBC driver", MB_OK );
+            #endif
+            break;
+            
+        case DLL_THREAD_ATTACH:
+            #ifdef _DEBUG
+            // start log
+            _ODBCLogStart ();
+            #endif
+            // log msg
+            OutputDebugString ( "Thread Attached\n" ); // for DBMON
+            // Do thread-specific initialization.
+            break;
+            
+        case DLL_THREAD_DETACH:
+            #ifdef _DEBUG
+            // stop log
+            _ODBCLogStop ( 0 );
+            #endif
+            // Do thread-specific cleanup.
+            break;
+            
+        case DLL_PROCESS_DETACH:
+            #ifdef _DEBUG
+            // log msg
+            //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG, "Thread de-tach"));
+            // stop log
+            _ODBCLogStop ( 1 );
+            #endif
+            // Perform any necessary cleanup.
+            break;
+    }
+    
+    // check if instance has not been saved
+    if ( ghInstDLL == 0 )
+    { ghInstDLL = hinstDLL; }
+    
+    return TRUE;  // Successful DLL_PROCESS_ATTACH.
+}
+
+
+// -----------------------------------------------------------------------
+// Notes
+//
+//
+//
+//
+//
+// -----------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------
+// Modules
+//
+// driver.DEF  -    Exported function. Required by linker to export the
+//                  functions.
+//
+// KO_ALLOC.CPP -   Contains function for managing allocation and release
+//                  of the three structures/handles - Environment,
+//                  Connection and Statement. Statements r
+//                  encapsulated inside connection while all connections
+//                  inside environment.
+//
+// KO_ATTR.CPP  -   Contains the attribute/option set/get functions
+//                  for environment, connection and statement
+//                  also contains some other functions like setting of
+//                  cursor name etc.
+//
+// KO_CONN.CPP  -   Contains the main connection functions more
+//                  specifically SQLDriverConnect.
+//
+// KO_CTLG.CPP  -   Contains catalog functions
+//                  Functions that allow collection of metadata/information
+//                  about the database are termed as catalog functions.
+//
+// KO_DESC.CPP  -   Contains descriptor functions.
+//                  As explained in the article, descriptors r the heart
+//                  as far as driver design is concerned. Descriptors
+//                  r essntially data structures to encapsulate one set/type of
+//                  data associated with ODBC connection.
+//
+// KO_DIAG.CPP  -   Contains DIAG related functions.
+//                  Contains debug/log related functions.
+//                  The diagnostic functions work as per ODBC
+//                  specification while the log functions
+//                  are useful for debugging.
+//
+// KO_DTYPE.CPP -   Contains functions related to data types as per ODBC.
+//                  For defining the type of data ODBC uses three params
+//                  Concise Type, Verbose Type and DateTime Interval.
+//                  All of these r intertwined, setting one of these
+//                  influences the other two.
+//
+// KO_EXEC.CPP  -   Contains function for executing queries.
+//                  After a request is prepared by the caller
+//                  control is passed to _SQLExecStmtFromReq in this
+//                  file. Alse SQLExecDirect, SQLExecute, SQLPrepare
+//                  r implemented in this file
+//
+// KO_FETCH.CPP -   Contains function for fetching results.
+//                  As explained in the article ODBC has a
+//                  defined way in which the data is made available.
+//                  Client specified the buffer, its size and return
+//                  size placeholder. These are then used by the
+//                  driver automatically when fetch funtions r
+//                  called by the client
+//
+// KO_INFO.CPP  -   This file is dedicated to the single function SQLGetInfo.
+//                  Almost all information about your driver, server
+//                  and current state required by the client is obtained
+//                  using this function.
+//
+// KO_PARAM.CPP -   Functions for implementing paramterized queries. Not
+//                  implemented in this sample.
+//
+//
+// KO_UTILS.CPP -   contains generic utility functions used across files/modules.
+//                  Data conversion and copying functions w.r.t ODBC type params
+//                  like its type, size, its size pointer, src data and src size etc.
+//
+// -----------------------------------------------------------------------
+
+// -----------------------------------------------------------------------
+// Header Files
+//
+// KylinODBC.h      -   Main header file for driver
+//
+// SQL.H        -   Main ODBC file on Win32
+//
+// SQLEXT.H     -   Main ODBC file on Win32
+//
+// SQLTYPES.H   -   ODBC types
+//
+// -----------------------------------------------------------------------
+
+
+
+// -----------------------------------------------------------------------
+// ------------------------- deprecated functions ------------------------
+// -----------------------------------------------------------------------
+
+
+/**********
+
+    RETCODE SQL_API SQLSetParam ( HSTMT arg0, UWORD arg1, SWORD arg2, SWORD arg3, UDWORD arg4, SWORD arg5, PTR arg6, UNALIGNED SDWORD * arg7)
+    {
+    // has been mapped to SQLBindParameter
+    // hence not exported
+
+    _LogMessage("SQLSetParam called");
+    return(SQL_SUCCESS);
+    }
+
+
+
+    RETCODE SQL_API SQLError ( HENV arg0, HDBC arg1, HSTMT arg2, UCHAR * arg3, UNALIGNED SDWORD * arg4, UCHAR * arg5, SWORD arg6, UNALIGNED SWORD * arg7)
+    {
+    // has been mapped to SQLDiagRec
+    // hence not exported
+
+    _LogMessage("SQLError called");
+
+    return(SQL_NO_DATA_FOUND);
+    }
+
+    RETCODE SQL_API SQLTransact ( HENV arg0, HDBC arg1, UWORD arg2 )
+    {
+    // has been mapped to SQLEndTran
+    // hence not exported
+
+    _LogMessage("SQLTransact called");
+    return(SQL_SUCCESS);
+    }
+
+
+
+    RETCODE SQL_API SQLParamOptions  (HSTMT arg0,
+    UDWORD arg1,
+    UNALIGNED UDWORD * arg2)
+    {
+    // has been mapped to SQLSetStmtAttr
+    // hence not exported
+
+    _LogMessage("SQLParamOptions called");
+    return(SQL_SUCCESS);
+    }
+
+
+    RETCODE SQL_API SQLSetScrollOptions  (HSTMT arg0,
+    UWORD arg1,
+    SDWORD arg2,
+    UWORD arg3)
+    {
+    // has been mapped to SQLSetStmtAttr
+    // hence not exported
+
+    _LogMessage("SQLSetScrollOptions called");
+    return(SQL_SUCCESS);
+    }
+
+
+    RETCODE SQL_API SQLBindParam  (SQLHSTMT arg0,
+    SQLUSMALLINT arg1,
+    SQLSMALLINT arg2,
+    SQLSMALLINT arg3,
+    SQLUINTEGER arg4,
+    SQLSMALLINT arg5,
+    SQLPOINTER arg6,
+    SQLINTEGER * arg7)
+    {
+    // has been mapped to SQLBindParameter
+    // hence not exported
+
+    _LogMessage("SQLBindParam called");
+    return(SQL_SUCCESS);
+    }
+
+
+    RETCODE SQL_API SQLSetConnectOption ( HDBC arg0, UWORD arg1, UDWORD arg2 )
+    {
+    // has been mapped to SQLSetConnectAttr
+    // hence not exported
+
+    _LogMessage("SQLSetConnectOption called\n");
+    return(SQL_SUCCESS);
+    }
+
+    ///// SQLGetConnectOption /////
+
+    RETCODE SQL_API SQLGetConnectOption ( HDBC arg0, UWORD arg1, PTR arg2 )
+    {
+    // has been mapped to SQLGetConnectAttr
+    // hence not exported
+
+    _LogMessage("SQLGetConnectOption called");
+    return(SQL_SUCCESS);
+    }
+
+
+    ///// SQLGetStmtOption /////
+
+    RETCODE SQL_API SQLGetStmtOption ( HSTMT arg0, UWORD arg1, PTR arg2 )
+    {
+    // has been mapped to SQLGetStmtAttr
+    // hence not exported
+
+    _LogMessage("SQLGetStmtOption called");
+    return(SQL_SUCCESS);
+    }
+
+
+    ///// SQLSetStmtOption /////
+
+    RETCODE SQL_API SQLSetStmtOption ( HSTMT arg0, UWORD arg1, UDWORD arg2 )
+    {
+    // has been mapped to SQLSetStmtAttr
+    // hence not exported
+
+    _LogMessage("SQLSetStmtOption called, Fld: %d, Value: %d", arg1, arg2 );
+    return(SQL_SUCCESS);
+    }
+
+
+
+
+    RETCODE SQL_API SQLColAttributes ( HSTMT arg0, UWORD arg1, UWORD arg2, PTR arg3, SWORD arg4, UNALIGNED SWORD * arg5, UNALIGNED SDWORD * arg6 )
+    {
+    // has been mapped to SQLColAttribute
+    // hence not exported
+
+    _LogMessage("SQLColAttributes called - deprecated ????");
+    return SQL_SUCCESS;
+    }
+
+    //////////////// DRIVER MANAGER
+
+    RETCODE SQL_API SQLDrivers  (HENV arg0,
+    UWORD arg1,
+    UCHAR * arg2,
+    SWORD arg3,
+    SWORD * arg4,
+    UCHAR * arg5,
+    SWORD arg6,
+    SWORD * arg7)
+    {
+    // implemented  solely only by driver manager
+    // hence not exported
+
+    _LogMessage("SQLDrivers called");
+    return(SQL_SUCCESS);
+    }
+
+
+    RETCODE SQL_API SQLDataSources  (HENV arg0, UWORD arg1, UCHAR * arg2, SWORD arg3, SWORD * arg4, UCHAR * arg5, SWORD arg6, SWORD * arg7)
+    {
+    // implemented  solely only by driver manager
+    // hence not exported
+
+    _LogMessage("SQLDataSources called\n");
+    return(SQL_SUCCESS);
+    }
+
+
+****************** */
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KylinODBC.H
----------------------------------------------------------------------
diff --git a/odbc/Driver/KylinODBC.H b/odbc/Driver/KylinODBC.H
new file mode 100644
index 0000000..bcce5e2
--- /dev/null
+++ b/odbc/Driver/KylinODBC.H
@@ -0,0 +1,644 @@
+// ----------------------------------------------------------------------------
+//
+// File:        KylinODBC.h
+//
+// Purpose:     Main header for Kylin ODBC driver - GODBC.CPP
+//
+// Author:      Hongbin Ma
+//
+// Notes:       This file is the heart as far as the driver design is concerned.
+//              Essentially it contains the following elements/structures
+//              Environment       --- as --- struct ODBCEnv
+//                                -- type -- ODBCEnv
+//              Connection        --- as --- struct ODBCConn
+//                                -- type -- ODBCConn
+//              Statement         --- as --- struct ODBCStmt
+//                                -- type -- ODBCStmt
+//              Diag row & header --- as --- struct ODBCDiagRow/ODBCDiag
+//                                -- type -- ODBCStmt
+//              ARD item & header --- as --- struct ARDItem/ODBCARD
+//                                -- type -- ARDItem/ODBCARD
+//              IRD item & header --- as --- ODBCIRD
+//                                -- type -- IRDItem/ODBCIRD
+//              APD item & header --- as --- struct APDItem/ODBCAPD
+//                                -- type -- APDItem/ODBCAPD
+//              IPD item & header --- as --- struct IPDItem/ODBCIPD
+//                                -- type -- IPDItem/ODBCIPD
+//              and constants, macros and function prototypes
+//
+//              The descriptors( http://msdn.microsoft.com/en-us/library/ms716262(v=vs.85).aspx )
+//              are very important design issue as mentioned
+//              in the article. ( http://www.drdobbs.com/windows/odbc-driver-development/184416434?pgno=1,
+//              or you can just find all the stuff in "ODBC Driver Development Tutorial"
+//              at the project folder.)
+//
+//              Environment encapsulates connection which
+//              enacapsulates statement which encapsulates all four descriptors.
+//              Almost all IO is done via these structures. You must be absolutely
+//              clear as to their purpose/
+//
+//              We use windows c++ rest SDK for calling rest service.
+//              vist its homepage at http://casablanca.codeplex.com/.
+//              For a tutorial of it, refer to http://www.drdobbs.com/windows/using-the-microsoft-c-rest-sdk/240164544
+//              and http://www.drdobbs.com/windows/json-and-the-microsoft-c-rest-sdk/240164821. There is also an article
+//              on how to link it into our driver: http://katyscode.wordpress.com/2014/04/01/how-to-statically-link-the-c-rest-sdk-casablanca/
+//
+//              For Rest SDK working smoothly in our driver, we adopt the static linking techniques as describled in
+//              http://katyscode.wordpress.com/2014/04/01/how-to-statically-link-the-c-rest-sdk-casablanca/
+//
+// ---------------------------------------------------------------------------
+
+// --------------------------- Windows ODBC includes --------------------------
+#pragma once
+#include "vld.h"
+#include <windows.h>
+#include <sqlext.h>
+#include <odbcinst.h>
+
+// -------------------- legacy types for basic data types ---------------------
+#include "MsgTypes.h"
+#include "windows.h"
+
+#include <memory>
+
+// -------------------- types ---------------------
+typedef char                    Char;
+typedef short                   Word;
+typedef long                    Long;
+
+typedef unsigned char           UChar;
+typedef unsigned short          UWord;
+typedef unsigned long           ULong;
+
+typedef Char*                   StrPtr;
+typedef const Char*             CStrPtr;
+
+enum    eGoodBad    {   GOOD        = 0,    BAD         };
+
+// ----------------------- predeclarations and typedefs ----------------------------
+struct ODBCEnv;                                                  // environment
+typedef struct ODBCEnv*      pODBCEnv;                        // ENVIRONMENT as pointer type
+
+struct ODBCConn;                                                 // connection
+typedef struct ODBCConn*     pODBCConn;                       // CONNECTION as pointer type
+
+struct ODBCStmt;                                                 // statement
+typedef struct ODBCStmt*     pODBCStmt;                       // STATEMENT as pointer type
+
+
+// --------------------------- descriptor types/signatures --------------------------
+#define SQL_DESC_ARD            1
+#define SQL_DESC_IRD            2
+#define SQL_DESC_APD            3
+#define SQL_DESC_IPD            4
+
+// DIAGNOSTICS
+
+
+// ----------------------------------------------------------------------------------
+// DIAGNOSTIC ROW - diagnostic message holder and link list
+// ----------------------------------------------------------------------------------
+
+struct ODBCDiagRow {
+
+    Long NativeErrorCode;
+    // SQL_DIAG_NATIVE, native error code, specific to the data source
+    Long            Row;                                            // error row if applicable
+    Long            Col;                                            // error col if applicable
+    
+    Char            State[SQL_SQLSTATE_SIZE + 1];                   // SQLSTATE --- state as per ODBC spec
+    StrPtr          Msg;                                            // SQL_DIAG_MESSAGE_TEXT, message text
+    
+    struct ODBCDiagRow*     Next;                                // next message
+    struct ODBCDiagRow*     Prev;                                // prev message
+};
+
+typedef struct ODBCDiagRow*  pODBCDiagRow;                    // DIAGROW as pointer type
+
+
+// ----------------------------------------------------------------------------------
+// DIAGNOSTIC - diagnostics header & rows link-list holder holder
+// ----------------------------------------------------------------------------------
+
+struct ODBCDiag {
+
+    // header attributes
+    Char    Func[64];                                                // func/API that generated the messages
+    
+    // diagnostic rows link-list
+    pODBCDiagRow     DiagRows;
+};
+
+
+typedef struct ODBCDiag*     pODBCDiag;                       // ODBCDIAG as pointer type
+
+
+// ARD
+
+
+// ----------------------------------------------------------------------------------
+// APPL ROW DESC ITEM - to hold appl specified buffers & other details for one column
+// ----------------------------------------------------------------------------------
+
+struct ARDItem {
+
+    Word        ColNum;                                             // column number
+    
+    Word        DataConciseType;                                    // concise data type
+    Word        DataVerboseType;                                    // basic data type
+    Word        DateTimeIntervalCode;                               // date-time interval code
+    Long        DateTimeIntervalPrec;                               // date-time precision
+    Long        NumPrecRadix;                                       // 2 if approx num type or 10 exact num type
+    Word        Scale;                                              // scale, right of decimal
+    
+    void*       DataPtr;                                            // col data
+    Long        DataSize;                                           // size of data buffer
+    Long*       SizePtr;                                            // actual data size
+    Long*       SizeIndPtr;                                         // size indicator ptr
+    
+    /////// following r fed & used  at time of fetch for optimization
+    
+    Word        SrcDataType;                                        // src data type ( for optimization only )
+    Long        SrcDataSize;                                        // size of source data
+    Word        SrcDataPrecision;                                   // precision for source data
+    Word        SrcDataScale;                                       // scale for source data
+    
+    ///////
+    
+    struct ARDItem*     Next;                                 // next col binding
+    struct ARDItem*     Prev;                                 // prev col binding
+};
+
+typedef struct ARDItem*    pARDItem;                   // ARD-Col as pointer type
+
+
+// ----------------------------------------------------------------------------------
+// APPL ROW DESC - to hold appl specified buffers & other details for columns
+// ----------------------------------------------------------------------------------
+
+struct ODBCARD {
+
+    Word            Sign;
+    
+    // header fields
+    Word            AllocType;                                          // SQL_DESC_ALLOC_TYPE
+    ULong           RowArraySize;                                       // SQL_DESC_ARRAY_SIZE
+    UWord*          ArrayStatusPtr;                                     // SQL_DESC_ARRAY_STATUS_PTR
+    Long*           BindOffsetPtr;                                      // SQL_DESC_BIND_OFFSET_PTR
+    Long            BindTypeOrSize;                                     // SQL_DESC_BIND_TYPE
+    Word            DescCount;                                          // SQL_DESC_COUNT
+    
+    // rows for binding each col
+    pARDItem BindCols;                                           // col bindings
+    
+    // container
+    pODBCStmt    Stmt;                                               // container statememt
+};
+
+
+//typedef struct ODBCARD       ODBCARD;                         // ARD data type
+typedef struct ODBCARD*      pODBCARD;                        // ARD as pointer type
+
+
+// IRD
+
+// ----------------------------------------------------------------------------------
+// IMPL ROW DESC ITEM - to hold info about one IRD item
+// ----------------------------------------------------------------------------------
+
+typedef SelectedColumnMeta                 IRDItem;                     // IRD data type
+typedef SelectedColumnMeta*                pIRDItem;                    // IRD as pointer type
+
+// ----------------------------------------------------------------------------------
+// IMPL ROW DESC - to hold response col description from server
+// ----------------------------------------------------------------------------------
+
+struct ODBCIRD {
+
+    Word            Sign;
+    
+    // header fields
+    UWord*          ArrayStatusPtr;                 // SQL_DESC_ARRAY_STATUS_PTR
+    Word            DescCount;                      // SQL_DESC_COUNT
+    ULong*          RowsProcessedPtr;               // SQL_DESC_ROWS_PROCESSED_PTR, it is changed in _SQL_FETCH
+    
+    // rows for binding each col
+    std::unique_ptr<SQLResponse>        RowDesc;    // Row descriptor
+    
+    // container
+    pODBCStmt    Stmt;                           // container statememt
+};
+
+
+typedef struct ODBCIRD*      pODBCIRD;        // IRD as pointer type
+
+
+
+// APD
+
+// ----------------------------------------------------------------------------------
+// APPL PARM DESC ITEM - to hold appl specified buffers & other details for one param
+// ----------------------------------------------------------------------------------
+
+struct APDItem {
+
+    Word        ParamNum;                                           // parameter number
+    
+    Word        DataConciseType;                                    // data type
+    Word        DataVerboseType;                                    // basic data type
+    Word        DateTimeIntervalCode;                               // date-time interval code ????
+    Long        DateTimeIntervalPrec;                               // date-time precision ????
+    Long        NumPrecRadix;                                       // 2 if approx num type or 10 exact num type
+    Word        Scale;                                              // scale, right of decimal
+    
+    void*       DataPtr;                                            // param data
+    Long        DataSize;                                           // size of data
+    Long*       SizePtr;                                            // size of data buffer
+    Long*       SizeIndPtr;                                         // size indicator ptr
+    
+    struct APDItem*     Next;                                 // next parm binding
+    struct APDItem*     Prev;                                 // prev parm binding
+};
+
+typedef struct APDItem*    pAPDItem;                   // APD-Param as pointer type
+
+
+// ----------------------------------------------------------------------------------
+// APPL PARAM DESC - to hold appl specified buffers & other details for params
+// ----------------------------------------------------------------------------------
+
+struct ODBCAPD {
+
+    Word            Sign;
+    
+    // header fields
+    Word            AllocType;                                          // SQL_DESC_ALLOC_TYPE
+    ULong           RowArraySize;                                       // SQL_DESC_ARRAY_SIZE
+    UWord*          ArrayStatusPtr;                                     // SQL_DESC_ARRAY_STATUS_PTR
+    Long*           BindOffsetPtr;                                      // SQL_DESC_BIND_OFFSET_PTR
+    Long            BindTypeOrSize;                                     // SQL_DESC_BIND_TYPE
+    Word            DescCount;                                          // SQL_DESC_COUNT
+    
+    ULong           ParamSetSize;
+    Long*           ParamProcessedPtr;
+    
+    // rows for binding each col
+    pAPDItem BindParams;                                       // param bindings
+    
+    // container
+    pODBCStmt    Stmt;                                               // container statememt
+};
+
+
+typedef struct ODBCAPD*      pODBCAPD;                        // APD as pointer type
+
+
+// IPD
+
+// ----------------------------------------------------------------------------------
+// IMPL PARM DESC ITEM - to hold impl buffers & other details for one param
+// ----------------------------------------------------------------------------------
+
+struct IPDItem {
+
+    Word        ParamNum;                                           // parameter number
+    Word        ParamType;                                          // parameter type input/output
+    Char        ParamName[33];                                      // param name - arbitray/dummy
+    
+    Word        DataConciseType;                                    // data type
+    Word        DataVerboseType;                                    // basic data type
+    Word        DateTimeIntervalCode;                               // date-time interval code ????
+    Long        DateTimeIntervalPrec;                               // date-time precision ????
+    Long        NumPrecRadix;                                       // 2 if approx num type or 10 exact num type
+    Word        Scale;                                              // scale, right of decimal
+    
+    void*       DataPtr;                                            // param data
+    Long        DataSize;                                           // size of data buffer
+    Word        FixedPrecScale;                                     // fixed precision scale
+    Word        Nullable;                                           // is it nullable
+    
+    
+    struct IPDItem*     Next;                                 // next parm binding
+    struct IPDItem*     Prev;                                 // prev parm binding
+};
+
+typedef struct IPDItem*    pIPDItem;                   // IPD-Param as pointer type
+
+
+// ----------------------------------------------------------------------------------
+// IMPL PARAM DESC - to hold impl buffers & other details for params
+// ----------------------------------------------------------------------------------
+
+struct ODBCIPD {
+
+    Word            Sign;
+    
+    // header fields
+    //  Word            AllocType;     (read-only)                          // SQL_DESC_ALLOC_TYPE
+    UWord*          ArrayStatusPtr;                                     // SQL_DESC_ARRAY_STATUS_PTR
+    Word            DescCount;                                          // SQL_DESC_COUNT
+    ULong*          RowsProcessedPtr;                                   // SQL_DESC_ROWS_PROCESSED_PTR
+    
+    // rows for binding each col
+    pIPDItem BindParams;                                       // param bindings
+    
+    // container
+    pODBCStmt    Stmt;                                               // container statememt
+};
+
+
+typedef struct ODBCIPD*      pODBCIPD;                        // IPD as pointer type
+
+
+// STATEMENT
+
+// ----------------------------------------------------------------------------------
+// STATEMENT - a single sql stmt scoped within a CONNECTION and part of link list
+// ----------------------------------------------------------------------------------
+
+struct ODBCStmt {
+
+    Word            Sign;                                           // structure signature
+    
+    // Attributes
+    ULong           AsyncEnable;
+    ULong           Concurrency;
+    ULong           CursorScroll;
+    ULong           CursorSensitivity;
+    ULong           CursorType;
+    ULong           AutoIPD;
+    ULong           KeysetSize;
+    ULong           MetaDataID;
+    ULong           NoScan;
+    ULong           QryTimeout;
+    ULong           RetrieveData;
+    
+    wchar_t*        Stmt;                                           // SQL statement
+    Long            StmtLen;                                        // length of statement
+    bool            Prepared;                                       // is it prepared
+    
+    // RESPONSE
+    Word
+    RespType;                                       // Response type, like fault, result-set, count etc etc
+    SQLRowContent*  CurRowsetStartRow;                              // start of current rowset
+    Long            CurRowsetStartRowPos;                           // absolute position
+    SQLRowContent*  CurRowsetEndRow;                                // end of current rowset
+    Long            CurRowsetEndRowPos;                             // absolute position
+    Long            RowCount;                                       // total number of rows
+    
+    // DESCRIPTORS
+    ODBCARD      ARD;                                            // application row descriptor
+    ODBCIRD      IRD;                                            // implementation row descriptor
+    
+    ODBCAPD      APD;                                            // application parm descriptor
+    ODBCIPD      IPD;                                            // implementation parm descriptor
+    
+    // DIAG & LINKS
+    ODBCDiag     Diag;                                           // diagnostic details
+    
+    pODBCConn    Conn;                                           // container connection
+    
+    // other stmt attributes
+    // state of stmt if required separately
+    
+    struct ODBCStmt*     Next;                                   // next statement
+    struct ODBCStmt*     Prev;                                   // prev statement
+};
+
+
+// CONNECTION or DBC
+
+// ----------------------------------------------------------------------------------
+// CONNECTION - a single connection to server scoped within environment & part of link-list
+// ----------------------------------------------------------------------------------
+
+struct ODBCConn {
+
+    Word            Sign;                                                   // structure signature
+    
+    // Attributes
+    ULong                   AccessMode;
+    ULong                   AutoIPD;
+    ULong                   AsyncEnable;
+    ULong                   AutoCommit;
+    ULong                   TimeOut;
+    ULong                   LoginTimeOut;
+    ULong                   MetaDataID;
+    ULong                   ODBCCursors;
+    ULong                   Window;
+    ULong                   TxnIsolation;
+    ULong                   MaxRows;
+    ULong                   QueryTimeout;
+    
+    StrPtr                  ConnectStr;                                     // connection string, the full connection string
+    StrPtr                  Server;                                         // server name/address
+    ULong                   ServerPort;                                     // server port
+    StrPtr                  Project;                                        // name of database
+    StrPtr                  UserName;                                       // user name
+    StrPtr                  Password;                                       // password
+    
+    bool                    IsConnected;                                    // connection checked
+    pODBCStmt            Stmts;                                          // all stmts within connection
+    ODBCDiag             Diag;                                           // diagnostic details
+    pODBCEnv             Env;                                            // environment
+    
+    struct ODBCConn*     Next;                                           // next connection
+    struct ODBCConn*     Prev;                                           // prev connection
+    
+    std::unique_ptr<MetadataResponse> meta;                                 // ACTUAL metadata returned from REST Server
+};
+
+
+// ENVIRONMENT
+
+// ----------------------------------------------------------------------------------
+// ENVIRONMENT - maximum window for an application into the ODBC driver
+// ----------------------------------------------------------------------------------
+
+struct ODBCEnv {
+
+    Word            Sign;                                      // structure signature
+    
+    pODBCConn    Conns;                                     // all connections within env
+    
+    ODBCDiag     Diag;                                      // diagnostic messages
+    
+    ULong           AttrODBCVersion;                            // SQL_ATTR_ODBC_VERSION                200
+    ULong           AttrConnPooling;                            // SQL_ATTR_CONNECTION_POOLING          201
+    ULong           AttrCPMatch;                                // SQL_ATTR_CP_MATCH                    202
+    ULong           AttrOutputNTS;                              // SQL_ATTR_OUTPUT_NTS
+};
+
+// ----------------------------------------------------------------------------------
+// Key-value pair - to hold a single key-value pair
+// ----------------------------------------------------------------------------------
+
+struct ODBCKV {
+    StrPtr      key;
+    StrPtr      value;
+};
+
+// ------------------------- other global variables ---------------------------
+extern  HINSTANCE   ghInstDLL;
+
+extern  Long        gLogFile;
+extern  Word        gLogUsage;
+
+// -------------------------------- defines -----------------------------------
+#define DEFAULT_PORT            443
+
+// --------------------- defines for connection properties --------------------
+#define     CONN_PROP_SERVER        100
+#define     CONN_PROP_PORT          101
+#define     CONN_PROP_PROJECT       102
+#define     CONN_PROP_UID           103
+#define     CONN_PROP_PWD           104
+
+// ------------------------- defines for log system ---------------------------
+#ifdef _DEBUG
+
+#define __ODBCLOG(x)          (x)
+#define __ODBCLOGSTART()      _ODBCLogStart()
+#define __ODBCLOGEND(f)       _ODBCLogStop(f)
+
+#else
+
+#define __ODBCLOG(x)          (x)
+#define __ODBCLOGSTART()
+#define __ODBCLOGEND(f)
+
+#endif
+
+// ------------ allow popup in non-debug also for the time being --------------
+#define __ODBCPOPMSG(x)       (x)
+
+// ---------------------------- diag defines ----------------------------------
+#define _DIAGSTMT(x)            ( &(((pODBCStmt)(x))->Diag))
+#define _DIAGCONN(x)            ( &(((pODBCConn)(x))->Diag))
+#define _DIAGENV(x)             ( &(((pODBCEnv)(x))->Diag))
+
+// --------------------------- descriptor defines  ----------------------------
+#define _DESCTYPE(x)            ( *(( Word* )x) )
+
+// --------------------------- checking handles -------------------------------
+#define __CHK_HANDLE(h,t,r)   { \
+        if(!(h)) { __ODBCPOPMSG(_ODBCPopMsg("Null handle!!!")); return r; } \
+        else if((h) && *(( Word* )(h)) != t ) { __ODBCPOPMSG(_ODBCPopMsg("Handle type does not match!!!")); return r; } \
+    }
+
+// ---------------------------- diag functions --------------------------------
+pODBCDiagRow     _SQLPutDiagRow ( pODBCDiag pDiag, StrPtr pFunc, StrPtr pState, Long pNativeErrorCode,
+                                  StrPtr pMsgArgs, va_list pArgs );
+eGoodBad            _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFunc, StrPtr pState,
+                                     Long pNativeErrorCode, StrPtr pMsgArgs, ... );
+eGoodBad            _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFunc, StrPtr pState,
+                                     Long pNativeErrorCode, Long pRow, Long pCol, StrPtr pMsgArgs, ... );
+eGoodBad            _SQLFreeDiag ( pODBCDiag pHandle );
+pODBCDiagRow     _SQLGetDiagRow ( pODBCDiag pHandle, Word pRowNum );
+
+// -------------------------------- debug functions ---------------------------
+enum            LogLevel                        {LogLevel_DEBUG, LogLevel_INFO, LogLevel_WARN, LogLevel_ERROR, LogLevel_FATAL};
+
+void            _ODBCLogStart ( void );
+void            _ODBCLogStop ( int pForce );
+void            _ODBCLogMsg ( LogLevel level, const char* s, ... );
+void            _ODBCLogMsg ( LogLevel level, const wchar_t* textW );
+void            _ODBCPopMsg ( const char* s, ... );
+void            __ODBCPopMsg ( const char* s, ... );
+
+// ------------------------------ data type functions -------------------------
+Word                _SQLColDataType ( CStrPtr* pDataType );
+eGoodBad            _SQLCheckDataType ( Word pDataType );
+eGoodBad            _SQLCheckIntervalCode ( Word pIntervalCode );
+eGoodBad            _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* pVerboseDataType,
+                                      Word* pConciseDataType, Word* pDateTimeIntervalCode );
+
+// ---------------------------- descriptor functions --------------------------
+pARDItem     _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum );
+pAPDItem     _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum );
+pIRDItem     _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum );
+pIPDItem     _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum );
+
+eGoodBad            _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum );
+
+eGoodBad            _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem );
+
+eGoodBad            _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem );
+
+eGoodBad            _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem );
+
+RETCODE SQL_API     _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetARDItemField ( const pODBCARD pDesc, const pARDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr );
+
+RETCODE SQL_API     _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr );
+
+RETCODE SQL_API     _SQLSetIRDField ( pODBCIRD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetIRDItemField ( pODBCIRD pDesc, pIRDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetIRDField ( const pODBCIRD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr , bool isANSI );
+
+RETCODE SQL_API     _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr );
+
+RETCODE SQL_API     _SQLFreeARDContent ( const pODBCARD pDesc );
+RETCODE SQL_API     _SQLFreeAPDContent ( const pODBCAPD pDesc );
+RETCODE SQL_API     _SQLFreeIRDContent ( const pODBCIRD pDesc );
+RETCODE SQL_API     _SQLFreeIPDContent ( const pODBCIPD pDesc );
+
+eGoodBad            _SQLAttachARDItem ( pODBCARD pDesc, pARDItem pDescItem );
+eGoodBad            _SQLDetachARDItem ( pODBCARD pDesc, pARDItem pDescItem );
+
+eGoodBad            GetIRDDataTypeDefaults ( CStrPtr pDataType, Word* pSqlDataType, Word* pNativeDataType,
+                                             Word* pPrecision, Word* pScale, Long* pLength, Long* pRadix );
+eGoodBad            GetIRDColDescInfo ( SelectedColumnMeta* pColDesc, Word* pDataType, Word* pPrecision, Word* pScale,
+                                        Long* pLength );
+
+// ------------------------- execution function -------------------------------
+RETCODE SQL_API     _SQLExecStmtFromReq ( pODBCStmt pStmt, bool pPrepared );
+eGoodBad            PutRespToStmt ( pODBCStmt pStmt, std::unique_ptr<SQLResponse> resp );
+
+// -------------------------- utility functions -------------------------------
+RETCODE SQL_API     _SQLCopyCharData ( pODBCDiag pDiag, void* pDataPtr, Long pDataBufSize, void* pSizePtr,
+                                       Word pSizePtrSize, CStrPtr pSrcData, Long pSrcDataSize );
+RETCODE SQL_API     _SQLCopyWCharData ( pODBCDiag pDiag, void* pDataPtr, Long pDataBufSize, void* pSizePtr,
+                                        Word pSizePtrSize, CStrPtr pSrcData, Long pSrcDataSize );
+RETCODE SQL_API     _SQLCopyWCharDataW ( pODBCDiag pDiag, void* pDataPtr, Long pDataBufSize, void* pSizePtr,
+                                         Word pSizePtrSize, const wchar_t* pSrcData, Long pSrcDataSize );
+Word                _SQLCopyNumData ( pODBCDiag pDiag, void* pTgtDataPtr, Word pTgtDataType, CStrPtr pSrcData,
+                                      Word pSrcDataType, Long* pTgtDataSizePtr );
+Word                _SQLCopyDateTimeData ( pODBCDiag pDiag, void* pTgtDataPtr, Word pTgtDataType, CStrPtr pSrcData,
+                                           Word pSrcDataType );
+
+// -------------------------- DSN config functions -------------------------------
+eGoodBad    SetConnProp ( pODBCConn pConn, Word pPropID, void* pPropValue );
+eGoodBad    LoadODBCINIDataToConn ( pODBCConn pConn );
+eGoodBad    CvtStrToKeyValues ( CStrPtr pStr, Word pMaxLen, Word* pNumPair, struct ODBCKV** pKV );
+RETCODE     TryFetchMetadata ( pODBCConn pConn );
+RETCODE     TryAuthenticate ( pODBCConn pConn );
+void        SetCurrentDSN ( char* connStr, char* logFunc );
+bool        FindInKeyValues ( CStrPtr pKey, CStrPtr pValue, struct ODBCKV* pKV, Word pItems, Word* pPosition );
+void        FreeGenODBCKeyValues ( ODBCKV* keyvalues, int pairs );
+RETCODE SQL_API _SQLDisconnect ( pODBCConn pHandle );

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/TypeConvertion.h
----------------------------------------------------------------------
diff --git a/odbc/Driver/TypeConvertion.h b/odbc/Driver/TypeConvertion.h
new file mode 100644
index 0000000..3b713f9
--- /dev/null
+++ b/odbc/Driver/TypeConvertion.h
@@ -0,0 +1,539 @@
+enum JDBCTypes
+{
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>BIT</code>.
+	*/
+	BIT = -7,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>TINYINT</code>.
+	*/
+	TINYINT = -6,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>SMALLINT</code>.
+	*/
+	SMALLINT = 5,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>INTEGER</code>.
+	*/
+	INTEGER = 4,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>BIGINT</code>.
+	*/
+	BIGINT = -5,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>FLOAT</code>.
+	*/
+	FLOAT = 6,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>REAL</code>.
+	*/
+	REAL = 7,
+
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>DOUBLE</code>.
+	*/
+	DOUBLE = 8,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>NUMERIC</code>.
+	*/
+	NUMERIC = 2,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>DECIMAL</code>.
+	*/
+	DECIMAL = 3,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>CHAR</code>.
+	*/
+	CHAR = 1,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>VARCHAR</code>.
+	*/
+	VARCHAR = 12,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>LONGVARCHAR</code>.
+	*/
+	LONGVARCHAR = -1,
+
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>DATE</code>.
+	*/
+	DATE = 91,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>TIME</code>.
+	*/
+	TIME = 92,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>TIMESTAMP</code>.
+	*/
+	TIMESTAMP = 93,
+
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>BINARY</code>.
+	*/
+	BINARY = -2,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>VARBINARY</code>.
+	*/
+	VARBINARY = -3,
+
+	/**
+	* <P>The constant in the Java programming language, sometimes referred
+	* to as a type code, that identifies the generic SQL type 
+	* <code>LONGVARBINARY</code>.
+	*/
+	LONGVARBINARY = -4,
+
+	/**
+	* <P>The constant in the Java programming language
+	* that identifies the generic SQL value 
+	* <code>NULL</code>.
+	*/
+	NULL = 0,
+
+	/**
+	* The constant in the Java programming language that indicates
+	* that the SQL type is database-specific and
+	* gets mapped to a Java object that can be accessed via
+	* the methods <code>getObject</code> and <code>setObject</code>.
+	*/
+	OTHER = 1111,
+
+
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>JAVA_OBJECT</code>.
+	* @since 1.2
+	*/
+	JAVA_OBJECT = 2000,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>DISTINCT</code>.
+	* @since 1.2
+	*/
+	DISTINCT = 2001,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>STRUCT</code>.
+	* @since 1.2
+	*/
+	STRUCT = 2002,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>ARRAY</code>.
+	* @since 1.2
+	*/
+	ARRAY = 2003,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>BLOB</code>.
+	* @since 1.2
+	*/
+	BLOB = 2004,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>CLOB</code>.
+	* @since 1.2
+	*/
+	CLOB = 2005,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type
+	* <code>REF</code>.
+	* @since 1.2
+	*/
+	REF = 2006,
+
+	/**
+	* The constant in the Java programming language, somtimes referred to
+	* as a type code, that identifies the generic SQL type <code>DATALINK</code>.
+	*
+	* @since 1.4
+	*/
+	DATALINK = 70,
+
+	/**
+	* The constant in the Java programming language, somtimes referred to
+	* as a type code, that identifies the generic SQL type <code>BOOLEAN</code>.
+	*
+	* @since 1.4
+	*/
+	BOOLEAN = 16,
+
+	//------------------------- JDBC 4.0 -----------------------------------
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type <code>ROWID</code>
+	* 
+	* @since 1.6
+	*
+	*/
+	ROWID = -8,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type <code>NCHAR</code>
+	*
+	* @since 1.6
+	*/
+	NCHAR = -15,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type <code>NVARCHAR</code>.
+	*
+	* @since 1.6
+	*/
+	NVARCHAR = -9,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type <code>LONGNVARCHAR</code>.
+	*
+	* @since 1.6
+	*/
+	LONGNVARCHAR = -16,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type <code>NCLOB</code>.
+	*
+	* @since 1.6
+	*/
+	NCLOB = 2011,
+
+	/**
+	* The constant in the Java programming language, sometimes referred to
+	* as a type code, that identifies the generic SQL type <code>XML</code>.
+	*
+	* @since 1.6 
+	*/
+	SQLXML = 2009
+};
+
+enum ODBCTypes
+{
+	// Summary:
+	//     Maps to SQL_GUID.
+	Guid = -11,
+	//
+	// Summary:
+	//     Maps to SQL_WLONGVARCHAR.  Native Type: System.String
+	WLongVarChar = -10,
+	//
+	// Summary:
+	//     Maps to SQL_WVARCHAR.  Native Type: System.String
+	WVarChar = -9,
+	//
+	// Summary:
+	//     Maps to SQL_WCHAR.  Native Type: System.String
+	WChar = -8,
+	//
+	// Summary:
+	//     Maps to SQL_BIT.  Native Type: System.Boolean
+	Bit = -7,
+	//
+	// Summary:
+	//     Maps to SQL_TINYINT.  Native Type: System.SByte
+	TinyInt = -6,
+	//
+	// Summary:
+	//     Maps to SQL_BIGINT.  Native Type: System.Int64
+	BigInt = -5,
+	//
+	// Summary:
+	//     Maps to SQL_LONGVARBINARY.  Native Type: array[System.Byte]
+	LongVarBinary = -4,
+	//
+	// Summary:
+	//     Maps to SQL_VARBINARY.  Native Type: array[System.Byte]
+	VarBinary = -3,
+	//
+	// Summary:
+	//     Maps to SQL_BINARY.  Native Type: array[System.Byte]
+	Binary = -2,
+	//
+	// Summary:
+	//     Maps to SQL_LONGVARCHAR.  Native Type: System.String
+	LongVarChar = -1,
+	//
+	// Summary:
+	//     Maps to SQL_CHAR.  Native Type: System.String
+	Char = 1,
+	//
+	// Summary:
+	//     Maps to SQL_NUMERIC.  Native Type: System.Decimal
+	Numeric = 2,
+	//
+	// Summary:
+	//     Maps to SQL_DECIMAL.  Native Type: System.Decimal
+	Decimal = 3,
+	//
+	// Summary:
+	//     Maps to SQL_INTEGER.  Native Type: System.Int32
+	Integer = 4,
+	//
+	// Summary:
+	//     Maps to SQL_SMALLINT.  Native Type: System.Int16
+	SmallInt = 5,
+	//
+	// Summary:
+	//     Maps to SQL_FLOAT.  Native Type: System.Double
+	Float = 6,
+	//
+	// Summary:
+	//     Maps to SQL_REAL.  Native Type: System.Single
+	Real = 7,
+	//
+	// Summary:
+	//     Maps to SQL_DOUBLE.  Native Type: System.Double
+	Double = 8,
+	//
+	// Summary:
+	//     Maps to SQL_DATETIME. This type should NOT be used with CreateTypeMetadata,
+	//     as it is not a valid type identifier.
+	DateTime = 9,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL. Not a valid type identifier.
+	Interval = 10,
+	//
+	// Summary:
+	//     Maps to SQL_VARCHAR.  Native Type: System.String
+	VarChar = 12,
+	//
+	// Summary:
+	//     Does not map to an ODBC SQL type.  Native Type: System.DateTimeOffset
+	DateTimeOffset = 36,
+	//
+	// Summary:
+	//     Maps to SQL_TYPE_DATE.  Native Type: System.DateTime
+	Type_Date = 91,
+	//
+	// Summary:
+	//     Maps to SQL_TYPE_TIME.  Native Type: System.DateTime
+	Type_Time = 92,
+	//
+	// Summary:
+	//     Maps to SQL_TYPE_TIMESTAMP.  Native Type: System.DateTime
+	Type_Timestamp = 93,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_YEAR.  Native Type: Simba.DotNetDSI.DataEngine.DSIMonthSpan
+	Interval_Year = 101,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_MONTH.  Native Type: Simba.DotNetDSI.DataEngine.DSIMonthSpan
+	Interval_Month = 102,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_DAY.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Day = 103,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_HOUR.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Hour = 104,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_MINUTE.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Minute = 105,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Second = 106,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_YEAR_TO_MONTH.  Native Type: Simba.DotNetDSI.DataEngine.DSIMonthSpan
+	Interval_Year_To_Month = 107,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_DAY_TO_HOUR.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Day_To_Hour = 108,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_DAY_TO_MINUTE.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Day_To_Minute = 109,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_DAY_TO_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Day_To_Second = 110,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_HOUR_TO_MINUTE.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Hour_To_Minute = 111,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_HOUR_TO_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Hour_To_Second = 112,
+	//
+	// Summary:
+	//     Maps to SQL_INTERVAL_MINUTE_TO_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+	Interval_Minute_To_Second = 113,
+};
+
+ODBCTypes JDBC2ODBC(JDBCTypes jtype)
+{
+	switch (jtype)
+	{
+	case BIT:
+		return ODBCTypes::Bit;
+		break;
+	case TINYINT:
+		return ODBCTypes::TinyInt;
+		break;
+	case SMALLINT:
+		return ODBCTypes::SmallInt;
+		break;
+	case INTEGER:
+		return ODBCTypes::Integer;
+		break;
+	case BIGINT:
+		return ODBCTypes::BigInt;
+		break;
+	case FLOAT:
+		return ODBCTypes::Float;
+		break;
+	case REAL:
+		return ODBCTypes::Real;
+		break;
+	case DOUBLE:
+		return ODBCTypes::Double;
+		break;
+	case NUMERIC:
+		return ODBCTypes::Numeric;
+		break;
+	case DECIMAL:
+		return ODBCTypes::Decimal;
+		break;
+	case CHAR:
+		return ODBCTypes::Char;
+		break;
+	case VARCHAR:
+		return ODBCTypes::VarChar;
+		break;
+	case LONGVARCHAR:
+		return ODBCTypes::LongVarChar;
+		break;
+	case DATE:
+		return ODBCTypes::Type_Date;
+		break;
+	case TIME:
+		return ODBCTypes::Type_Time;
+		break;
+	case TIMESTAMP:
+		return ODBCTypes::Type_Timestamp;
+		break;
+	case BINARY:
+		return ODBCTypes::Binary;
+		break;
+	case VARBINARY:
+		return ODBCTypes::VarBinary;
+		break;
+	case LONGVARBINARY:
+		return ODBCTypes::LongVarBinary;
+		break;
+	/*case NULL:
+		break;
+	case OTHER:
+		break;
+	case JAVA_OBJECT:
+		break;
+	case DISTINCT:
+		break;
+	case STRUCT:
+		break;
+	case ARRAY:
+		break;
+	case BLOB:
+		break;
+	case CLOB:
+		break;
+	case REF:
+		break;
+	case DATALINK:
+		break;
+	case BOOLEAN:
+		break;
+	case ROWID:
+		break;
+	case NCHAR:
+		break;
+	case NVARCHAR:
+		break;
+	case LONGNVARCHAR:
+		break;
+	case NCLOB:
+		break;
+	case SQLXML:
+		break;*/
+	default:
+		throw;
+		break;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/Win32/Release/Intermediate/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Driver/Win32/Release/Intermediate/.gitignore b/odbc/Driver/Win32/Release/Intermediate/.gitignore
new file mode 100644
index 0000000..62bb106
--- /dev/null
+++ b/odbc/Driver/Win32/Release/Intermediate/.gitignore
@@ -0,0 +1,2 @@
+*.lastbuildstate
+*.res

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/driver.DEF
----------------------------------------------------------------------
diff --git a/odbc/Driver/driver.DEF b/odbc/Driver/driver.DEF
new file mode 100644
index 0000000..bade189
--- /dev/null
+++ b/odbc/Driver/driver.DEF
@@ -0,0 +1,85 @@
+LIBRARY   driver
+EXPORTS
+	SQLAllocConnect
+	SQLAllocEnv
+	SQLAllocStmt
+	SQLAllocHandle
+	SQLFreeConnect
+	SQLFreeEnv
+	SQLFreeStmt
+	SQLBindCol
+	SQLCancel
+	SQLConnect
+	SQLConnectW
+	SQLDescribeCol
+	SQLDescribeColW
+	SQLDisconnect
+	SQLExecDirect
+	SQLExecDirectW
+	SQLExecute
+	SQLExtendedFetch
+	SQLFetch
+	SQLGetCursorName
+	SQLNumResultCols
+	SQLPrepare
+	SQLPrepareW
+	SQLRowCount
+	SQLSetCursorName
+	SQLColumns
+	SQLColumnsW
+	SQLDriverConnect
+	SQLDriverConnectW
+	SQLGetData
+	SQLGetInfo
+	SQLGetInfoW
+	SQLGetTypeInfo
+	SQLParamData
+	SQLPutData
+	SQLStatistics
+	SQLTables
+	SQLTablesW
+	SQLBrowseConnect
+	SQLColumnPrivileges
+	SQLDescribeParam
+	SQLForeignKeys
+	SQLForeignKeysW
+	SQLMoreResults
+	SQLNativeSql
+	SQLNumParams
+	SQLPrimaryKeys
+	SQLPrimaryKeysW
+	SQLProcedureColumns
+	SQLProcedures
+	SQLSetPos
+	SQLTablePrivileges
+	SQLBindParameter
+	SQLCloseCursor
+	SQLColAttribute
+	SQLColAttributeW
+	SQLCopyDesc
+	SQLEndTran
+	SQLFetchScroll
+	SQLFreeHandle
+	SQLGetConnectAttr
+	SQLGetConnectAttrW
+	SQLGetDescField
+	SQLGetDescFieldW
+	SQLGetDescRec
+	SQLGetDiagField
+	SQLGetDiagFieldW
+	SQLGetDiagRec
+	SQLGetDiagRecW
+	SQLGetEnvAttr
+	SQLGetStmtAttr
+	SQLGetStmtAttrW
+	SQLSetConnectAttr
+	SQLSetConnectAttrW
+	SQLSetDescField
+	SQLSetDescFieldW
+	SQLSetDescRec
+	SQLSetEnvAttr
+	SQLSetStmtAttr
+	SQLSetStmtAttrW
+	SQLBulkOperations
+	SQLSpecialColumns
+	ConfigDSN

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/driver.dsp
----------------------------------------------------------------------
diff --git a/odbc/Driver/driver.dsp b/odbc/Driver/driver.dsp
new file mode 100644
index 0000000..3849235
--- /dev/null
+++ b/odbc/Driver/driver.dsp
@@ -0,0 +1,247 @@
+# Microsoft Developer Studio Project File - Name="driver" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=driver - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "driver.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "driver.mak" CFG="driver - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "driver - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "driver - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "driver - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "driver_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "." /I "..\common" /I "..\common\xml" /I "..\common\sock" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "driver_EXPORTS" /D "_XML_STREAM_SOCK_CLIENT" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 odbccp32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib mswsock.lib ws2_32.lib /nologo /dll /machine:I386
+
+!ELSEIF  "$(CFG)" == "driver - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "driver_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "." /I "..\common" /I "..\common\xml" /I "..\common\sock" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "driver_EXPORTS" /D "_XML_STREAM_SOCK_CLIENT" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mswsock.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "driver - Win32 Release"
+# Name "driver - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\Common\common.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_ALLOC.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_ATTR.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_CONN.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_CTLG.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_DESC.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_DIAG.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_DTYPE.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_EXEC.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_FETCH.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_INFO.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_PARAM.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_SOAP.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GO_UTILS.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\GODBC32.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=.\driver.DEF
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\SOCK\SOCK_CLI.CPP
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\XMLLEX.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\XMLNLST.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\XMLPARSE.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\XMLPHELP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\XMLTREE.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\Common\char.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\common.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\GODBC.H
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\SOCK\SOCK_CLI.HPP
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\SOCK\SOCK_CLI.HXX
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\types.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\xmllex.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\XMLPARSE.H
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\xmlparse.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\xmlparse.hxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\xmltree.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\Common\XML\xmltree.hxx
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\GODBC.RC
+# End Source File
+# End Group
+# End Target
+# End Project

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/driver.vcxproj
----------------------------------------------------------------------
diff --git a/odbc/Driver/driver.vcxproj b/odbc/Driver/driver.vcxproj
new file mode 100644
index 0000000..90533a9
--- /dev/null
+++ b/odbc/Driver/driver.vcxproj
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Template|Win32">
+      <Configuration>Template</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Template|x64">
+      <Configuration>Template</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <SccProjectName />
+    <SccLocalPath />
+    <ProjectGuid>{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}</ProjectGuid>
+    <ProjectName>Driver</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Template|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\Intermediate\</IntDir>
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Win32\Release;$(SolutionDir)\Common\$(Platform)\$(Configuration)\;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(SolutionDir)\Common\;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Release64;$(SolutionDir)\Common\$(Platform)\$(Configuration)\;$(LibraryPath)</LibraryPath>
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\Intermediate\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\Intermediate\</IntDir>
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(SolutionDir)\Common\;C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)</IncludePath>
+    <LibraryPath>$(SolutionDir)\Common\$(Platform)\$(Configuration)\;C:\Program Files %28x86%29\Visual Leak Detector\lib\Win32;$(CPPREST_HOME)\Binaries\Win32\Debug;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(SolutionDir)\Common\;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Debug64;$(SolutionDir)\Common\$(Platform)\$(Configuration)\;$(LibraryPath)</LibraryPath>
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\Intermediate\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\Intermediate\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|x64'">
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\Intermediate\</IntDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+      <StringPooling>true</StringPooling>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <Optimization>MaxSpeed</Optimization>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;SHIPPING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\driver.pch</PrecompiledHeaderOutputFile>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+    </ClCompile>
+    <Midl>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <TypeLibraryName>.\Release\driver.tlb</TypeLibraryName>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+      <TargetEnvironment>Win32</TargetEnvironment>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0409</Culture>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ResourceCompile>
+    <Bscmake>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>.\Release\driver.bsc</OutputFile>
+    </Bscmake>
+    <Link>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <LinkDLL>true</LinkDLL>
+      <SubSystem>Console</SubSystem>
+      <OutputFile>$(Platform)\$(Configuration)\driver.dll</OutputFile>
+      <ImportLibrary>$(Platform)\$(Configuration)\driver.lib</ImportLibrary>
+      <AdditionalDependencies>odbccp32.lib;odbc32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110_2_0.lib;Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <ModuleDefinitionFile>.\driver.DEF</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <PostBuildEvent>
+      <Command>
+      </Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+      <StringPooling>true</StringPooling>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <Optimization>MaxSpeed</Optimization>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;SHIPPING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\driver.pch</PrecompiledHeaderOutputFile>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+    </ClCompile>
+    <Midl>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <TypeLibraryName>.\Release\driver.tlb</TypeLibraryName>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0409</Culture>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ResourceCompile>
+    <Bscmake>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>.\Release\driver.bsc</OutputFile>
+    </Bscmake>
+    <Link>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <LinkDLL>true</LinkDLL>
+      <SubSystem>Console</SubSystem>
+      <OutputFile>$(Platform)\$(Configuration)\driver.dll</OutputFile>
+      <ImportLibrary>$(Platform)\$(Configuration)\driver.lib</ImportLibrary>
+      <AdditionalDependencies>odbccp32.lib;odbc32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110_2_0.lib;Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <ModuleDefinitionFile>.\driver.DEF</ModuleDefinitionFile>
+    </Link>
+    <PostBuildEvent>
+      <Command>
+      </Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+      <FunctionLevelLinking>false</FunctionLevelLinking>
+      <Optimization>Disabled</Optimization>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <WarningLevel>Level3</WarningLevel>
+      <MinimalRebuild>true</MinimalRebuild>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+      <AdditionalIncludeDirectories>.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\driver.pch</PrecompiledHeaderOutputFile>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+    </ClCompile>
+    <Midl>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <TypeLibraryName>.\driver.tlb</TypeLibraryName>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+      <TargetEnvironment>Win32</TargetEnvironment>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0409</Culture>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ResourceCompile>
+    <Bscmake>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>.\driver.bsc</OutputFile>
+    </Bscmake>
+    <Link>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <LinkDLL>true</LinkDLL>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <OutputFile>$(Platform)\$(Configuration)\driver.dll</OutputFile>
+      <ImportLibrary>$(Platform)\$(Configuration)\driver.lib</ImportLibrary>
+      <AdditionalDependencies>cpprest110d_2_0.lib;odbc32.lib;odbccp32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <ModuleDefinitionFile>.\driver.DEF</ModuleDefinitionFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+      <FunctionLevelLinking>false</FunctionLevelLinking>
+      <Optimization>Disabled</Optimization>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalIncludeDirectories>.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\driver.pch</PrecompiledHeaderOutputFile>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+    </ClCompile>
+    <Midl>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <TypeLibraryName>.\driver.tlb</TypeLibraryName>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0409</Culture>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ResourceCompile>
+    <Bscmake>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>.\driver.bsc</OutputFile>
+    </Bscmake>
+    <Link>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <LinkDLL>true</LinkDLL>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <OutputFile>$(Platform)\$(Configuration)\driver.dll</OutputFile>
+      <ImportLibrary>$(Platform)\$(Configuration)\driver.lib</ImportLibrary>
+      <AdditionalDependencies>odbc32.lib;odbccp32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110d_2_0.lib;Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <ModuleDefinitionFile>.\driver.DEF</ModuleDefinitionFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\driver.pch</PrecompiledHeaderOutputFile>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(Platform)\$(Configuration)\driver.dll</OutputFile>
+      <ImportLibrary>$(Platform)\$(Configuration)\driver.lib</ImportLibrary>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Template|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\driver.pch</PrecompiledHeaderOutputFile>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(Platform)\$(Configuration)\driver.dll</OutputFile>
+      <ImportLibrary>$(Platform)\$(Configuration)\driver.lib</ImportLibrary>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="KO_CONFIG.CPP" />
+    <ClCompile Include="KO_ALLOC.CPP" />
+    <ClCompile Include="KO_ATTR.CPP" />
+    <ClCompile Include="KO_CONN.CPP" />
+    <ClCompile Include="KO_CTLG.CPP" />
+    <ClCompile Include="KO_DESC.CPP" />
+    <ClCompile Include="KO_DIAG.CPP" />
+    <ClCompile Include="KO_DTYPE.CPP" />
+    <ClCompile Include="KO_EXEC.CPP" />
+    <ClCompile Include="KO_FETCH.CPP" />
+    <ClCompile Include="KO_INFO.CPP" />
+    <ClCompile Include="KO_PARAM.CPP" />
+    <ClCompile Include="KO_UTILS.CPP" />
+    <ClCompile Include="KylinODBC.CPP" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Template|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <CustomBuild Include="driver.DEF" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="KylinODBC.H" />
+    <ClInclude Include="resource.h" />
+    <ClInclude Include="stdafx.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="GODBC.RC" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file



[09/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_FETCH.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_FETCH.CPP b/odbc/Driver/KO_FETCH.CPP
new file mode 100644
index 0000000..5859eb5
--- /dev/null
+++ b/odbc/Driver/KO_FETCH.CPP
@@ -0,0 +1,1213 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_FETCH.CPP
+//
+// Purpose:     Contains function for fetching results.
+//              As explained in the article ODBC has a
+//              defined way in which the data is made available.
+//
+//              1. The client CAN obtain general details
+//              about the result like num of rows etc using
+//              SQLRowCount, SQLNumResultCols.
+//
+//              2. It obtains metadata about the result
+//              more specifically info about columns like
+//              size type etc using SQLColAttribute or
+//              SQLDescribeCol.
+//
+//              3. Then it allocates and bind the buffer
+//              specifying the other info like buffer size
+//              etc for the cols it desires to extract using
+//              SQLBindCol
+//
+//              4. Then it instructs the driver to feed these
+//              buffers using SQLFetch or SQLExtendedFetch.
+//
+//              5. This is the general way. In case the data
+//              involved is quite large, it can be extracted
+//              piecemeal using SQLGetData. SQLPutData is the
+//              funcion corresponding to SQLGetData to specify
+//              large param values say storing images etc.
+//              Since I have not implemented params or long
+//              data read write in this sample, SQLPutData resides
+//              in this file with SQLGetData.
+//
+//              All fetch occur via the local function _SQLFetch.
+//              Internally the fetch is executed in the following
+//              way.
+//              1. The rowdesc from server (IRD) and appl (ARD )
+//                 is obtained.
+//              2. Main loop to fetch rowset number of rows. More
+//                 than one row can be fetched at a time. The movement
+//                 in resulset is done using _SQLFetchMoveNext.
+//              3. For each row, loop through each ARD item to
+//                 extract the col(s) required by the client.
+//
+//              SQLColConvert and associated funtions _SQLCopyCharData,
+//              SQLCopyNumData, _SQLCopyDateTimeData r used to perform
+//              necessary conversion between data as recived from the
+//              server and data as required by the client.
+//
+// Exported functions:
+//                       SQLColAttribute
+//                       SQLDescribeCol
+//                       SQLBindCol
+//                       SQLNumResultCols
+//                       SQLRowCount
+//                       SQLFetch
+//                       SQLExtendedFetch
+//                       SQLFetchScroll
+//                       SQLGetData
+//                       SQLPutData
+//                       SQLMoreResults
+//                       SQLNativeSql
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+#include "Dump.h"
+
+// ------------------------- local functions -----------------------------
+RETCODE SQL_API     _SQLFetch ( pODBCStmt pStmt, Word pFetchOrientation, Long pFetchOffset, ULong* pRowCountPtr,
+                                UWord* pRowStatusArray );
+RETCODE SQL_API     _SQLColConvert ( pODBCStmt pStmt, void* pTgtDataPtr, Long* pTgtDataSizePtr, CStrPtr pSrcColData,
+                                     pARDItem pARDCol , bool isSigned );
+RETCODE SQL_API     _SQLFetchMoveNext ( pODBCStmt pStmt );
+RETCODE SQL_API     _SQLResetRowPos ( pODBCStmt pStmt );
+
+SQLRowContent* GetIfExist ( std::vector<SQLRowContent*>& container, int index );
+
+// -----------------------------------------------------------------------
+// to get specific detail//attribute about a col returned from server --- FROM IRD
+// kylin specific
+// -----------------------------------------------------------------------
+
+
+RETCODE  _SQLColAttribute_basic ( SQLHSTMT        pStmt,
+                                  SQLUSMALLINT    pColNum,
+                                  SQLUSMALLINT    pFldID,
+                                  SQLPOINTER      pDataPtr,
+                                  SQLSMALLINT     pDataSize,
+                                  SQLSMALLINT*    pDataSizePtr, // in bytes
+                                  SQLPOINTER      pNumValuePtr ,// integer
+                                  bool isANSI
+                                ) { //if returned data is numeric, feed this
+    Long            n;
+    SQLResponse*    ird;
+    pIRDItem        col;
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // precaution
+    if ( pColNum == 0 ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "bad params" );
+        return SQL_ERROR;
+    }
+    
+    // get the row descriptor obtained with response
+    ird = ( ( ( pODBCStmt ) pStmt )->IRD ).RowDesc.get();
+    
+    // check
+    if ( ird == NULL ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "No resultset or no col descriptors" );
+        return SQL_ERROR;
+    }
+    
+    // find the xth element/col
+    col = _SQLGetIRDItem ( & ( ( ( pODBCStmt ) pStmt )->IRD ), pColNum );
+    
+    // check
+    if ( col == NULL ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "Invalid col num" );
+        return SQL_ERROR;
+    }
+    
+    // get value from descriptor as per field type
+    switch ( pFldID ) {
+        // numeric types clubbed together
+        case SQL_DESC_AUTO_UNIQUE_VALUE:                // is col auto-incrementing
+        case SQL_DESC_CASE_SENSITIVE:                   // is col case-insensitive
+        case SQL_DESC_TYPE:                             // verbose type
+        case SQL_DESC_CONCISE_TYPE:                     // concise type
+        case SQL_DESC_COUNT:                            // no.of highest bound column
+        case SQL_DESC_LENGTH:
+        case SQL_DESC_DISPLAY_SIZE:
+        case SQL_DESC_OCTET_LENGTH:
+        case SQL_DESC_FIXED_PREC_SCALE:
+        case SQL_DESC_NULLABLE:
+        case SQL_DESC_NUM_PREC_RADIX:
+        case SQL_DESC_PRECISION:
+        case SQL_DESC_SCALE:
+        case SQL_DESC_SEARCHABLE:
+        case SQL_DESC_UNNAMED:
+        case SQL_DESC_UNSIGNED:
+        case SQL_DESC_UPDATABLE:
+            _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pNumValuePtr, -1, NULL , isANSI );
+            break;
+            
+        // char types clubbed together
+        
+        case SQL_DESC_BASE_TABLE_NAME:                  // table name for column
+        case SQL_DESC_CATALOG_NAME:                     // database name
+        case SQL_DESC_LITERAL_PREFIX:
+        case SQL_DESC_LITERAL_SUFFIX:
+        case SQL_DESC_LOCAL_TYPE_NAME:
+        case SQL_DESC_TYPE_NAME:
+        case SQL_DESC_SCHEMA_NAME:
+        case SQL_DESC_TABLE_NAME:
+            _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pDataPtr, pDataSize,
+                                  pDataSizePtr ? &n : NULL, isANSI );
+                                  
+            if ( pDataSizePtr )
+            { *pDataSizePtr = ( Word ) n; }
+            
+            break;
+            
+        case SQL_DESC_BASE_COLUMN_NAME:
+        case SQL_DESC_LABEL:
+        case SQL_DESC_NAME:
+            // ////
+            // as a special case the name length may be required without the actual name
+            //////
+            StrPtr cname;
+            Word   cnamesize;
+            
+            if ( pDataPtr ) {
+                cname       = ( StrPtr ) pDataPtr;
+                cnamesize   = pDataSize;
+            }
+            
+            else {
+                cname       = new Char[256];             // arbitary
+                cnamesize   = 255;
+            }
+            
+            _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, cname, cnamesize,
+                                  pDataSizePtr ? &n : NULL, isANSI );
+                                  
+            if ( pDataPtr == NULL )
+            { delete[] cname; }
+            
+            if ( pDataSizePtr )
+            { *pDataSizePtr = ( Word ) n; }
+            
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLColAttribute unknown attr, ColNum: %d, FldID: %d\n", pColNum, pFldID ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+#ifdef _WIN64
+RETCODE SQL_API SQLColAttributeW ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pColNum,
+                                   SQLUSMALLINT    pFldID,
+                                   SQLPOINTER      pDataPtr,
+                                   SQLSMALLINT     pDataSize,
+                                   SQLSMALLINT*    pDataSizePtr,
+                                   SQLLEN*     pNumValuePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) );
+    RETCODE code =  _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr,
+                                             false );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the return code is %d", code ) );
+    return code;
+}
+
+RETCODE SQL_API SQLColAttribute ( SQLHSTMT        pStmt,
+                                  SQLUSMALLINT    pColNum,
+                                  SQLUSMALLINT    pFldID,
+                                  SQLPOINTER      pDataPtr,
+                                  SQLSMALLINT     pDataSize,
+                                  SQLSMALLINT*    pDataSizePtr,
+                                  SQLLEN*      pNumValuePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) );
+    return _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, true );
+}
+
+#else
+RETCODE SQL_API SQLColAttributeW ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pColNum,
+                                   SQLUSMALLINT    pFldID,
+                                   SQLPOINTER      pDataPtr,
+                                   SQLSMALLINT     pDataSize,
+                                   SQLSMALLINT*    pDataSizePtr,
+                                   SQLPOINTER      pNumValuePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) );
+    RETCODE code =  _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr,
+                                             false );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the return code is %d", code ) );
+    return code;
+}
+
+RETCODE SQL_API SQLColAttribute ( SQLHSTMT        pStmt,
+                                  SQLUSMALLINT    pColNum,
+                                  SQLUSMALLINT    pFldID,
+                                  SQLPOINTER      pDataPtr,
+                                  SQLSMALLINT     pDataSize,
+                                  SQLSMALLINT*    pDataSizePtr,
+                                  SQLPOINTER      pNumValuePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) );
+    return _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, true );
+}
+#endif
+
+// ----------------------------------------------------------------------
+// to get the basic set of ARD col attributes, ie details recd. from server --- FROM IRD
+// SQLDescribeCol returns the result descriptor �� column name,type, column size, decimal digits, and nullability (from msdn)
+// kylin specific
+// ----------------------------------------------------------------------
+
+SQLRETURN SQL_API _SQLDescribeCol_basic ( SQLHSTMT        pStmt,
+                                          SQLUSMALLINT    pColNum,
+                                          void*        pColNamePtr,
+                                          SQLSMALLINT     pColNameSize,
+                                          SQLSMALLINT*    pColNameSizePtr,
+                                          SQLSMALLINT*    pDataTypePtr,
+                                          SQLULEN*        pColSizePtr,
+                                          SQLSMALLINT*    pDecimalDigitsPtr,
+                                          SQLSMALLINT*    pNullablePtr ,
+                                          bool isANSI
+                                        ) {
+    Long            n;
+    SQLResponse*        ird;
+    pIRDItem        col;
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // precaution
+    if ( pColNum == 0 ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "bad params" );
+        return SQL_ERROR;
+    }
+    
+    // get the row descriptor obtained with response
+    ird = ( ( ( pODBCStmt ) pStmt )->IRD ).RowDesc.get();
+    
+    // check
+    if ( ird == NULL ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "No resultset or no col descriptors" );
+        return SQL_ERROR;
+    }
+    
+    // find the xth element/col
+    col = _SQLGetIRDItem ( & ( ( ( pODBCStmt ) pStmt )->IRD ), pColNum );
+    
+    // check
+    if ( col == NULL ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "Invalid col num" );
+        return SQL_ERROR;
+    }
+    
+    // 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; }
+        
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "name: %s", pColNamePtr ) );
+    }
+    
+    // COL-DATA TYPE
+    
+    if ( pDataTypePtr ) {
+        _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_CONCISE_TYPE, pDataTypePtr, -1,
+                              NULL, isANSI );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "data type: %d", *pDataTypePtr ) );
+    }
+    
+    // COL-SIZE
+    
+    if ( pColSizePtr ) {
+        _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_LENGTH, pColSizePtr, -1, NULL,
+                              isANSI );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "column size: %d", *pColSizePtr ) );
+    }
+    
+    // COL-DECIMAL
+    
+    if ( pDecimalDigitsPtr ) {
+        _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_SCALE, pDecimalDigitsPtr, -1, NULL,
+                              isANSI );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "decimal scale: %d", *pDecimalDigitsPtr ) );
+    }
+    
+    // COL-NULLABLE
+    
+    if ( pNullablePtr ) {
+        _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL,
+                              isANSI );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "nullable: %d", *pNullablePtr ) );
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDescribeCol returned" ) );
+    return SQL_SUCCESS;
+}
+
+SQLRETURN SQL_API SQLDescribeColW ( SQLHSTMT        pStmt,
+                                    SQLUSMALLINT    pColNum,
+                                    SQLWCHAR*        pColNamePtr,
+                                    SQLSMALLINT     pColNameSize,
+                                    SQLSMALLINT*    pColNameSizePtr,
+                                    SQLSMALLINT*    pDataTypePtr,
+                                    SQLULEN*        pColSizePtr,
+                                    SQLSMALLINT*    pDecimalDigitsPtr,
+                                    SQLSMALLINT*    pNullablePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLDescribeColW. Col: %d, ColNamePtr: %d, ColNameSize: %d, ColNameSizePtr: %d, DataTypePtr: %d, ColSizePtr: %d, DecDigitsPtr: %d, NullPtr: %d",
+                              pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, pDecimalDigitsPtr, pNullablePtr ) );
+    return _SQLDescribeCol_basic ( pStmt, pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr,
+                                   pDecimalDigitsPtr, pNullablePtr , false );
+}
+
+SQLRETURN SQL_API SQLDescribeCol ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pColNum,
+                                   SQLCHAR*        pColNamePtr,
+                                   SQLSMALLINT     pColNameSize,
+                                   SQLSMALLINT*    pColNameSizePtr,
+                                   SQLSMALLINT*    pDataTypePtr,
+                                   SQLULEN*        pColSizePtr,
+                                   SQLSMALLINT*    pDecimalDigitsPtr,
+                                   SQLSMALLINT*    pNullablePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLDescribeCol. Col: %d, ColNamePtr: %d, ColNameSize: %d, ColNameSizePtr: %d, DataTypePtr: %d, ColSizePtr: %d, DecDigitsPtr: %d, NullPtr: %d",
+                              pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, pDecimalDigitsPtr, pNullablePtr ) );
+    return _SQLDescribeCol_basic ( pStmt, pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr,
+                                   pDecimalDigitsPtr, pNullablePtr , true );
+}
+
+// -----------------------------------------------------------------------
+// to bind a column to with details from application --- TO ARD
+// kylin specific, no chagne required
+// -----------------------------------------------------------------------
+
+/*
+
+    From msdn:
+
+    SQLRETURN SQLBindCol(
+    SQLHSTMT       StatementHandle,
+    SQLUSMALLINT   ColumnNumber,
+    SQLSMALLINT    TargetType,
+    SQLPOINTER     TargetValuePtr,
+    SQLLEN         BufferLength,
+    SQLLEN *       StrLen_or_Ind);
+
+*/
+RETCODE SQL_API SQLBindCol ( SQLHSTMT        pStmt,
+                             SQLUSMALLINT    pColNum,
+                             SQLSMALLINT     pDataType,
+                             SQLPOINTER      pDataPtr,
+                             SQLLEN      pDataSize,
+                             SQLLEN*         pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBindCol called, ColNum: %d, TgtType: %d, ValuePtr: %d, Capacity: %d",
+                              pColNum, pDataType, pDataPtr, pDataSize ) );
+    pODBCARD         ard;                            // application row descriptor
+    pARDItem     ardcol;                         // application row descriptor item
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    // extract the appl. row descriptor from stmt
+    ard = & ( ( ( pODBCStmt ) pStmt )->ARD );
+    // get the specified column if already bound
+    ardcol = _SQLGetARDItem ( ard, pColNum );
+    
+    // EXISTS
+    
+    if ( ardcol != NULL ) {
+        // check if total unbind is required
+        if ( pDataPtr == NULL && pDataSizePtr == NULL ) {
+            // detach it from ARD link list
+            _SQLDetachARDItem ( ard, ardcol );
+            // free
+            delete ardcol;
+        }
+        
+        else  {
+            // unbind/rebind col details
+            _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_DATA_PTR, pDataPtr, -1 );
+            _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_CONCISE_TYPE, ( void* ) pDataType, -1 );
+            _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_LENGTH, ( void* ) pDataSize, -1 );
+            _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_OCTET_LENGTH_PTR, pDataSizePtr, -1 );
+            // reset the source data type
+            ardcol->SrcDataType     = 0;
+        }
+        
+        return SQL_SUCCESS;
+    }
+    
+    // DOES NOT EXIST
+    
+    // check for bad params
+    if ( pDataPtr == NULL && pDataSizePtr == NULL ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLBindCol", "01000", -1, "Bad params" );
+        return SQL_ERROR;
+    }
+    
+    // check for bad params
+    else if ( pDataSize < 0 ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLBindCol", "01000", -1, "Invalid buffer length" );
+        return SQL_ERROR;
+    }
+    
+    // CREATE
+    // allocate a new col-item
+    ardcol = new ARDItem;
+    // reset
+    _SQLSetARDItemFieldsDefault ( ardcol, pColNum );
+    // set all values - bind
+    _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_DATA_PTR, pDataPtr, -1 );
+    _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_CONCISE_TYPE, ( void* ) pDataType, -1 );
+    _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_LENGTH, ( void* ) pDataSize, -1 );
+    _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_OCTET_LENGTH_PTR, pDataSizePtr, -1 );
+    // attach it to link list
+    _SQLAttachARDItem ( ard, ardcol );
+    return SQL_SUCCESS;
+}
+
+
+// ---------------------------------------------------------------------
+// to get the number of columns in result --- COUNTING ELEMENTS IN IRD.ROWDESC
+// Kylin specific
+// ---------------------------------------------------------------------
+
+RETCODE SQL_API SQLNumResultCols ( SQLHSTMT pStmt, SQLSMALLINT*  pColCountPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumResultCols called" ) );
+    SQLResponse* rowdesc;
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    // caller safe
+    * ( ( SQLSMALLINT* ) pColCountPtr ) = 0;
+    // get the row desciptor
+    rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get();
+    
+    if ( rowdesc == NULL ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLNumResultCols", "01000", -1, "no resultset or IRD" );
+        return SQL_ERROR;
+    }
+    
+    // count the number of columns
+    * ( ( SQLSMALLINT* ) pColCountPtr ) = ( SQLSMALLINT ) ( rowdesc->columnMetas.size() );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumResultCols called returned: %d",
+                              * ( ( SQLSMALLINT* ) pColCountPtr ) ) );
+    return SQL_SUCCESS;
+}
+
+
+// ----------------------------------------------------------------------
+// to count the number of rows in the current result --- COUNTING ELEMENTS IN IRD
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API SQLRowCount ( HSTMT pStmt, SQLLEN* pDataPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLRowCount called" ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    *pDataPtr = ( ( pODBCStmt ) pStmt )->RowCount;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLRowCount returned: %d", *pDataPtr ) );
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to return the next row from the resultset
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLFetch ( HSTMT pStmt ) {
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    // all fetch occur thru the local function _SQLFetch
+    /*
+        RETCODE SQL_API _SQLFetch ( pODBCStmt    pStmt,
+        Word            pFetchOrientation,
+        Long            pFetchOffset,
+        ULong*          pRowCountPtr,
+        UWord*          pRowStatusArray )
+    */
+    RETCODE ret =  _SQLFetch ( ( pODBCStmt ) pStmt, SQL_FETCH_NEXT,
+                               ( ( pODBCStmt ) pStmt )->ARD.RowArraySize > 0 ? ( ( pODBCStmt ) pStmt )->ARD.RowArraySize : 1,
+                               ( ( pODBCStmt ) pStmt )->IRD.RowsProcessedPtr, ( ( pODBCStmt ) pStmt )->IRD.ArrayStatusPtr );
+                               
+    if ( ret == SQL_NO_DATA ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "Last row of current query has been fetched" ) );
+    }
+    
+    return ret;
+}
+
+// -----------------------------------------------------------------------
+// to fetch the specified rowset of data from the result set
+// Version Introduced: ODBC 1.0 Standards Compliance: Deprecated  (from msdn)
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLExtendedFetch ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pFetchOrientation,
+                                   SQLINTEGER      pFetchOffset,
+                                   SQLUINTEGER*    pRowCountPtr,
+                                   SQLUSMALLINT*   pRowStatusArray ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLExtendedFetch called, Stmt: %d, FO: %d, Offset: %d, Rcount: %d, RowStatus: %d", pStmt, pFetchOrientation,
+                              pFetchOffset, pRowCountPtr, pRowStatusArray ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExtendedFetch is not implemented   " ) );
+    return SQL_ERROR;
+    Long n;
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    // free diags
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // only fetch next supported
+    if ( pFetchOrientation != SQL_FETCH_NEXT ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExtendedFetch option not supported, FetchOrientation: %d", pFetchOrientation ) );
+        return SQL_ERROR;
+    }
+    
+    // check if number of rows explicitly specified
+    if ( pFetchOffset <= 0 )
+    { n = ( ( pODBCStmt ) pStmt )->ARD.RowArraySize; }
+    
+    // use default rowset size as a fallback
+    if ( n <= 0 )
+    { n = 1; }
+    
+    return _SQLFetch ( ( pODBCStmt ) pStmt, pFetchOrientation, n, pRowCountPtr, pRowStatusArray );
+}
+
+
+// -----------------------------------------------------------------------
+// to fetch the specified rowset of data from the result set
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLFetchScroll ( SQLHSTMT        pStatementHandle,
+                                 SQLSMALLINT     pFetchOrientation,
+                                 SQLINTEGER      pFetchOffset ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFetchScroll called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLFetchScroll not implemented" ) );
+    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
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLPutData ( SQLHSTMT       pStmt,
+                             SQLPOINTER     pDataPtr,
+                             SQLINTEGER     pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPutData called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLPutData not implemented" ) );
+    return SQL_ERROR;
+}
+
+// -----------------------------------------------------------------------
+// to iterate through multiple resultsets
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLMoreResults ( HSTMT pStmt ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLMoreResults called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLMoreResults not implemented" ) );
+    return SQL_ERROR;
+}
+
+// -----------------------------------------------------------------------
+// to get a driver specific version of specified sql statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLNativeSql ( SQLHDBC         pConn,
+                               SQLCHAR*        pInStmtText,
+                               SQLINTEGER      pInStmtTextLen,
+                               SQLCHAR*        pOutStmtText,
+                               SQLINTEGER      pOutStmtTextLen,
+                               SQLINTEGER*     pOutStmtTextLenPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNativeSql called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLNativeSql not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+
+
+// -----------------------------------------------------------------------
+// to convert and transfer col data for application
+// -----------------------------------------------------------------------
+
+//mhb TODO, check if the sqltype defined here match from c#
+RETCODE SQL_API _SQLColConvert ( pODBCStmt       pStmt,
+                                 void*               pTgtDataPtr,
+                                 Long*               pTgtDataSizePtr,
+                                 const wchar_t*      pSrcColData,
+                                 pARDItem     pARDCol,
+                                 bool                isSigned ) {
+    //check out this for SQL data type to C data type mapping
+    //http://msdn.microsoft.com/en-us/library/ms714556(v=vs.85).aspx
+    // note
+    // this function actually determines the conversion
+    // required to transfer the data
+    Word    pSrcDataType = pARDCol->SrcDataType;
+    Word    pTgtDataType = pARDCol->DataConciseType;
+    Long    pTgtDataSize = pARDCol->DataSize;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLColConvert called" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The SrcDataType is %d, the TgtDataType is %d, the TgtDataSize is %d",
+                              pSrcDataType, pTgtDataType, pTgtDataSize ) );
+                              
+    // TARGET TYPE IS LEFT TO OUR DRIVER
+    // check if target type is open
+    if ( pTgtDataType == SQL_DEFAULT ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pTgtDataType is SQL_DEFAULT, use default type mapping." ) );
+        
+        // determine targettype based on data-source type
+        // check out this http://msdn.microsoft.com/en-us/library/ms716298(v=vs.85).aspx for default type mapping
+        switch ( pSrcDataType ) {
+            case SQL_CHAR:
+                pTgtDataType = SQL_C_CHAR;
+                break;
+                
+            case SQL_VARCHAR:
+                pTgtDataType = SQL_C_CHAR;
+                break;
+                
+            case SQL_WCHAR:
+                pTgtDataType = SQL_C_WCHAR;
+                break;
+                
+            case SQL_WVARCHAR:
+                pTgtDataType = SQL_C_WCHAR;
+                break;
+                
+            case SQL_DECIMAL:
+                pTgtDataType = SQL_C_CHAR;
+                break;
+                
+            case SQL_BIT:
+                pTgtDataType = SQL_C_BIT;
+                break;
+                
+            case SQL_TINYINT:
+                if ( isSigned )
+                { pTgtDataType = SQL_C_STINYINT; }
+                
+                else
+                { pTgtDataType = SQL_C_UTINYINT; }
+                
+                break;
+                
+            case SQL_SMALLINT:
+                if ( isSigned )
+                { pTgtDataType = SQL_C_SSHORT; }
+                
+                else
+                { pTgtDataType = SQL_C_USHORT; }
+                
+                break;
+                
+            case SQL_INTEGER:
+                if ( isSigned )
+                { pTgtDataType = SQL_C_SLONG; }
+                
+                else
+                { pTgtDataType = SQL_C_ULONG; }
+                
+                break;
+                
+            case SQL_BIGINT:
+                if ( isSigned )
+                { pTgtDataType = SQL_C_SBIGINT; }
+                
+                else
+                { pTgtDataType = SQL_C_UBIGINT; }
+                
+                break;
+                
+            case SQL_FLOAT:
+                pTgtDataType = SQL_C_FLOAT;
+                break;
+                
+            case SQL_DOUBLE:
+                pTgtDataType = SQL_C_DOUBLE;
+                break;
+                
+            case SQL_TYPE_DATE:
+                pTgtDataType = SQL_C_CHAR;
+                break;
+                
+            case SQL_TYPE_TIME:
+                pTgtDataType = SQL_C_CHAR;
+                break;
+                
+            case SQL_TYPE_TIMESTAMP:
+                pTgtDataType = SQL_C_CHAR;
+                break;
+                
+            //case SQL_C_SLONG:
+            //case SQL_C_ULONG:               // unsigned long
+            //case SQL_C_USHORT:
+            //case SQL_C_SSHORT:
+            //case SQL_NUMERIC:
+            //case SQL_REAL:
+            //  pTgtDataType = pSrcDataType;
+            //  break;
+            
+            default:
+                __ODBCPOPMSG ( _ODBCPopMsg ( "The data type %d not implemented", pSrcDataType ) );
+                return SQL_ERROR;
+                break;
+        }
+    }
+    
+    else {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pTgtDataType is NOT SQL_DEFAULT, it is %d",  pTgtDataType ) );
+    }
+    
+    // TARGET TYPE IS CHAR
+    // as an optimization, check if the application
+    // or target data type is char. since the data from
+    // server is already in char format. the data can
+    // easily be transferred without incurring any
+    // conversion overhead
+    unique_ptr<char[]> pTextInAnsi ( wchar2char ( pSrcColData ) );
+    
+    // check if char type
+    if ( pTgtDataType == SQL_CHAR || pTgtDataType == SQL_VARCHAR ) {
+        // only in case of src data being bool a conversion is required
+        if ( pSrcDataType == SQL_BIT ) {
+            // prepare a converted single char bool string
+            Char  src[2];
+            
+            if ( pTextInAnsi.get() == NULL )
+            { src[0] = '0'; }
+            
+            else
+            { src[0] = ( pTextInAnsi.get() [0] == 'T' || pTextInAnsi.get() [0] == '1' || pTextInAnsi.get() [0] == 't' ) ? '1' : '0'; }
+            
+            src[1] = 0;
+            // transfer the bool string
+            return _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, src, -1 );
+        }
+        
+        else {
+            // transfer the string as it is
+            return _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, pTextInAnsi.get(),
+                                      -1 );
+        }
+    }
+    
+    if ( pTgtDataType == SQL_WCHAR || pTgtDataType == SQL_WVARCHAR ) {
+        return _SQLCopyWCharDataW ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, pSrcColData, -1 );
+    }
+    
+    // TARGET TYPE IS NOT CHAR
+    
+    // try using a numeric conversion
+    switch ( _SQLCopyNumData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pTgtDataType, pTextInAnsi.get(), pSrcDataType ,
+                               pTgtDataSizePtr ) ) {
+        case -1:
+            return SQL_ERROR;
+            
+        case 0:
+            return SQL_SUCCESS;
+            
+        default:
+            break;
+    }
+    
+    // try using a date/time conversion
+    switch ( _SQLCopyDateTimeData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pTgtDataType, pTextInAnsi.get(), pSrcDataType ) ) {
+        case -1:
+            return SQL_ERROR;
+            
+        case 0:
+            return SQL_SUCCESS;
+            
+        default:
+            break;
+    }
+    
+    // try using SQL_BIT data type ie bool
+    if ( pTgtDataType == SQL_BIT ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the target data type is SQL_C_BIT" ) );
+        
+        // prepare a converted single char bool string
+        if ( pTextInAnsi.get() == NULL )
+        { * ( ( char* ) pTgtDataPtr ) = 0; }
+        
+        else
+        { * ( ( char* ) pTgtDataPtr ) = ( pTextInAnsi.get() [0] == 'T' || pTextInAnsi.get() [0] == '1' || pTextInAnsi.get() [0] == 't' ) ? 1 : 0; }
+        
+        return SQL_SUCCESS;
+    }
+    
+    // error condition
+    __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLColConvert - Unknown data type, Target: %d, Source: %d", pTgtDataType,
+                                 pSrcDataType ) );
+    _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLColConvert", "01000", -1, "Unknown data type, Target: %d, Source: %d",
+                     pTgtDataType, pSrcDataType );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to get the specified column data from
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLFetchCol ( pODBCStmt pStmt,
+                               pARDItem pARDCol, //ard
+                               SQLResponse* pRowDesc,// ird
+                               SQLRowContent* pRowData ) { //content
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLFetchCol called" ) );
+    // note
+    // this function checks the binding type and positions the pointer
+    // for copying the data accordingly. It takes into account the
+    // current row position in rowset, the initial min increment specified
+    // by client and the size of the row or col buffer
+    Long        i;
+    Long        j;
+    Long*       tgtsizeptr;                                         // target size ptr
+    void*       tgtdataptr;                                         // target data ptr
+    const wchar_t*     srcdata;                                            // source data
+    SelectedColumnMeta*    coldesc;
+    // COMPUTE DATA AND SIZE PTR
+    // get the row pos in current rowset
+    i = ( pStmt->CurRowsetEndRowPos - pStmt->CurRowsetStartRowPos );
+    // compute min increment
+    j = ( pStmt->ARD.BindOffsetPtr ) ? * ( pStmt->ARD.BindOffsetPtr ) : 0;
+    
+    // check the binding type
+    if ( pStmt->ARD.BindTypeOrSize != SQL_BIND_BY_COLUMN ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD bindtypeorsize not euqal to SQL_BIND_BY_COLUMN" ) );
+        // note
+        Long k;
+        // compute row-size increment
+        k = ( pStmt->ARD.BindTypeOrSize );
+        // compute target col and size ptr
+        tgtdataptr = ( void* ) ( ( ( Char* ) ( pARDCol->DataPtr ) ) + j + ( i * k ) );
+        tgtsizeptr = ( Long* ) ( ( ( Char* ) ( pARDCol->SizePtr ) ) + j + ( i * k ) );
+    }
+    
+    // column-wise binding
+    else {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD bindtypeorsize euqal to SQL_BIND_BY_COLUMN" ) );
+        // move both data and size ptr in the array
+        //TODO find out where the pARDCol->DataSize if set
+        tgtdataptr = ( void* ) ( ( ( Char* ) ( pARDCol->DataPtr ) ) + j + ( i * pARDCol->DataSize ) ); // use based on data type
+        tgtsizeptr = ( Long* ) ( ( ( Char* ) ( pARDCol->SizePtr ) ) + j + ( i * sizeof ( Long ) ) );
+    }
+    
+    // PRECAUTION
+    
+    if ( tgtdataptr )   { * ( ( Char* ) tgtdataptr ) = 0; }
+    
+    if ( tgtsizeptr )   { * ( ( Long* ) tgtsizeptr ) = 0; }
+    
+    // COLLECT AND CHECK
+    // get col desc for specified col ( response )
+    coldesc = pRowDesc->columnMetas.at ( pARDCol->ColNum - 1 );
+    //if ( coldesc == NULL ) {
+    //  _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "01000", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, "column not found in resultset for specified index" );
+    //  return SQL_SUCCESS_WITH_INFO;                 // no col for specified index
+    //}
+    // get the col data for specfied col ( response )
+    srcdata = pRowData->contents.at ( pARDCol->ColNum - 1 ).c_str();
+    
+    //coldata = SOAPGetChildElemX ( pRowData, pARDCol->ColNum );
+    //if ( coldata == NULL ) {
+    
+    //  _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "01000", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, "column not found in resultset for specified index" );
+    //  return SQL_SUCCESS_WITH_INFO;                 // no col for specified index
+    //}
+    
+    // get col value as string
+    //srcdata = SOAPGetElemText ( coldata );
+    
+    // NULL DATA                                            // note: a text of NULL indicates NULL data from server
+    
+    // check if data is NULL
+    if ( srcdata == NULL || _wcsicmp ( srcdata, L"NULL" ) == 0 ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "srcdata is null" ) );
+        
+        // check if a size indicator is available
+        if ( tgtsizeptr == NULL ) {
+            _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "22002", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum,
+                             "Indicator variable required but not supplied" );
+            return SQL_SUCCESS_WITH_INFO;
+        }
+        
+        // set to SQL_NULL_DATA
+        else {
+            // indicate null data
+            * ( ( Long* ) tgtsizeptr ) = SQL_NULL_DATA;
+            // added precaution for bad appl design
+            /*  if ( tgtdataptr )
+                memset ( tgtdataptr, 0, pARDCol->MaxSize );*/
+            return SQL_SUCCESS;
+        }
+    }
+    
+    // check if info about src is also available in ARD col
+    if ( pARDCol->SrcDataType == 0 )
+    { GetIRDColDescInfo ( coldesc, & ( pARDCol->SrcDataType ), & ( pARDCol->SrcDataPrecision ), & ( pARDCol->SrcDataScale ), & ( pARDCol->SrcDataSize ) ); } // collect source data information in form comparable to appl
+    
+    // CONVERT AND TRANSFER
+    //Important!!!
+    //Notice the specification of different types
+    //http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.odbc.doc/odbc72.htm
+    RETCODE ret = _SQLColConvert ( pStmt, tgtdataptr, tgtsizeptr, srcdata, pARDCol, coldesc->isSigned );
+    //char buffer[1024];
+    //hexDump((char*)tgtdataptr,4,buffer,false);
+    //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,buffer));
+    //hexDump((char*)tgtdataptr,4,buffer,true);
+    //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,buffer));
+    return ret;
+}
+
+
+// -----------------------------------------------------------------------
+// to move to the next row with relevant checks
+// -----------------------------------------------------------------------
+
+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 ) {
+        // ------- THIS CASE SHOULD NOT OCCUR ----------
+        
+        // check if position is currently unknown
+        if ( pStmt->CurRowsetStartRow == NULL && pStmt->CurRowsetStartRowPos == 0 ) {
+            // position to first row ( both the pointers )
+            pStmt->CurRowsetStartRowPos = 1;
+            pStmt->CurRowsetStartRow    = GetIfExist ( pStmt->IRD.RowDesc->results, 1 );
+            pStmt->CurRowsetEndRowPos   = 1;
+            pStmt->CurRowsetEndRow      = GetIfExist ( pStmt->IRD.RowDesc->results, 1 );
+        }
+        
+        // -----------------------------------------------
+        
+        // position to next row if already position is known
+        else if ( pStmt->CurRowsetEndRow != NULL ) {
+            // position to next row
+            pStmt->CurRowsetEndRowPos  += 1;
+            pStmt->CurRowsetEndRow      = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos );
+        }
+        
+        // finally check if there is some data found
+        if ( pStmt->CurRowsetEndRow == NULL ) {
+            // put in diag
+            _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "01000", -1, "SQLFetch - no data" );
+            return SQL_NO_DATA;
+        }
+        
+        else
+        { return SQL_SUCCESS; }
+    }
+    
+    else {
+        // error situation
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchMoveNext", "01000", -1, "no resultset" );
+        return SQL_ERROR;
+    }
+}
+
+SQLRowContent* GetIfExist ( std::vector<SQLRowContent*>& container, int index ) {
+    index = index - 1; //sql cardinals start at 1
+    
+    if ( index >= ( int ) container.size() )
+    { return NULL; }
+    
+    else
+    { return container.at ( index ); }
+}
+
+// -----------------------------------------------------------------------
+// to set the initial row positions for a fetch
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLResetRowPos ( pODBCStmt pStmt ) {
+    // note
+    // there r 2 row pointers one is the start row for the current fetch and
+    // the other is the end row after the current fetch
+    // this function brings them together and moves them to the first row
+    // after the cur end row
+    // a block of rows which is fetched in one go is ROWSET while the full
+    // result is called RESULTSET
+    
+    // check if there is some response of type resultset
+    if (
+        pStmt->IRD.RowDesc != NULL ) {
+        // check if position is currently unknown
+        if ( pStmt->CurRowsetEndRow == NULL && pStmt->CurRowsetEndRowPos == 0 ) {
+            // position to first row ( both the pointers )
+            pStmt->CurRowsetEndRowPos   = 1;
+            pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos );
+        }
+        
+        // already positioned somewhere
+        else if ( pStmt->CurRowsetEndRow != NULL ) {
+            // position to next row
+            pStmt->CurRowsetEndRowPos  += 1;
+            pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos );
+        }
+        
+        // calibrate the first row with end row
+        pStmt->CurRowsetStartRow    = pStmt->CurRowsetEndRow;
+        pStmt->CurRowsetStartRowPos = pStmt->CurRowsetEndRowPos;
+        
+        // finally check if there is some data found
+        if ( pStmt->CurRowsetStartRow == NULL ) {
+            // put in diag
+            _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "01000", -1, "SQLFetch - no data" );
+            return SQL_NO_DATA;
+        }
+        
+        else
+        { return SQL_SUCCESS; }
+    }
+    
+    else {
+        // error situation
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLResetRowPos", "01000", -1, "no resultset" );
+        return SQL_ERROR;
+    }
+}
+
+
+// -----------------------------------------------------------------------
+// to return the next row from the resultset
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLFetch ( pODBCStmt    pStmt,
+                            Word            pFetchOrientation,
+                            Long            pFetchOffset, //ARD.RowArraySize
+                            ULong*          pRowCountPtr, //IRD.RowsProcessedPtr
+                            UWord*          pRowStatusArray ) { //ArrayStatusPtr
+    // note
+    // fetchoffset is treated as the number of rows to fetch
+    bool                flgNoData;
+    Long                i, n1, n2;
+    RETCODE             s;
+    SQLRowContent*      rowdata;
+    SQLResponse*        rowdesc;
+    pODBCARD            ard;
+    pARDItem            ardcol;
+    
+    // CALLER SAFE
+    
+    // caller safe for row fetched
+    if ( pRowCountPtr )
+    { *pRowCountPtr = 0; }
+    
+    // caller safe for each row status
+    if ( pRowStatusArray )
+        for ( i = 0; i < pFetchOffset; i ++ )   { pRowStatusArray[i] = SQL_ROW_NOROW; }
+        
+    // RESET POSITION OR SET INITIAL POSITIONS
+    
+    // postions the row counter for fetch start
+    if ( ( s = _SQLResetRowPos ( ( pODBCStmt ) pStmt ) ) != SQL_SUCCESS )
+    { return s; }
+    
+    // COLLECT INFO to START
+    // get the row desc - ird
+    rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get();
+    // get the row desc - ard
+    ard = & ( ( ( pODBCStmt ) pStmt )->ARD );
+    
+    // MAIN LOOP to fetch rowset number of rows
+    // loop to fetch the rows
+    for ( i = 0, n1 = 0, n2 = 0, flgNoData = FALSE; i < pFetchOffset && flgNoData == FALSE; i ++ ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Get One Row:" ) );
+        
+        // check if first row or not
+        if ( i != 0 ) {
+            // move to next row if not first time
+            switch ( _SQLFetchMoveNext ( pStmt ) ) {
+                case SQL_NO_DATA:
+                    flgNoData = TRUE;           // can continue
+                    continue;
+                    
+                case SQL_ERROR:
+                    return SQL_ERROR;           // not continuing
+                    
+                default:                        // case SQL_SUCCESS:
+                    break;
+            }
+        }
+        
+        // get the current row data
+        rowdata = pStmt->CurRowsetEndRow;
+        
+        // LOOP to fetch cols of one row
+        
+        // loop to put data in all bound cols
+        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 );
+            
+            // update row status
+            switch ( s ) {
+                case SQL_SUCCESS:
+                    if ( pRowStatusArray && pRowStatusArray[i] == SQL_ROW_NOROW ) { pRowStatusArray[i] = SQL_ROW_SUCCESS_WITH_INFO; }
+                    
+                    break;
+                    
+                case SQL_SUCCESS_WITH_INFO:
+                    ++ n1;                  // rows with info
+                    
+                    if ( pRowStatusArray ) { pRowStatusArray[i - 1] = SQL_ROW_SUCCESS_WITH_INFO; }
+                    
+                    break;
+                    
+                default:
+                    ++ n2;                   // no. of rows with error
+                    
+                    if ( pRowStatusArray ) { pRowStatusArray[i - 1] = SQL_ROW_ERROR; }
+            }
+        }
+        
+        // update the number of rows fetched
+        if ( pRowCountPtr ) { *pRowCountPtr = i + 1; }
+    }
+    
+    // check if no data
+    if ( flgNoData == TRUE && i <= 0 )
+    { return SQL_NO_DATA; }
+    
+    // check if all error
+    else if ( i > 0 && n2 == i )
+    { return SQL_ERROR; }
+    
+    // check if any success with info
+    else if ( i > 0 && n1 > 0 )
+    { return SQL_SUCCESS_WITH_INFO; }
+    
+    // all success
+    else {
+        return SQL_SUCCESS;
+    }
+}
+


[05/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer(64bit)/Installer(64bit).isl
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit).isl b/odbc/Installer(64bit)/Installer(64bit).isl
new file mode 100644
index 0000000..e8b81c6
--- /dev/null
+++ b/odbc/Installer(64bit)/Installer(64bit).isl
@@ -0,0 +1,5736 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?xml-stylesheet type="text/xsl" href="is.xsl" ?>
+<!DOCTYPE msi [
+   <!ELEMENT msi   (summary,table*)>
+   <!ATTLIST msi version    CDATA #REQUIRED>
+   <!ATTLIST msi xmlns:dt   CDATA #IMPLIED
+                 codepage   CDATA #IMPLIED
+                 compression (MSZIP|LZX|none) "LZX">
+   
+   <!ELEMENT summary       (codepage?,title?,subject?,author?,keywords?,comments?,
+                            template,lastauthor?,revnumber,lastprinted?,
+                            createdtm?,lastsavedtm?,pagecount,wordcount,
+                            charcount?,appname?,security?)>
+                            
+   <!ELEMENT codepage      (#PCDATA)>
+   <!ELEMENT title         (#PCDATA)>
+   <!ELEMENT subject       (#PCDATA)>
+   <!ELEMENT author        (#PCDATA)>
+   <!ELEMENT keywords      (#PCDATA)>
+   <!ELEMENT comments      (#PCDATA)>
+   <!ELEMENT template      (#PCDATA)>
+   <!ELEMENT lastauthor    (#PCDATA)>
+   <!ELEMENT revnumber     (#PCDATA)>
+   <!ELEMENT lastprinted   (#PCDATA)>
+   <!ELEMENT createdtm     (#PCDATA)>
+   <!ELEMENT lastsavedtm   (#PCDATA)>
+   <!ELEMENT pagecount     (#PCDATA)>
+   <!ELEMENT wordcount     (#PCDATA)>
+   <!ELEMENT charcount     (#PCDATA)>
+   <!ELEMENT appname       (#PCDATA)>
+   <!ELEMENT security      (#PCDATA)>                            
+                                
+   <!ELEMENT table         (col+,row*)>
+   <!ATTLIST table
+                name        CDATA #REQUIRED>
+
+   <!ELEMENT col           (#PCDATA)>
+   <!ATTLIST col
+                 key       (yes|no) #IMPLIED
+                 def       CDATA #IMPLIED>
+                 
+   <!ELEMENT row            (td+)>
+   
+   <!ELEMENT td             (#PCDATA)>
+   <!ATTLIST td
+                 href       CDATA #IMPLIED
+                 dt:dt     (string|bin.base64) #IMPLIED
+                 md5        CDATA #IMPLIED>
+]>
+<msi version="2.0" xmlns:dt="urn:schemas-microsoft-com:datatypes" codepage="65001">
+	
+	<summary>
+		<codepage>1252</codepage>
+		<title>Installation Database</title>
+		<subject>KylinODBCDriver (x64)</subject>
+		<author>##ID_STRING2##</author>
+		<keywords>Installer,MSI,Database</keywords>
+		<comments>Contact:  Your local administrator</comments>
+		<template>Intel;1033</template>
+		<lastauthor>Administrator</lastauthor>
+		<revnumber>{1809C804-80E8-4406-B079-E2492C4FC13E}</revnumber>
+		<lastprinted/>
+		<createdtm>06/21/1999 21:00</createdtm>
+		<lastsavedtm>07/15/2000 00:50</lastsavedtm>
+		<pagecount>200</pagecount>
+		<wordcount>0</wordcount>
+		<charcount/>
+		<appname>InstallShield Express</appname>
+		<security>1</security>
+	</summary>
+	
+	<table name="ActionText">
+		<col key="yes" def="s72">Action</col>
+		<col def="L64">Description</col>
+		<col def="L128">Template</col>
+		<row><td>Advertise</td><td>##IDS_ACTIONTEXT_Advertising##</td><td/></row>
+		<row><td>AllocateRegistrySpace</td><td>##IDS_ACTIONTEXT_AllocatingRegistry##</td><td>##IDS_ACTIONTEXT_FreeSpace##</td></row>
+		<row><td>AppSearch</td><td>##IDS_ACTIONTEXT_SearchInstalled##</td><td>##IDS_ACTIONTEXT_PropertySignature##</td></row>
+		<row><td>BindImage</td><td>##IDS_ACTIONTEXT_BindingExes##</td><td>##IDS_ACTIONTEXT_File##</td></row>
+		<row><td>CCPSearch</td><td>##IDS_ACTIONTEXT_UnregisterModules##</td><td/></row>
+		<row><td>CostFinalize</td><td>##IDS_ACTIONTEXT_ComputingSpace3##</td><td/></row>
+		<row><td>CostInitialize</td><td>##IDS_ACTIONTEXT_ComputingSpace##</td><td/></row>
+		<row><td>CreateFolders</td><td>##IDS_ACTIONTEXT_CreatingFolders##</td><td>##IDS_ACTIONTEXT_Folder##</td></row>
+		<row><td>CreateShortcuts</td><td>##IDS_ACTIONTEXT_CreatingShortcuts##</td><td>##IDS_ACTIONTEXT_Shortcut##</td></row>
+		<row><td>DeleteServices</td><td>##IDS_ACTIONTEXT_DeletingServices##</td><td>##IDS_ACTIONTEXT_Service##</td></row>
+		<row><td>DuplicateFiles</td><td>##IDS_ACTIONTEXT_CreatingDuplicate##</td><td>##IDS_ACTIONTEXT_FileDirectorySize##</td></row>
+		<row><td>FileCost</td><td>##IDS_ACTIONTEXT_ComputingSpace2##</td><td/></row>
+		<row><td>FindRelatedProducts</td><td>##IDS_ACTIONTEXT_SearchForRelated##</td><td>##IDS_ACTIONTEXT_FoundApp##</td></row>
+		<row><td>GenerateScript</td><td>##IDS_ACTIONTEXT_GeneratingScript##</td><td>##IDS_ACTIONTEXT_1##</td></row>
+		<row><td>ISLockPermissionsCost</td><td>##IDS_ACTIONTEXT_ISLockPermissionsCost##</td><td/></row>
+		<row><td>ISLockPermissionsInstall</td><td>##IDS_ACTIONTEXT_ISLockPermissionsInstall##</td><td/></row>
+		<row><td>InstallAdminPackage</td><td>##IDS_ACTIONTEXT_CopyingNetworkFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize##</td></row>
+		<row><td>InstallFiles</td><td>##IDS_ACTIONTEXT_CopyingNewFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize2##</td></row>
+		<row><td>InstallODBC</td><td>##IDS_ACTIONTEXT_InstallODBC##</td><td/></row>
+		<row><td>InstallSFPCatalogFile</td><td>##IDS_ACTIONTEXT_InstallingSystemCatalog##</td><td>##IDS_ACTIONTEXT_FileDependencies##</td></row>
+		<row><td>InstallServices</td><td>##IDS_ACTIONTEXT_InstallServices##</td><td>##IDS_ACTIONTEXT_Service2##</td></row>
+		<row><td>InstallValidate</td><td>##IDS_ACTIONTEXT_Validating##</td><td/></row>
+		<row><td>LaunchConditions</td><td>##IDS_ACTIONTEXT_EvaluateLaunchConditions##</td><td/></row>
+		<row><td>MigrateFeatureStates</td><td>##IDS_ACTIONTEXT_MigratingFeatureStates##</td><td>##IDS_ACTIONTEXT_Application##</td></row>
+		<row><td>MoveFiles</td><td>##IDS_ACTIONTEXT_MovingFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize3##</td></row>
+		<row><td>PatchFiles</td><td>##IDS_ACTIONTEXT_PatchingFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize4##</td></row>
+		<row><td>ProcessComponents</td><td>##IDS_ACTIONTEXT_UpdateComponentRegistration##</td><td/></row>
+		<row><td>PublishComponents</td><td>##IDS_ACTIONTEXT_PublishingQualifiedComponents##</td><td>##IDS_ACTIONTEXT_ComponentIDQualifier##</td></row>
+		<row><td>PublishFeatures</td><td>##IDS_ACTIONTEXT_PublishProductFeatures##</td><td>##IDS_ACTIONTEXT_FeatureColon##</td></row>
+		<row><td>PublishProduct</td><td>##IDS_ACTIONTEXT_PublishProductInfo##</td><td/></row>
+		<row><td>RMCCPSearch</td><td>##IDS_ACTIONTEXT_SearchingQualifyingProducts##</td><td/></row>
+		<row><td>RegisterClassInfo</td><td>##IDS_ACTIONTEXT_RegisterClassServer##</td><td>##IDS_ACTIONTEXT_ClassId##</td></row>
+		<row><td>RegisterComPlus</td><td>##IDS_ACTIONTEXT_RegisteringComPlus##</td><td>##IDS_ACTIONTEXT_AppIdAppTypeRSN##</td></row>
+		<row><td>RegisterExtensionInfo</td><td>##IDS_ACTIONTEXT_RegisterExtensionServers##</td><td>##IDS_ACTIONTEXT_Extension2##</td></row>
+		<row><td>RegisterFonts</td><td>##IDS_ACTIONTEXT_RegisterFonts##</td><td>##IDS_ACTIONTEXT_Font##</td></row>
+		<row><td>RegisterMIMEInfo</td><td>##IDS_ACTIONTEXT_RegisterMimeInfo##</td><td>##IDS_ACTIONTEXT_ContentTypeExtension##</td></row>
+		<row><td>RegisterProduct</td><td>##IDS_ACTIONTEXT_RegisteringProduct##</td><td>##IDS_ACTIONTEXT_1b##</td></row>
+		<row><td>RegisterProgIdInfo</td><td>##IDS_ACTIONTEXT_RegisteringProgIdentifiers##</td><td>##IDS_ACTIONTEXT_ProgID2##</td></row>
+		<row><td>RegisterTypeLibraries</td><td>##IDS_ACTIONTEXT_RegisterTypeLibs##</td><td>##IDS_ACTIONTEXT_LibId##</td></row>
+		<row><td>RegisterUser</td><td>##IDS_ACTIONTEXT_RegUser##</td><td>##IDS_ACTIONTEXT_1c##</td></row>
+		<row><td>RemoveDuplicateFiles</td><td>##IDS_ACTIONTEXT_RemovingDuplicates##</td><td>##IDS_ACTIONTEXT_FileDir##</td></row>
+		<row><td>RemoveEnvironmentStrings</td><td>##IDS_ACTIONTEXT_UpdateEnvironmentStrings##</td><td>##IDS_ACTIONTEXT_NameValueAction2##</td></row>
+		<row><td>RemoveExistingProducts</td><td>##IDS_ACTIONTEXT_RemoveApps##</td><td>##IDS_ACTIONTEXT_AppCommandLine##</td></row>
+		<row><td>RemoveFiles</td><td>##IDS_ACTIONTEXT_RemovingFiles##</td><td>##IDS_ACTIONTEXT_FileDir2##</td></row>
+		<row><td>RemoveFolders</td><td>##IDS_ACTIONTEXT_RemovingFolders##</td><td>##IDS_ACTIONTEXT_Folder1##</td></row>
+		<row><td>RemoveIniValues</td><td>##IDS_ACTIONTEXT_RemovingIni##</td><td>##IDS_ACTIONTEXT_FileSectionKeyValue##</td></row>
+		<row><td>RemoveODBC</td><td>##IDS_ACTIONTEXT_RemovingODBC##</td><td/></row>
+		<row><td>RemoveRegistryValues</td><td>##IDS_ACTIONTEXT_RemovingRegistry##</td><td>##IDS_ACTIONTEXT_KeyName##</td></row>
+		<row><td>RemoveShortcuts</td><td>##IDS_ACTIONTEXT_RemovingShortcuts##</td><td>##IDS_ACTIONTEXT_Shortcut1##</td></row>
+		<row><td>Rollback</td><td>##IDS_ACTIONTEXT_RollingBack##</td><td>##IDS_ACTIONTEXT_1d##</td></row>
+		<row><td>RollbackCleanup</td><td>##IDS_ACTIONTEXT_RemovingBackup##</td><td>##IDS_ACTIONTEXT_File2##</td></row>
+		<row><td>SelfRegModules</td><td>##IDS_ACTIONTEXT_RegisteringModules##</td><td>##IDS_ACTIONTEXT_FileFolder##</td></row>
+		<row><td>SelfUnregModules</td><td>##IDS_ACTIONTEXT_UnregisterModules##</td><td>##IDS_ACTIONTEXT_FileFolder2##</td></row>
+		<row><td>SetODBCFolders</td><td>##IDS_ACTIONTEXT_InitializeODBCDirs##</td><td/></row>
+		<row><td>StartServices</td><td>##IDS_ACTIONTEXT_StartingServices##</td><td>##IDS_ACTIONTEXT_Service3##</td></row>
+		<row><td>StopServices</td><td>##IDS_ACTIONTEXT_StoppingServices##</td><td>##IDS_ACTIONTEXT_Service4##</td></row>
+		<row><td>UnmoveFiles</td><td>##IDS_ACTIONTEXT_RemovingMoved##</td><td>##IDS_ACTIONTEXT_FileDir3##</td></row>
+		<row><td>UnpublishComponents</td><td>##IDS_ACTIONTEXT_UnpublishQualified##</td><td>##IDS_ACTIONTEXT_ComponentIdQualifier2##</td></row>
+		<row><td>UnpublishFeatures</td><td>##IDS_ACTIONTEXT_UnpublishProductFeatures##</td><td>##IDS_ACTIONTEXT_Feature##</td></row>
+		<row><td>UnpublishProduct</td><td>##IDS_ACTIONTEXT_UnpublishingProductInfo##</td><td/></row>
+		<row><td>UnregisterClassInfo</td><td>##IDS_ACTIONTEXT_UnregisterClassServers##</td><td>##IDS_ACTIONTEXT_ClsID##</td></row>
+		<row><td>UnregisterComPlus</td><td>##IDS_ACTIONTEXT_UnregisteringComPlus##</td><td>##IDS_ACTIONTEXT_AppId##</td></row>
+		<row><td>UnregisterExtensionInfo</td><td>##IDS_ACTIONTEXT_UnregisterExtensionServers##</td><td>##IDS_ACTIONTEXT_Extension##</td></row>
+		<row><td>UnregisterFonts</td><td>##IDS_ACTIONTEXT_UnregisteringFonts##</td><td>##IDS_ACTIONTEXT_Font2##</td></row>
+		<row><td>UnregisterMIMEInfo</td><td>##IDS_ACTIONTEXT_UnregisteringMimeInfo##</td><td>##IDS_ACTIONTEXT_ContentTypeExtension2##</td></row>
+		<row><td>UnregisterProgIdInfo</td><td>##IDS_ACTIONTEXT_UnregisteringProgramIds##</td><td>##IDS_ACTIONTEXT_ProgID##</td></row>
+		<row><td>UnregisterTypeLibraries</td><td>##IDS_ACTIONTEXT_UnregTypeLibs##</td><td>##IDS_ACTIONTEXT_Libid2##</td></row>
+		<row><td>WriteEnvironmentStrings</td><td>##IDS_ACTIONTEXT_EnvironmentStrings##</td><td>##IDS_ACTIONTEXT_NameValueAction##</td></row>
+		<row><td>WriteIniValues</td><td>##IDS_ACTIONTEXT_WritingINI##</td><td>##IDS_ACTIONTEXT_FileSectionKeyValue2##</td></row>
+		<row><td>WriteRegistryValues</td><td>##IDS_ACTIONTEXT_WritingRegistry##</td><td>##IDS_ACTIONTEXT_KeyNameValue##</td></row>
+	</table>
+
+	<table name="AdminExecuteSequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+		<row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+		<row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+		<row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+		<row><td>InstallAdminPackage</td><td/><td>3900</td><td>InstallAdminPackage</td><td/></row>
+		<row><td>InstallFiles</td><td/><td>4000</td><td>InstallFiles</td><td/></row>
+		<row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+		<row><td>InstallInitialize</td><td/><td>1500</td><td>InstallInitialize</td><td/></row>
+		<row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+		<row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>4010</td><td>ScheduleReboot</td><td/></row>
+	</table>
+
+	<table name="AdminUISequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+		<row><td>AdminWelcome</td><td/><td>1010</td><td>AdminWelcome</td><td/></row>
+		<row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+		<row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+		<row><td>ExecuteAction</td><td/><td>1300</td><td>ExecuteAction</td><td/></row>
+		<row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+		<row><td>SetupCompleteError</td><td/><td>-3</td><td>SetupCompleteError</td><td/></row>
+		<row><td>SetupCompleteSuccess</td><td/><td>-1</td><td>SetupCompleteSuccess</td><td/></row>
+		<row><td>SetupInitialization</td><td/><td>50</td><td>SetupInitialization</td><td/></row>
+		<row><td>SetupInterrupted</td><td/><td>-2</td><td>SetupInterrupted</td><td/></row>
+		<row><td>SetupProgress</td><td/><td>1020</td><td>SetupProgress</td><td/></row>
+	</table>
+
+	<table name="AdvtExecuteSequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+		<row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+		<row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+		<row><td>CreateShortcuts</td><td/><td>4500</td><td>CreateShortcuts</td><td/></row>
+		<row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+		<row><td>InstallInitialize</td><td/><td>1500</td><td>InstallInitialize</td><td/></row>
+		<row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+		<row><td>MsiPublishAssemblies</td><td/><td>6250</td><td>MsiPublishAssemblies</td><td/></row>
+		<row><td>PublishComponents</td><td/><td>6200</td><td>PublishComponents</td><td/></row>
+		<row><td>PublishFeatures</td><td/><td>6300</td><td>PublishFeatures</td><td/></row>
+		<row><td>PublishProduct</td><td/><td>6400</td><td>PublishProduct</td><td/></row>
+		<row><td>RegisterClassInfo</td><td/><td>4600</td><td>RegisterClassInfo</td><td/></row>
+		<row><td>RegisterExtensionInfo</td><td/><td>4700</td><td>RegisterExtensionInfo</td><td/></row>
+		<row><td>RegisterMIMEInfo</td><td/><td>4900</td><td>RegisterMIMEInfo</td><td/></row>
+		<row><td>RegisterProgIdInfo</td><td/><td>4800</td><td>RegisterProgIdInfo</td><td/></row>
+		<row><td>RegisterTypeLibraries</td><td/><td>4910</td><td>RegisterTypeLibraries</td><td/></row>
+		<row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>6410</td><td>ScheduleReboot</td><td/></row>
+	</table>
+
+	<table name="AdvtUISequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+	</table>
+
+	<table name="AppId">
+		<col key="yes" def="s38">AppId</col>
+		<col def="S255">RemoteServerName</col>
+		<col def="S255">LocalService</col>
+		<col def="S255">ServiceParameters</col>
+		<col def="S255">DllSurrogate</col>
+		<col def="I2">ActivateAtStorage</col>
+		<col def="I2">RunAsInteractiveUser</col>
+	</table>
+
+	<table name="AppSearch">
+		<col key="yes" def="s72">Property</col>
+		<col key="yes" def="s72">Signature_</col>
+	</table>
+
+	<table name="BBControl">
+		<col key="yes" def="s50">Billboard_</col>
+		<col key="yes" def="s50">BBControl</col>
+		<col def="s50">Type</col>
+		<col def="i2">X</col>
+		<col def="i2">Y</col>
+		<col def="i2">Width</col>
+		<col def="i2">Height</col>
+		<col def="I4">Attributes</col>
+		<col def="L50">Text</col>
+	</table>
+
+	<table name="Billboard">
+		<col key="yes" def="s50">Billboard</col>
+		<col def="s38">Feature_</col>
+		<col def="S50">Action</col>
+		<col def="I2">Ordering</col>
+	</table>
+
+	<table name="Binary">
+		<col key="yes" def="s72">Name</col>
+		<col def="V0">Data</col>
+		<col def="S255">ISBuildSourcePath</col>
+		<row><td>ISExpHlp.dll</td><td/><td>&lt;ISRedistPlatformDependentFolder&gt;\ISExpHlp.dll</td></row>
+		<row><td>ISSELFREG.DLL</td><td/><td>&lt;ISRedistPlatformDependentFolder&gt;\isregsvr.dll</td></row>
+		<row><td>NewBinary1</td><td/><td>&lt;ISProductFolder&gt;\Support\Themes\InstallShield Blue Theme\banner.jpg</td></row>
+		<row><td>NewBinary10</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CompleteSetupIco.ibd</td></row>
+		<row><td>NewBinary11</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CustomSetupIco.ibd</td></row>
+		<row><td>NewBinary12</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\DestIcon.ibd</td></row>
+		<row><td>NewBinary13</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\NetworkInstall.ico</td></row>
+		<row><td>NewBinary14</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\DontInstall.ico</td></row>
+		<row><td>NewBinary15</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\Install.ico</td></row>
+		<row><td>NewBinary16</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallFirstUse.ico</td></row>
+		<row><td>NewBinary17</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallPartial.ico</td></row>
+		<row><td>NewBinary18</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallStateMenu.ico</td></row>
+		<row><td>NewBinary2</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\New.ibd</td></row>
+		<row><td>NewBinary3</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\Up.ibd</td></row>
+		<row><td>NewBinary4</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\WarningIcon.ibd</td></row>
+		<row><td>NewBinary5</td><td/><td>&lt;ISProductFolder&gt;\Support\Themes\InstallShield Blue Theme\welcome.jpg</td></row>
+		<row><td>NewBinary6</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CustomSetupIco.ibd</td></row>
+		<row><td>NewBinary7</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\ReinstIco.ibd</td></row>
+		<row><td>NewBinary8</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\RemoveIco.ibd</td></row>
+		<row><td>NewBinary9</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\SetupIcon.ibd</td></row>
+		<row><td>SetAllUsers.dll</td><td/><td>&lt;ISRedistPlatformDependentFolder&gt;\SetAllUsers.dll</td></row>
+	</table>
+
+	<table name="BindImage">
+		<col key="yes" def="s72">File_</col>
+		<col def="S255">Path</col>
+	</table>
+
+	<table name="CCPSearch">
+		<col key="yes" def="s72">Signature_</col>
+	</table>
+
+	<table name="CheckBox">
+		<col key="yes" def="s72">Property</col>
+		<col def="S64">Value</col>
+		<row><td>ISCHECKFORPRODUCTUPDATES</td><td>1</td></row>
+		<row><td>LAUNCHPROGRAM</td><td>1</td></row>
+		<row><td>LAUNCHREADME</td><td>1</td></row>
+	</table>
+
+	<table name="Class">
+		<col key="yes" def="s38">CLSID</col>
+		<col key="yes" def="s32">Context</col>
+		<col key="yes" def="s72">Component_</col>
+		<col def="S255">ProgId_Default</col>
+		<col def="L255">Description</col>
+		<col def="S38">AppId_</col>
+		<col def="S255">FileTypeMask</col>
+		<col def="S72">Icon_</col>
+		<col def="I2">IconIndex</col>
+		<col def="S32">DefInprocHandler</col>
+		<col def="S255">Argument</col>
+		<col def="s38">Feature_</col>
+		<col def="I2">Attributes</col>
+	</table>
+
+	<table name="ComboBox">
+		<col key="yes" def="s72">Property</col>
+		<col key="yes" def="i2">Order</col>
+		<col def="s64">Value</col>
+		<col def="L64">Text</col>
+	</table>
+
+	<table name="CompLocator">
+		<col key="yes" def="s72">Signature_</col>
+		<col def="s38">ComponentId</col>
+		<col def="I2">Type</col>
+	</table>
+
+	<table name="Complus">
+		<col key="yes" def="s72">Component_</col>
+		<col key="yes" def="I2">ExpType</col>
+	</table>
+
+	<table name="Component">
+		<col key="yes" def="s72">Component</col>
+		<col def="S38">ComponentId</col>
+		<col def="s72">Directory_</col>
+		<col def="i2">Attributes</col>
+		<col def="S255">Condition</col>
+		<col def="S72">KeyPath</col>
+		<col def="I4">ISAttributes</col>
+		<col def="S255">ISComments</col>
+		<col def="S255">ISScanAtBuildFile</col>
+		<col def="S255">ISRegFileToMergeAtBuild</col>
+		<col def="S0">ISDotNetInstallerArgsInstall</col>
+		<col def="S0">ISDotNetInstallerArgsCommit</col>
+		<col def="S0">ISDotNetInstallerArgsUninstall</col>
+		<col def="S0">ISDotNetInstallerArgsRollback</col>
+		<row><td>Driver.Primary_Output</td><td>{5204EBED-0C2D-42E6-A263-05882561C7A2}</td><td>INSTALLDIR</td><td>258</td><td/><td>driver.primary_output</td><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+		<row><td>ISX_DEFAULTCOMPONENT</td><td>{9806D254-29D4-494C-A795-09140E548EA6}</td><td>ProgramFiles64Folder</td><td>2</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+		<row><td>ISX_DEFAULTCOMPONENT1</td><td>{56A2C727-C742-4136-B85C-4514B22712EA}</td><td>INSTALLDIR</td><td>258</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+		<row><td>ISX_DEFAULTCOMPONENT2</td><td>{163E96A1-9F46-4929-9654-D397527601B1}</td><td>EBAY1</td><td>258</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+		<row><td>ISX_DEFAULTCOMPONENT5</td><td>{21148F8E-655E-4192-AEA8-C1ED9429592A}</td><td>INSTALLDIR</td><td>258</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+		<row><td>ISX_DEFAULTCOMPONENT8</td><td>{5A4A395F-20F6-4E32-89A3-2C5C7D390DD5}</td><td>DATABASEDIR</td><td>258</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+	</table>
+
+	<table name="Condition">
+		<col key="yes" def="s38">Feature_</col>
+		<col key="yes" def="i2">Level</col>
+		<col def="S255">Condition</col>
+	</table>
+
+	<table name="Control">
+		<col key="yes" def="s72">Dialog_</col>
+		<col key="yes" def="s50">Control</col>
+		<col def="s20">Type</col>
+		<col def="i2">X</col>
+		<col def="i2">Y</col>
+		<col def="i2">Width</col>
+		<col def="i2">Height</col>
+		<col def="I4">Attributes</col>
+		<col def="S72">Property</col>
+		<col def="L0">Text</col>
+		<col def="S50">Control_Next</col>
+		<col def="L50">Help</col>
+		<col def="I4">ISWindowStyle</col>
+		<col def="I4">ISControlId</col>
+		<col def="S255">ISBuildSourcePath</col>
+		<col def="S72">Binary_</col>
+		<row><td>AdminChangeFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>AdminChangeFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ComboText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Combo</td><td>DirectoryCombo</td><td>21</td><td>64</td><td>277</td><td>80</td><td>458755</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_4##</td><td>Up</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>ComboText</td><td>Text</td><td>21</td><td>50</td><td>99</td><td>14</td><td>3</td><td/><td>##IDS__IsAdminInstallBrowse_LookIn##</td><td>Combo</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallBrowse_BrowseDestination##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallBrowse_ChangeDestination##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>List</td><td>DirectoryList</td><td>21</td><td>90</td><td>332</td><td>97</td><td>7</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_8##</td><td>TailText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>NewFolder</td><td>PushButton</td><td>335</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>List</td><td>##IDS__IsAdminInstallBrowse_CreateFolder##</td><td>0</td><td/><td/><td>NewBinary2</td></row>
+		<row><td>AdminChangeFolder</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Tail</td><td>PathEdit</td><td>21</td><td>207</td><td>332</td><td>17</td><td>3</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_11##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>TailText</td><td>Text</td><td>21</td><td>193</td><td>99</td><td>13</td><td>3</td><td/><td>##IDS__IsAdminInstallBrowse_FolderName##</td><td>Tail</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Up</td><td>PushButton</td><td>310</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>NewFolder</td><td>##IDS__IsAdminInstallBrowse_UpOneLevel##</td><td>0</td><td/><td/><td>NewBinary3</td></row>
+		<row><td>AdminNetworkLocation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>InstallNow</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>AdminNetworkLocation</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Browse</td><td>PushButton</td><td>286</td><td>124</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_Change##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>SetupPathEdit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallPoint_SpecifyNetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>40</td><td>131075</td><td/><td>##IDS__IsAdminInstallPoint_EnterNetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallPoint_NetworkLocationFormatted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>InstallNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_Install##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>LBBrowse</td><td>Text</td><td>21</td><td>90</td><td>100</td><td>10</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_NetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>SetupPathEdit</td><td>PathEdit</td><td>21</td><td>102</td><td>330</td><td>17</td><td>3</td><td>TARGETDIR</td><td/><td>Browse</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>AdminWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsAdminInstallPointWelcome_Wizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196611</td><td/><td>##IDS__IsAdminInstallPointWelcome_ServerImage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CancelSetup</td><td>Icon</td><td>Icon</td><td>15</td><td>15</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary4</td></row>
+		<row><td>CancelSetup</td><td>No</td><td>PushButton</td><td>135</td><td>57</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCancelDlg_No##</td><td>Yes</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CancelSetup</td><td>Text</td><td>Text</td><td>48</td><td>15</td><td>194</td><td>30</td><td>131075</td><td/><td>##IDS__IsCancelDlg_ConfirmCancel##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CancelSetup</td><td>Yes</td><td>PushButton</td><td>62</td><td>57</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCancelDlg_Yes##</td><td>No</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>CustomSetup</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Tree</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>203</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Change##</td><td>Help</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Details</td><td>PushButton</td><td>93</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Space##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgDesc</td><td>Text</td><td>17</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsCustomSelectionDlg_SelectFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgText</td><td>Text</td><td>9</td><td>51</td><td>360</td><td>10</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_ClickFeatureIcon##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgTitle</td><td>Text</td><td>9</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsCustomSelectionDlg_CustomSetup##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>FeatureGroup</td><td>GroupBox</td><td>235</td><td>67</td><td>131</td><td>120</td><td>1</td><td/><td>##IDS__IsCustomSelectionDlg_FeatureDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Help</td><td>PushButton</td><td>22</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Help##</td><td>Details</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>InstallLabel</td><td>Text</td><td>8</td><td>190</td><td>360</td><td>10</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_InstallTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>ItemDescription</td><td>Text</td><td>241</td><td>80</td><td>120</td><td>50</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_MultilineDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Location</td><td>Text</td><td>8</td><td>203</td><td>291</td><td>20</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_FeaturePath##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Size</td><td>Text</td><td>241</td><td>133</td><td>120</td><td>50</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_FeatureSize##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Tree</td><td>SelectionTree</td><td>8</td><td>70</td><td>220</td><td>118</td><td>7</td><td>_BrowseProperty</td><td/><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>CustomSetupTips</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SetupTips_CustomSetupDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SetupTips_CustomSetup##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DontInstall</td><td>Icon</td><td>21</td><td>155</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary14</td></row>
+		<row><td>CustomSetupTips</td><td>DontInstallText</td><td>Text</td><td>60</td><td>155</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_WillNotBeInstalled##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>FirstInstallText</td><td>Text</td><td>60</td><td>180</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_Advertise##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Install</td><td>Icon</td><td>21</td><td>105</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary15</td></row>
+		<row><td>CustomSetupTips</td><td>InstallFirstUse</td><td>Icon</td><td>21</td><td>180</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary16</td></row>
+		<row><td>CustomSetupTips</td><td>InstallPartial</td><td>Icon</td><td>21</td><td>130</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary17</td></row>
+		<row><td>CustomSetupTips</td><td>InstallStateMenu</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary18</td></row>
+		<row><td>CustomSetupTips</td><td>InstallStateText</td><td>Text</td><td>21</td><td>91</td><td>300</td><td>10</td><td>3</td><td/><td>##IDS_SetupTips_InstallState##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>InstallText</td><td>Text</td><td>60</td><td>105</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_AllInstalledLocal##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>MenuText</td><td>Text</td><td>50</td><td>52</td><td>300</td><td>36</td><td>3</td><td/><td>##IDS_SetupTips_IconInstallState##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>NetworkInstall</td><td>Icon</td><td>21</td><td>205</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary13</td></row>
+		<row><td>CustomSetupTips</td><td>NetworkInstallText</td><td>Text</td><td>60</td><td>205</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_Network##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>OK</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_SetupTips_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>PartialText</td><td>Text</td><td>60</td><td>130</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_SubFeaturesInstalledLocal##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>CustomerInformation</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>NameLabel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>CompanyEdit</td><td>Edit</td><td>21</td><td>100</td><td>237</td><td>17</td><td>3</td><td>COMPANYNAME</td><td>##IDS__IsRegisterUserDlg_Tahoma80##</td><td>SerialLabel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>CompanyLabel</td><td>Text</td><td>21</td><td>89</td><td>75</td><td>10</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_Organization##</td><td>CompanyEdit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsRegisterUserDlg_PleaseEnterInfo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgRadioGroupText</td><td>Text</td><td>21</td><td>161</td><td>300</td><td>14</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_InstallFor##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsRegisterUserDlg_CustomerInformation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>NameEdit</td><td>Edit</td><td>21</td><td>63</td><td>237</td><td>17</td><td>3</td><td>USERNAME</td><td>##IDS__IsRegisterUserDlg_Tahoma50##</td><td>CompanyLabel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>NameLabel</td><td>Text</td><td>21</td><td>52</td><td>75</td><td>10</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_UserName##</td><td>NameEdit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>63</td><td>170</td><td>300</td><td>50</td><td>2</td><td>ApplicationUsers</td><td>##IDS__IsRegisterUserDlg_16##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>SerialLabel</td><td>Text</td><td>21</td><td>127</td><td>109</td><td>10</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_SerialNumber##</td><td>SerialNumber</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>SerialNumber</td><td>MaskedEdit</td><td>21</td><td>138</td><td>237</td><td>17</td><td>2</td><td>ISX_SERIALNUM</td><td/><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>DatabaseFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>65</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CHANGE##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>DatabaseFolder</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary12</td></row>
+		<row><td>DatabaseFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DatabaseFolder_ChangeFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DatabaseFolder_DatabaseFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>LocLabel</td><td>Text</td><td>57</td><td>52</td><td>290</td><td>10</td><td>131075</td><td/><td>##IDS_DatabaseFolder_InstallDatabaseTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Location</td><td>Text</td><td>57</td><td>65</td><td>240</td><td>40</td><td>3</td><td>_BrowseProperty</td><td>##IDS__DatabaseFolder_DatabaseDir##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>DestinationFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>65</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__DestinationFolder_Change##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>DestFolder</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary12</td></row>
+		<row><td>DestinationFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DestinationFolder_ChangeFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DestinationFolder_DestinationFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>LocLabel</td><td>Text</td><td>57</td><td>52</td><td>290</td><td>10</td><td>131075</td><td/><td>##IDS__DestinationFolder_InstallTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Location</td><td>Text</td><td>57</td><td>65</td><td>240</td><td>40</td><td>3</td><td>_BrowseProperty</td><td>##IDS_INSTALLDIR##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>DiskSpaceRequirements</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgDesc</td><td>Text</td><td>17</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFeatureDetailsDlg_SpaceRequired##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgText</td><td>Text</td><td>10</td><td>185</td><td>358</td><td>41</td><td>3</td><td/><td>##IDS__IsFeatureDetailsDlg_VolumesTooSmall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgTitle</td><td>Text</td><td>9</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFeatureDetailsDlg_DiskSpaceRequirements##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>List</td><td>VolumeCostList</td><td>8</td><td>55</td><td>358</td><td>125</td><td>393223</td><td/><td>##IDS__IsFeatureDetailsDlg_Numbers##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>OK</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFeatureDetailsDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>FilesInUse</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUseMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>348</td><td>33</td><td>3</td><td/><td>##IDS__IsFilesInUse_ApplicationsUsingFiles##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUse##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Exit</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Exit##</td><td>List</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Ignore</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Ignore##</td><td>Exit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>List</td><td>ListBox</td><td>21</td><td>87</td><td>331</td><td>135</td><td>7</td><td>FileInUseProcess</td><td/><td>Retry</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Retry</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Retry##</td><td>Ignore</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>InstallChangeFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ComboText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Combo</td><td>DirectoryCombo</td><td>21</td><td>64</td><td>277</td><td>80</td><td>4128779</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_4##</td><td>Up</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>ComboText</td><td>Text</td><td>21</td><td>50</td><td>99</td><td>14</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_LookIn##</td><td>Combo</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsBrowseFolderDlg_BrowseDestFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsBrowseFolderDlg_ChangeCurrentFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>List</td><td>DirectoryList</td><td>21</td><td>90</td><td>332</td><td>97</td><td>15</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_8##</td><td>TailText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>NewFolder</td><td>PushButton</td><td>335</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>List</td><td>##IDS__IsBrowseFolderDlg_CreateFolder##</td><td>0</td><td/><td/><td>NewBinary2</td></row>
+		<row><td>InstallChangeFolder</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Tail</td><td>PathEdit</td><td>21</td><td>207</td><td>332</td><td>17</td><td>15</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_11##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>TailText</td><td>Text</td><td>21</td><td>193</td><td>99</td><td>13</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_FolderName##</td><td>Tail</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Up</td><td>PushButton</td><td>310</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>NewFolder</td><td>##IDS__IsBrowseFolderDlg_UpOneLevel##</td><td>0</td><td/><td/><td>NewBinary3</td></row>
+		<row><td>InstallWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Copyright</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>Copyright</td><td>Text</td><td>135</td><td>144</td><td>228</td><td>73</td><td>65539</td><td/><td>##IDS__IsWelcomeDlg_WarningCopyright##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>InstallWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsWelcomeDlg_WelcomeProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196611</td><td/><td>##IDS__IsWelcomeDlg_InstallProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Agree</td><td>RadioButtonGroup</td><td>8</td><td>190</td><td>291</td><td>40</td><td>3</td><td>AgreeToLicense</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>LicenseAgreement</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ISPrintButton</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsLicenseDlg_ReadLicenseAgreement##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsLicenseDlg_LicenseAgreement##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>ISPrintButton</td><td>PushButton</td><td>301</td><td>188</td><td>65</td><td>17</td><td>3</td><td/><td>##IDS_PRINT_BUTTON##</td><td>Agree</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Memo</td><td>ScrollableText</td><td>8</td><td>55</td><td>358</td><td>130</td><td>7</td><td/><td/><td/><td/><td>0</td><td/><td>&lt;ISProductFolder&gt;\Redist\0409\Eula.rtf</td><td/></row>
+		<row><td>LicenseAgreement</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>MaintenanceType</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsMaintenanceDlg_MaitenanceOptions##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsMaintenanceDlg_ProgramMaintenance##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Ico1</td><td>Icon</td><td>35</td><td>75</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary6</td></row>
+		<row><td>MaintenanceType</td><td>Ico2</td><td>Icon</td><td>35</td><td>135</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary7</td></row>
+		<row><td>MaintenanceType</td><td>Ico3</td><td>Icon</td><td>35</td><td>195</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary8</td></row>
+		<row><td>MaintenanceType</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>21</td><td>55</td><td>290</td><td>170</td><td>3</td><td>_IsMaintenance</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Text1</td><td>Text</td><td>80</td><td>72</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_ChangeFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Text2</td><td>Text</td><td>80</td><td>135</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_RepairMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Text3</td><td>Text</td><td>80</td><td>192</td><td>260</td><td>35</td><td>131075</td><td/><td>##IDS__IsMaintenanceDlg_RemoveProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>MaintenanceWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsMaintenanceWelcome_WizardWelcome##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>50</td><td>196611</td><td/><td>##IDS__IsMaintenanceWelcome_MaintenanceOptionsDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>MsiRMFilesInUse</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Restart</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUseMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>348</td><td>14</td><td>3</td><td/><td>##IDS__IsMsiRMFilesInUse_ApplicationsUsingFiles##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUse##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>List</td><td>ListBox</td><td>21</td><td>66</td><td>331</td><td>130</td><td>3</td><td>FileInUseProcess</td><td/><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Restart</td><td>RadioButtonGroup</td><td>19</td><td>187</td><td>343</td><td>40</td><td>3</td><td>RestartManagerOption</td><td/><td>List</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>OutOfSpace</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsDiskSpaceDlg_DiskSpace##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>43</td><td>3</td><td/><td>##IDS__IsDiskSpaceDlg_HighlightedVolumes##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsDiskSpaceDlg_OutOfDiskSpace##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>List</td><td>VolumeCostList</td><td>21</td><td>95</td><td>332</td><td>120</td><td>393223</td><td/><td>##IDS__IsDiskSpaceDlg_Numbers##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Resume</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsDiskSpaceDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>PatchWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsPatchDlg_Update##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsPatchDlg_WelcomePatchWizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>54</td><td>228</td><td>45</td><td>196611</td><td/><td>##IDS__IsPatchDlg_PatchClickUpdate##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1048579</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>3</td><td/><td/><td>DlgTitle</td><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>ReadmeInformation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1048579</td><td/><td>##IDS__IsReadmeDlg_Cancel##</td><td>Readme</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>232</td><td>16</td><td>65539</td><td/><td>##IDS__IsReadmeDlg_PleaseReadInfo##</td><td>Back</td><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>3</td><td/><td/><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>193</td><td>13</td><td>65539</td><td/><td>##IDS__IsReadmeDlg_ReadMeInfo##</td><td>DlgDesc</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>1048579</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Readme</td><td>ScrollableText</td><td>10</td><td>55</td><td>353</td><td>166</td><td>3</td><td/><td/><td>Banner</td><td/><td>0</td><td/><td>&lt;ISProductFolder&gt;\Redist\0409\Readme.rtf</td><td/></row>
+		<row><td>ReadyToInstall</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>GroupBox1</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>ReadyToInstall</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>CompanyNameText</td><td>Text</td><td>38</td><td>198</td><td>211</td><td>9</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Company##</td><td>SerialNumberText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>CurrentSettingsText</td><td>Text</td><td>19</td><td>80</td><td>81</td><td>10</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_CurrentSettings##</td><td>InstallNow</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyReadyDlg_WizardReady##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgText1</td><td>Text</td><td>21</td><td>54</td><td>330</td><td>24</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_BackOrCancel##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgText2</td><td>Text</td><td>21</td><td>99</td><td>330</td><td>20</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_InstallFor##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ModifyReady##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgTitle2</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ReadyRepair##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgTitle3</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ReadyInstall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>GroupBox1</td><td>Text</td><td>19</td><td>92</td><td>330</td><td>133</td><td>65541</td><td/><td/><td>SetupTypeText1</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>InstallNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>8388611</td><td/><td>##IDS__IsVerifyReadyDlg_Install##</td><td>InstallPerMachine</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>InstallPerMachine</td><td>PushButton</td><td>63</td><td>123</td><td>248</td><td>17</td><td>8388610</td><td/><td>##IDS__IsRegisterUserDlg_Anyone##</td><td>InstallPerUser</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>InstallPerUser</td><td>PushButton</td><td>63</td><td>143</td><td>248</td><td>17</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_OnlyMe##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>SerialNumberText</td><td>Text</td><td>38</td><td>211</td><td>306</td><td>9</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Serial##</td><td>CurrentSettingsText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>SetupTypeText1</td><td>Text</td><td>23</td><td>97</td><td>306</td><td>13</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_SetupType##</td><td>SetupTypeText2</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>SetupTypeText2</td><td>Text</td><td>37</td><td>114</td><td>306</td><td>14</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_SelectedSetupType##</td><td>TargetFolderText1</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>TargetFolderText1</td><td>Text</td><td>24</td><td>136</td><td>306</td><td>11</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_DestFolder##</td><td>TargetFolderText2</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>TargetFolderText2</td><td>Text</td><td>37</td><td>151</td><td>306</td><td>13</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Installdir##</td><td>UserInformationText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>UserInformationText</td><td>Text</td><td>23</td><td>171</td><td>306</td><td>13</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_UserInfo##</td><td>UserNameText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>UserNameText</td><td>Text</td><td>38</td><td>184</td><td>306</td><td>9</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_UserName##</td><td>CompanyNameText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>RemoveNow</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>ReadyToRemove</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ChoseRemoveProgram##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>24</td><td>131075</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ClickRemove##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgText1</td><td>Text</td><td>21</td><td>79</td><td>330</td><td>23</td><td>3</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ClickBack##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgText2</td><td>Text</td><td>21</td><td>102</td><td>330</td><td>24</td><td>3</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyRemoveAllDlg_RemoveProgram##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>RemoveNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>8388611</td><td/><td>##IDS__IsVerifyRemoveAllDlg_Remove##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Finish</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>CheckShowMsiLog</td><td>CheckBox</td><td>151</td><td>172</td><td>10</td><td>9</td><td>2</td><td>ISSHOWMSILOG</td><td/><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Finish</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFatalError_Finish##</td><td>Image</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>FinishText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsFatalError_NotModified##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>FinishText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_ClickFinish##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td>CheckShowMsiLog</td><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>SetupCompleteError</td><td>RestContText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsFatalError_KeepOrRestore##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>RestContText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_RestoreOrContinueLater##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>ShowMsiLogText</td><td>Text</td><td>164</td><td>172</td><td>198</td><td>10</td><td>65538</td><td/><td>##IDS__IsSetupComplete_ShowMsiLog##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsFatalError_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>25</td><td>196611</td><td/><td>##IDS__IsFatalError_WizardInterrupted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td>Image</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckBoxUpdates</td><td>CheckBox</td><td>135</td><td>164</td><td>10</td><td>9</td><td>2</td><td>ISCHECKFORPRODUCTUPDATES</td><td>CheckBox1</td><td>CheckShowMsiLog</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckForUpdatesText</td><td>Text</td><td>152</td><td>162</td><td>190</td><td>30</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_YesCheckForUpdates##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckLaunchProgram</td><td>CheckBox</td><td>151</td><td>114</td><td>10</td><td>9</td><td>2</td><td>LAUNCHPROGRAM</td><td/><td>CheckLaunchReadme</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckLaunchReadme</td><td>CheckBox</td><td>151</td><td>148</td><td>10</td><td>9</td><td>2</td><td>LAUNCHREADME</td><td/><td>CheckBoxUpdates</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckShowMsiLog</td><td>CheckBox</td><td>151</td><td>182</td><td>10</td><td>9</td><td>2</td><td>ISSHOWMSILOG</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td>CheckLaunchProgram</td><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>SetupCompleteSuccess</td><td>LaunchProgramText</td><td>Text</td><td>164</td><td>112</td><td>98</td><td>15</td><td>65538</td><td/><td>##IDS__IsExitDialog_LaunchProgram##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>LaunchReadmeText</td><td>Text</td><td>164</td><td>148</td><td>120</td><td>13</td><td>65538</td><td/><td>##IDS__IsExitDialog_ShowReadMe##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsExitDialog_Finish##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>ShowMsiLogText</td><td>Text</td><td>164</td><td>182</td><td>198</td><td>10</td><td>65538</td><td/><td>##IDS__IsSetupComplete_ShowMsiLog##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsExitDialog_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_InstallSuccess##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>TextLine3</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_UninstallSuccess##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>UpdateTextLine1</td><td>Text</td><td>135</td><td>30</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_Update_SetupFinished##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>UpdateTextLine2</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_Update_PossibleUpdates##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>UpdateTextLine3</td><td>Text</td><td>135</td><td>120</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_InternetConnection##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>A</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Abort##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>C</td

<TRUNCATED>


[11/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_DESC.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_DESC.CPP b/odbc/Driver/KO_DESC.CPP
new file mode 100644
index 0000000..77d8ead
--- /dev/null
+++ b/odbc/Driver/KO_DESC.CPP
@@ -0,0 +1,2778 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_DESC.CPP
+//
+// Purpose: Contains descriptor functions.
+//          As explained in the article, descriptors r the heart
+//          as far as driver design is concerned. Descriptors
+//          r essntially data structures to encapsulate one type of
+//          data. Say results from server. Say col specification from
+//          application and so. All the four descriptors (ARD,IRD,APD,IPD)
+//          r encapsulated inside the statement structure.
+//
+//          The local functions provided for each descriptor include
+//          1. maintaining the link list                   _SQLAttachXXXItem/_SQLDetachXXXItem
+//          2. getting an desc item from link list         _SQLGetXXXItem
+//          3. setting default values in desc header/item  _SQLSetXXXFieldsDefault/_SQLSetXXXItemFieldsDefault
+//          4. setting values in desc header/item          _SQLSetXXXField/_SQLSetXXXItemField
+//          5. getting values from desc header/item        _SQLGetXXXField/_SQLGetXXXItemField
+//          where XXX is the descriptor type ARD,IRD,APD,IPD
+//
+//          These functions are used internally by most functions
+//          like SQLBindCol, SQLColAttribiute and so on to maintain
+//          info in the descriptor structures.
+//
+//          The exposed functions allow the client to directly
+//          manipulate the descriptor values, and these functions
+//          also use these local functions only.
+//          But use of the exposed descriptor function is not very
+//          common in the ODBC parlance.
+//
+// Exported functions:
+//                       SQLGetDescField
+//                       SQLSetDescField
+//                       SQLGetDescRec
+//                       SQLSetDescRec
+//                       SQLCopyDesc
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+
+// ------------------------ local functions -----------------------------------
+pAPDItem     _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum );
+pIPDItem     _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum );
+pARDItem     _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum );
+pIRDItem     _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum );
+
+eGoodBad            _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem );
+
+eGoodBad            _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem );
+
+eGoodBad            _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum );
+
+eGoodBad            _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt );
+eGoodBad            _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem );
+
+RETCODE SQL_API     _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr );
+
+RETCODE SQL_API     _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr );
+
+RETCODE SQL_API     _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetARDItemField ( const pODBCARD pDesc, const pARDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr );
+
+RETCODE SQL_API     _SQLSetIRDField ( pODBCIRD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLSetIRDItemField ( pODBCIRD pDesc, pIRDItem pDescItem, Word pRecNum, Word pFldID,
+                                          const void* pDataPtr, Long pDataSize );
+RETCODE SQL_API     _SQLGetIRDField ( const pODBCIRD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                      Long* pDataSizePtr );
+RETCODE SQL_API     _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDescItem, Word pRecNum,
+                                          Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr , bool isANSI );
+
+RETCODE SQL_API     _SQLFreeAPDContent ( const pODBCAPD pDesc );
+RETCODE SQL_API     _SQLFreeIPDContent ( const pODBCIPD pDesc );
+RETCODE SQL_API     _SQLFreeARDContent ( const pODBCARD pDesc );
+RETCODE SQL_API     _SQLFreeIRDContent ( const pODBCIRD pDesc );
+
+eGoodBad            _SQLAttachARDItem ( pODBCARD pDesc, pARDItem pDescItem );
+eGoodBad            _SQLDetachARDItem ( pODBCARD pDesc, pARDItem pDescItem );
+
+
+// -----------------------------------------------------------------------
+// to get value of specified descriptor field
+// -----------------------------------------------------------------------
+
+RETCODE _SQLGetDescField_basic ( SQLHDESC        pDesc,
+                                 SQLSMALLINT     pRecNum,
+                                 SQLSMALLINT     pFldID,
+                                 SQLPOINTER      pDataPtr,
+                                 SQLINTEGER      pDataSize,
+                                 SQLINTEGER*     pDataSizePtr,
+                                 bool isANSI ) {
+    bool    invalidfld;
+    bool    headerfld;
+    Word    desctype;
+    
+    // precaution
+    if ( pDesc == NULL || pDataPtr == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // initializations
+    invalidfld = FALSE;
+    headerfld  = TRUE;
+    desctype   = _DESCTYPE ( pDesc );
+    
+    // check if descriptor is valid & reset diags
+    switch ( desctype ) {
+        case SQL_DESC_APD:
+            _SQLFreeDiag ( & ( ( ( pODBCAPD ) pDesc )->Stmt->Diag ) );
+            break;
+            
+        case SQL_DESC_IPD:
+            _SQLFreeDiag ( & ( ( ( pODBCIPD ) pDesc )->Stmt->Diag ) );
+            break;
+            
+        case SQL_DESC_ARD:
+            _SQLFreeDiag ( & ( ( ( pODBCARD ) pDesc )->Stmt->Diag ) );
+            break;
+            
+        case SQL_DESC_IRD:
+            _SQLFreeDiag ( & ( ( ( pODBCIRD ) pDesc )->Stmt->Diag ) );
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid descriptor handle" ) );
+            return SQL_ERROR;
+    }
+    
+    // HEADER FIELDS
+    
+    // check the field type - header field
+    switch ( pFldID ) {
+        case SQL_DESC_ALLOC_TYPE:
+        
+            /*****
+                SQLSMALLINT
+                ARD: R          APD: R          IRD: R          IPD: R
+                ARD: SQL_DESC_ALLOC_AUTO/SQL_DESC_ALLOC_USER
+                APD: SQL_DESC_ALLOC_AUTO/SQL_DESC_ALLOC_USER
+                IRD: SQL_DESC_ALLOC_AUTO
+                IPD: SQL_DESC_ALLOC_AUTO
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+            }
+            
+            break;
+            
+        case SQL_DESC_ARRAY_SIZE:
+        
+            /*********
+                SQLUINTEGER
+                ARD: R/W        APD: R/W        IRD: Unused     IPD: Unused
+                ARD:[1]         APD:[1]         IRD: Unused     IPD: Unused
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+        
+            /**********
+                SQLUSMALLINT*
+                ARD: R/W        APD: R/W        IRD: R/W        IPD: R/W
+                ARD: Null ptr   APD: Null ptr   IRD: Null ptr   IPD: Null ptr
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+            }
+            
+            break;
+            
+        case SQL_DESC_BIND_OFFSET_PTR:
+        
+            /**********
+                SQLINTEGER*
+                ARD: R/W        APD: R/W        IRD: Unused     IPD: Unused
+                ARD: Null ptr   APD: Null ptr   IRD: Unused     IPD: Unused
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_BIND_TYPE:
+        
+            /**********
+                SQLINTEGER
+                ARD: R/W        APD: R/W        IRD: Unused     IPD: Unused
+                ARD: SQL_BIND_BY_COLUMN
+                APD: SQL_BIND_BY_COLUMN         IRD: Unused     IPD: Unused
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_COUNT:
+        
+            /**********
+                SQLSMALLINT
+                ARD: R/W        APD: R/W        IRD: R          IPD: R/W
+                ARD: 0          APD: 0          IRD: D          IPD: 0
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+            }
+            
+            break;
+            
+        case SQL_DESC_ROWS_PROCESSED_PTR:
+        
+            /**********
+                SQLUINTEGER*
+                ARD: Unused         APD: Unused     IRD: R/W        IPD: R/W
+                ARD: Unused         APD: Unused     IRD: Null ptr   IPD: Null ptr
+            ***********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        default:
+            headerfld = FALSE;
+    }
+    
+    // check if not an header field
+    if ( headerfld == TRUE )
+    { return SQL_SUCCESS; }
+    
+    // check if invalid field
+    if ( invalidfld == TRUE ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid field %d for descriptor %d", pFldID, desctype ) );
+        return SQL_ERROR;
+    }
+    
+    // check the field type - record field
+    switch ( pFldID ) {
+        case SQL_DESC_AUTO_UNIQUE_VALUE:
+        
+            /***********
+                SQLINTEGER
+                ARD: Unused         APD: Unused         IRD: R      IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D      IPD: Unused
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_BASE_COLUMN_NAME:
+        
+            /**********
+                SQLCHAR *
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_BASE_TABLE_NAME:
+        
+            /********
+                SQLCHAR *
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            *******/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_CASE_SENSITIVE:
+        
+            /**********
+                SQLINTEGER
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: Unused         APD: Unused         IRD: D          IPD: D
+            *******/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_CATALOG_NAME:
+        
+            /**********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_CONCISE_TYPE:
+        
+            /**********
+                SQLSMALLINT
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: SQL_C_DEFAULT  APD: SQL_C_DEFAULT  IRD: D          IPD: ND
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_DATA_PTR:
+        
+            /***********
+                SQLPOINTER
+                ARD: R/W            APD: R/W            IRD: Unused     IPD: Unused
+                ARD: Null ptr       APD: Null ptr       IRD: Unused     IPD: Unused
+            ************/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_CODE:
+        
+            /**********
+                SQLSMALLINT
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
+        
+            /*********
+                SQLINTEGER
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_DISPLAY_SIZE:
+        
+            /*********
+                SQLINTEGER
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_FIXED_PREC_SCALE:
+        
+            /*********
+                SQLSMALLINT
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: Unused         APD: Unused         IRD: D          IPD: D[1]
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_INDICATOR_PTR:
+        
+            /**********
+                SQLINTEGER *
+                ARD: R/W            APD: R/W            IRD: Unused         IPD: Unused
+                ARD: Null ptr       APD: Null ptr       IRD: Unused         IPD: Unused
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_LABEL:
+        
+            /*********
+                SQLCHAR *
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            ***********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_LENGTH:
+        
+            /********
+                SQLUINTEGER
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+            }
+            
+            break;
+            
+        case SQL_DESC_LITERAL_PREFIX:
+        
+            /**********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            **********/
+            
+            // a read-only IRD field
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_LITERAL_SUFFIX:
+        
+            /**********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_LOCAL_TYPE_NAME:
+        
+            /***********
+                SQLCHAR *
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: Unused         APD: Unused         IRD: D          IPD: D
+            ***********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_NAME:
+        
+            /***********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_NULLABLE:
+        
+            /**********
+                SQLSMALLINT
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            ***********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_NUM_PREC_RADIX:
+        
+            /*********
+                SQLINTEGER
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_OCTET_LENGTH:
+        
+            /**********
+                SQLINTEGER
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_OCTET_LENGTH_PTR:
+        
+            /******
+                SQLINTEGER*
+                ARD: R/W            APD: R/W             IRD: Unused    IPD: Unused
+                ARD: Null ptr       APD: Null ptr        IRD: Unused    IPD: Unused
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_PARAMETER_TYPE:
+        
+            /*********
+                SQLSMALLINT
+                ARD: Unused         APD: Unused         IRD: Unused     IPD: R/W
+                ARD: Unused         APD: Unused         IRD: Unused     IPD: D=SQL_PARAM_INPUT
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_PRECISION:
+        
+            /*********
+                SQLSMALLINT
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_ROWVER:
+        
+            /*********
+                SQLSMALLINT
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: Unused         APD: Unused         IRD: ND         IPD: ND
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_SCALE:
+        
+            /********
+                SQLSMALLINT
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_SCHEMA_NAME:
+        
+            /*********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_SEARCHABLE:
+        
+            /*********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_TABLE_NAME:
+        
+            /********
+                SQLCHAR*
+                ARD: Unused         APD: Unused         IRD: R          IPD: Unused
+                ARD: Unused         APD: Unused         IRD: D          IPD: Unused
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_TYPE:
+        
+            /*********
+                SQLSMALLINT
+                ARD: R/W            APD: R/W            IRD: R          IPD: R/W
+                ARD: SQL_C_DEFAULT  APD: SQL_C_DEFAULT  IRD: D          IPD: ND
+            *********/
+            switch ( desctype ) {
+                case SQL_DESC_APD:
+                    return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_ARD:
+                    return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+            }
+            
+            break;
+            
+        case SQL_DESC_TYPE_NAME:
+        
+            /*********
+                SQLCHAR *
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: Unused         APD: Unused         IRD: D          IPD: D
+            **********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_UNNAMED:
+        
+            /********
+                SQLSMALLINT
+                ARD: Unused         APD: Unused         IRD: R          IPD: R/W
+                ARD: ND             APD: ND             IRD: D          IPD: ND
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        case SQL_DESC_UNSIGNED:
+        
+            /*********
+                SQLSMALLINT
+                ARD: Unused         APD: Unused         IRD: R          IPD: R
+                ARD: Unused         APD: Unused         IRD: D          IPD: D
+            ********/
+            switch ( desctype ) {
+                case SQL_DESC_IPD:
+                    return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr );
+                    
+                case SQL_DESC_IRD:
+                    return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI );
+                    
+                default:
+                    invalidfld = TRUE;
+            }
+            
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Unknown field %d", pFldID ) );
+            return SQL_ERROR;
+    }
+    
+    // check if invalid field
+    if ( invalidfld == TRUE ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid field %d for descriptor %d", pFldID, desctype ) );
+        return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+RETCODE SQL_API SQLGetDescFieldW ( SQLHDESC        pDesc,
+                                   SQLSMALLINT     pRecNum,
+                                   SQLSMALLINT     pFldID,
+                                   SQLPOINTER      pDataPtr,
+                                   SQLINTEGER      pDataSize,
+                                   SQLINTEGER*     pDataSizePtr )
+
+{
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLGetDescFieldW called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc,
+                              ( pDesc ) ? * ( ( short* ) pDesc ) : 0, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) );
+    return _SQLGetDescField_basic ( pDesc, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, false );
+}
+
+RETCODE SQL_API SQLGetDescField ( SQLHDESC        pDesc,
+                                  SQLSMALLINT     pRecNum,
+                                  SQLSMALLINT     pFldID,
+                                  SQLPOINTER      pDataPtr,
+                                  SQLINTEGER      pDataSize,
+                                  SQLINTEGER*     pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLGetDescField called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc,
+                              ( pDesc ) ? * ( ( short* ) pDesc ) : 0, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) );
+    return _SQLGetDescField_basic ( pDesc, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, true );
+}
+
+// -----------------------------------------------------------------------
+// to set a single field in a desc record
+// -----------------------------------------------------------------------
+RETCODE SQL_API SQLSetDescFieldW ( SQLHDESC        pDesc,
+                                   SQLSMALLINT     pRecNum,
+                                   SQLSMALLINT     pFldID,
+                                   SQLPOINTER      pDataPtr,
+                                   SQLINTEGER      pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLSetDescFieldW called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc,
+                              ( pDesc ) ? * ( ( short* ) pDesc ) : ( short ) pDesc, pRecNum, pFldID, pDataPtr, pDataSize ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescFieldW Not implemented" ) );
+    return SQL_ERROR;
+}
+
+RETCODE SQL_API SQLSetDescField ( SQLHDESC        pDesc,
+                                  SQLSMALLINT     pRecNum,
+                                  SQLSMALLINT     pFldID,
+                                  SQLPOINTER      pDataPtr,
+                                  SQLINTEGER      pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLSetDescField called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc,
+                              ( pDesc ) ? * ( ( short* ) pDesc ) : ( short ) pDesc, pRecNum, pFldID, pDataPtr, pDataSize ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescField Not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to get multiple fields from a desc record, at one shot
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetDescRec ( SQLHDESC        pDesc,
+                                SQLSMALLINT     pRecNum,
+                                SQLCHAR*        pName,
+                                SQLSMALLINT     pNameSize,
+                                SQLSMALLINT*    pNameSizePtr,
+                                SQLSMALLINT*    pTypePtr,
+                                SQLSMALLINT*    pSubTypePtr,
+                                SQLINTEGER*     pLengthPtr,
+                                SQLSMALLINT*    pPrecisionPtr,
+                                SQLSMALLINT*    pScalePtr,
+                                SQLSMALLINT*    pNullablePtr )
+
+{
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDescRec called Desc: %d, DescType: %d, RecNum: %d", pDesc,
+                              pDesc ? * ( ( short* ) pDesc ) : 0, pRecNum ) );
+    Word desctype;
+    Long i;
+    
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescRec - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // initializations
+    desctype   = _DESCTYPE ( pDesc );
+    
+    switch ( desctype ) {
+        case SQL_DESC_APD:
+            pAPDItem apditem;
+            _SQLFreeDiag ( & ( ( ( pODBCAPD ) pDesc )->Stmt->Diag ) );
+            // get item from APD
+            apditem = _SQLGetAPDItem ( ( pODBCAPD ) pDesc, pRecNum );
+            
+            // check if item located
+            if ( apditem == NULL ) {
+                __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid APD item" ) );
+                return SQL_ERROR;
+            }
+            
+            // get the fields
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i );
+            *pNameSizePtr = ( Word ) i;
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL );
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1,
+                                  NULL );
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL );
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL );
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL );
+            _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL );
+            break;
+            
+        case SQL_DESC_IPD:
+            pIPDItem ipditem;
+            _SQLFreeDiag ( & ( ( ( pODBCIPD ) pDesc )->Stmt->Diag ) );
+            // get item from IPD
+            ipditem = _SQLGetIPDItem ( ( pODBCIPD ) pDesc, pRecNum );
+            
+            // check if item located
+            if ( ipditem == NULL ) {
+                __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid IPD item" ) );
+                return SQL_ERROR;
+            }
+            
+            // set the fields
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i );
+            *pNameSizePtr = ( Word ) i;
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL );
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1,
+                                  NULL );
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL );
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL );
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL );
+            _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL );
+            break;
+            
+        case SQL_DESC_ARD:
+            pARDItem arditem;
+            _SQLFreeDiag ( & ( ( ( pODBCARD ) pDesc )->Stmt->Diag ) );
+            // get item from ARD
+            arditem = _SQLGetARDItem ( ( pODBCARD ) pDesc, pRecNum );
+            
+            // check if item located
+            if ( arditem == NULL ) {
+                __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid ARD item" ) );
+                return SQL_ERROR;
+            }
+            
+            // get the fields
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i );
+            *pNameSizePtr = ( Word ) i;
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL );
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1,
+                                  NULL );
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL );
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL );
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL );
+            _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL );
+            break;
+            
+        case SQL_DESC_IRD:
+            _SQLFreeDiag ( & ( ( ( pODBCIRD ) pDesc )->Stmt->Diag ) );
+            
+        // fall thru
+        
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescRec - Invalid descriptor handle" ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to set multiple fields in a desc record, at one shot
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLSetDescRec ( SQLHDESC        pDesc,
+                                SQLSMALLINT     pRecNum,
+                                SQLSMALLINT     pType,
+                                SQLSMALLINT     pSubType,
+                                SQLINTEGER      pLength,
+                                SQLSMALLINT     pPrecision,
+                                SQLSMALLINT     pScale,
+                                SQLPOINTER      pDataPtr,
+                                SQLINTEGER*     pDataSizePtr,
+                                SQLINTEGER*     pDataIndPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetDescRec called Desc: %d, DescType: %d, RecNum: %d", pDesc,
+                              pDesc ? * ( ( short* ) pDesc ) : 0, pRecNum ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescRec  Not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to copy descriptor information from one descriptor handle to another
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLCopyDesc ( SQLHDESC pSrcDescHandle,
+                              SQLHDESC pTgtDescHandle ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLCopyDesc called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLCopyDesc not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+/////////////////////// TO GET A DESC ITEM
+
+
+// -----------------------------------------------------------------------
+// to get a particular ARD item
+// -----------------------------------------------------------------------
+
+pARDItem _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum ) {
+    pARDItem i;
+    
+    // loop to see if binding for that col already exists
+    for ( i = pDesc->BindCols; i != NULL && i->ColNum != pRecNum; i = i->Next );
+    
+    // return the ARD item
+    return i;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a particular IPD item
+// -----------------------------------------------------------------------
+
+pAPDItem _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum ) {
+    pAPDItem i;
+    
+    // loop to see if binding for that col already exists
+    for ( i = pDesc->BindParams; i != NULL && i->ParamNum != pRecNum; i = i->Next );
+    
+    // return the ARD item
+    return i;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a particular IRD item, mhb
+// -----------------------------------------------------------------------
+
+pIRDItem _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum ) {
+    // check if descriptor is valid
+    if ( pDesc == NULL || pDesc->RowDesc == NULL )
+    { return NULL; }
+    
+    return pDesc->RowDesc->columnMetas.at ( pRecNum - 1 );
+}
+
+
+// -----------------------------------------------------------------------
+// to get a particular IPD item
+// -----------------------------------------------------------------------
+
+pIPDItem _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum ) {
+    pIPDItem i;
+    
+    // loop to see if binding for that col already exists
+    for ( i = pDesc->BindParams; i != NULL && i->ParamNum != pRecNum; i = i->Next );
+    
+    // return the ARD item
+    return i;
+}
+
+
+
+/////////////////////// DEFAULTS
+
+
+// -----------------------------------------------------------------------
+// to set default values of APD header
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt ) {
+    // reset all
+    memset ( pDesc, 0, sizeof ( ODBCAPD ) );
+    // set explicit defaults
+    pDesc->Sign             = SQL_DESC_APD;
+    pDesc->Stmt             = pStmt;
+    pDesc->AllocType        = SQL_DESC_ALLOC_AUTO;
+    pDesc->RowArraySize     = 1;
+    pDesc->BindTypeOrSize   = SQL_BIND_BY_COLUMN;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to set default values of APD item
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem ) {
+    // reset all
+    memset ( pDescItem, 0, sizeof ( APDItem ) );
+    // set explicit defaults
+    pDescItem->DataConciseType  = SQL_C_DEFAULT;
+    pDescItem->DataVerboseType  = SQL_C_DEFAULT;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to set default values of IPD header
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt ) {
+    // reset all
+    memset ( pDesc, 0, sizeof ( ODBCIPD ) );
+    // set explicit defaults
+    pDesc->Sign             = SQL_DESC_IPD;
+    pDesc->Stmt             = pStmt;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to set default values of IPD item
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem ) {
+    // reset all
+    memset ( pDescItem, 0, sizeof ( IPDItem ) );
+    // set explicit defaults
+    pDescItem->ParamType            = SQL_PARAM_INPUT;
+    pDescItem->DataConciseType      = SQL_DEFAULT;
+    pDescItem->DataVerboseType      = SQL_DEFAULT;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to set default values of ARD header
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt ) {
+    // reset all
+    memset ( pDesc, 0, sizeof ( ODBCARD ) );
+    // set explicit defaults
+    pDesc->Sign             = SQL_DESC_ARD;
+    pDesc->Stmt             = pStmt;
+    pDesc->AllocType        = SQL_DESC_ALLOC_AUTO;
+    pDesc->RowArraySize     = 1;
+    pDesc->BindTypeOrSize   = SQL_BIND_BY_COLUMN;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to set default values of ARD item
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum ) {
+    // reset
+    memset ( pDescItem, 0, sizeof ( ARDItem ) );
+    // set explicit defaults
+    pDescItem->ColNum = pRecNum;
+    pDescItem->DataConciseType  = SQL_C_DEFAULT;
+    pDescItem->DataVerboseType  = SQL_C_DEFAULT;
+    return GOOD;
+}
+
+
+// -----------------------------------------------------------------------
+// to set default values of IRD header
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt ) {
+    // reset all
+    memset ( pDesc, 0, sizeof ( ODBCIRD ) );
+    // set explicit defaults
+    pDesc->Sign             = SQL_DESC_IRD;
+    pDesc->Stmt             = pStmt;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to set default values of IRD item
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem ) {
+    return GOOD;
+}
+
+
+//////////////////////// GET AND SET FIELD VALUES
+
+/////////////////////// APD
+
+// -----------------------------------------------------------------------
+// to set a field value in APD
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetAPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d",
+                              pDesc, pFldID, pDataPtr, pDataSize ) );
+                              
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    switch ( pFldID ) {
+        case SQL_DESC_ARRAY_SIZE:
+            pDesc->RowArraySize = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+            pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_BIND_OFFSET_PTR:
+            pDesc->BindOffsetPtr = ( Long* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_BIND_TYPE:
+            pDesc->BindTypeOrSize = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_COUNT:
+            // ???? requires that all descriptors which r above the specified
+            // value are freed
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - SQL_DESC_COUNT not implemented" ) );
+            return SQL_ERROR;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to set a field value in APD item
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID,
+                                      const void* pDataPtr, Long pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLSetAPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc,
+                              pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) );
+    pAPDItem    item;
+    
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDItemField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if item has not been explicitly specified
+    if ( pDescItem == NULL ) {
+        // get item from APD
+        item = _SQLGetAPDItem ( pDesc, pRecNum );
+        
+        // check if item located
+        if ( item == NULL ) {
+            // as a patch for SQL server it is temporarily ignoring the error
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetAPDItemField - invalid item" ) );
+            return SQL_SUCCESS;
+            /////////// actual action is as follows /////////
+            //__ODBCPOPMSG(_ODBCPopMsg("_SQLGetAPDItemField - invalid item"));
+            //return SQL_ERROR;
+            /////////////////////////////////////////////////
+        }
+    }
+    
+    else
+    { item = pDescItem; }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_CONCISE_TYPE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ),
+                              & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_DATA_PTR:
+            item->DataPtr = ( void* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_CODE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr,
+                              & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
+            item->DateTimeIntervalPrec = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_INDICATOR_PTR:
+            item->SizeIndPtr = ( Long* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_LENGTH:
+        case SQL_DESC_OCTET_LENGTH:
+            item->DataSize = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_NUM_PREC_RADIX:
+            item->NumPrecRadix = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_OCTET_LENGTH_PTR:
+            item->SizePtr = ( Long* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_PRECISION:
+            item->DataSize = ( Word ) pDataPtr;
+            break;
+            
+        case SQL_DESC_SCALE:
+            item->Scale = ( Word ) pDataPtr;
+            break;
+            
+        case SQL_DESC_TYPE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ),
+                              & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDItemField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to get a field value from APD
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                  Long* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLGetAPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr,
+                              pDataSize, pDataSizePtr ) );
+                              
+    // precaution
+    if ( pDesc == NULL || pDataPtr == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetAPDField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_ALLOC_TYPE:
+            * ( ( Word* ) pDataPtr ) =  pDesc->AllocType;
+            break;
+            
+        case SQL_DESC_ARRAY_SIZE:
+            * ( ( ULong* ) pDataPtr ) = pDesc->RowArraySize;
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+            * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr;
+            break;
+            
+        case SQL_DESC_BIND_OFFSET_PTR:
+            * ( ( Long** ) pDataPtr ) = pDesc->BindOffsetPtr;
+            break;
+            
+        case SQL_DESC_BIND_TYPE:
+            * ( ( Long* ) pDataPtr ) = pDesc->BindTypeOrSize;
+            break;
+            
+        case SQL_DESC_COUNT:
+            * ( ( Word* ) pDataPtr ) = pDesc->DescCount;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to get a field value from an APD item
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum,
+                                      Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLGetAPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d",
+                              pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) );
+    pAPDItem     item;
+    
+    // precaution
+    if ( pDesc == NULL || pDataPtr == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDItemField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if item has not been specified directly
+    if ( pDescItem == NULL ) {
+        // get item from IPD
+        item = _SQLGetAPDItem ( pDesc, pRecNum );
+        
+        // check if item located
+        if ( item == NULL ) {
+            // as a patch fro SQL server it is temporarily ignoring the error
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLGetAPDItemField - invalid item" ) );
+            return SQL_SUCCESS;
+            /////////// actual action is as follows /////////
+            //__ODBCPOPMSG(_ODBCPopMsg("_SQLGetAPDItemField - invalid item"));
+            //return SQL_ERROR;
+            /////////////////////////////////////////////////
+        }
+    }
+    
+    else
+    { item = pDescItem; }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_CONCISE_TYPE:
+            * ( ( Word* ) pDataPtr ) = item->DataConciseType;
+            break;
+            
+        case SQL_DESC_DATA_PTR:
+            * ( ( Long* ) pDataPtr ) = ( Long ) ( item->DataPtr );
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_CODE:
+            * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode;
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
+            * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec;
+            break;
+            
+        case SQL_DESC_INDICATOR_PTR:
+            * ( ( Long** ) pDataPtr ) = item->SizeIndPtr;
+            break;
+            
+        case SQL_DESC_LENGTH:
+        case SQL_DESC_OCTET_LENGTH:
+            * ( ( Long* ) pDataPtr ) = item->DataSize;
+            break;
+            
+        case SQL_DESC_NUM_PREC_RADIX:
+            * ( ( Long* ) pDataPtr ) = item->NumPrecRadix;
+            break;
+            
+        case SQL_DESC_OCTET_LENGTH_PTR:
+            * ( ( Long** ) pDataPtr ) = item->SizePtr;
+            break;
+            
+        case SQL_DESC_PRECISION:
+            * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize );
+            break;
+            
+        case SQL_DESC_SCALE:
+            * ( ( Word* ) pDataPtr ) = ( Word ) ( item->Scale );
+            break;
+            
+        case SQL_DESC_TYPE:
+            * ( ( Word* ) pDataPtr ) = item->DataVerboseType;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDItemField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+
+/////////////////////// IPD
+
+
+// -----------------------------------------------------------------------
+// to set a field value in IPD
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetIPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d",
+                              pDesc, pFldID, pDataPtr, pDataSize ) );
+                              
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_ALLOC_TYPE:
+            // assumes automatic alloc by driver as appl alloc
+            // is not allowed as of now
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+            pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_COUNT:
+            // ???? requires that all descriptors which r above the specified
+            // value are freed. not implemented as of now
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - SQL_DESC_COUNT not implemented" ) );
+            return SQL_ERROR;
+            break;
+            
+        case SQL_DESC_ROWS_PROCESSED_PTR:
+            pDesc->RowsProcessedPtr = ( ULong* ) pDataPtr;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to set a field value in IPD item
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID,
+                                      const void* pDataPtr, Long pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLSetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc,
+                              pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) );
+    pIPDItem     item;
+    
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if item has not been specified directly
+    if ( pDescItem == NULL ) {
+        // get item from IRD
+        item = _SQLGetIPDItem ( pDesc, pRecNum );
+        
+        // check if item located
+        if ( item == NULL ) {
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - invalid item" ) );
+            return SQL_ERROR;
+        }
+    }
+    
+    else
+    { item = pDescItem; }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_CONCISE_TYPE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ),
+                              & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_CODE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr,
+                              & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
+            item->DateTimeIntervalPrec = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_LENGTH:
+        case SQL_DESC_OCTET_LENGTH:
+            item->DataSize = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_NAME:
+            if ( pDataPtr && strlen ( ( Char* ) pDataPtr ) <= 32 )
+            { strcpy ( item->ParamName, ( Char* ) pDataPtr ); }
+            
+            else
+            { item->ParamName[0] = 0; }
+            
+        case SQL_DESC_NUM_PREC_RADIX:
+            item->NumPrecRadix = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_PARAMETER_TYPE:
+            item->ParamType = ( Word ) pDataPtr;
+            break;
+            
+        case SQL_DESC_PRECISION:
+            item->DataSize = ( Word ) pDataPtr;
+            break;
+            
+        case SQL_DESC_SCALE:
+            item->Scale = ( Word ) pDataPtr;
+            break;
+            
+        case SQL_DESC_TYPE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ),
+                              & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_UNNAMED:
+            // dummy, is related to SQL_DESC_NAME
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to get a field value from IPD
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                  Long* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLGetIPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr,
+                              pDataSize, pDataSizePtr ) );
+                              
+    // precaution
+    if ( pDesc == NULL || pDataPtr == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_ALLOC_TYPE:
+            * ( ( Word* ) pDataPtr ) = SQL_DESC_ALLOC_AUTO;
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+            * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr;
+            break;
+            
+        case SQL_DESC_COUNT:
+            * ( ( Word* ) pDataPtr ) = pDesc->DescCount;
+            break;
+            
+        case SQL_DESC_ROWS_PROCESSED_PTR:
+            * ( ( ULong** ) pDataPtr ) = pDesc->RowsProcessedPtr;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a field value from an IPD item
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum,
+                                      Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLGetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d",
+                              pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) );
+    pIPDItem     item;
+    
+    // precaution
+    if ( pDesc == NULL || pDataPtr == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if item has not been specified directly
+    if ( pDescItem == NULL ) {
+        // get item from IPD
+        item = _SQLGetIPDItem ( pDesc, pRecNum );
+        
+        // check if item located
+        if ( item == NULL ) {
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - invalid item" ) );
+            return SQL_ERROR;
+        }
+    }
+    
+    else
+    { item = pDescItem; }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_CASE_SENSITIVE:
+            * ( ( Long* ) pDataPtr ) = SQL_FALSE;         // whether a param is case-sensitive
+            break;
+            
+        case SQL_DESC_CONCISE_TYPE:
+            * ( ( Word* ) pDataPtr ) = item->DataConciseType;
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_CODE:
+            * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode;
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
+            * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec;
+            break;
+            
+        case SQL_DESC_FIXED_PREC_SCALE:
+            * ( ( Word* ) pDataPtr ) = item->FixedPrecScale;
+            break;
+            
+        case SQL_DESC_LENGTH:
+        case SQL_DESC_OCTET_LENGTH:
+            * ( ( Long* ) pDataPtr ) = item->DataSize;
+            break;
+            
+        case SQL_DESC_TYPE_NAME:
+        case SQL_DESC_LOCAL_TYPE_NAME:
+            // ???? there is no param type string defined in IPD as of now
+            _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, "", -1 );
+            break;
+            
+        case SQL_DESC_NAME:
+            _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, item->ParamName, -1 );
+            break;
+            
+        case SQL_DESC_NULLABLE:
+            * ( ( Word* ) pDataPtr ) = item->Nullable;
+            break;
+            
+        case SQL_DESC_NUM_PREC_RADIX:
+            * ( ( Long* ) pDataPtr ) = item->NumPrecRadix;
+            break;
+            
+        case SQL_DESC_PARAMETER_TYPE:
+            * ( ( Word* ) pDataPtr ) = item->ParamType;
+            break;
+            
+        case SQL_DESC_PRECISION:
+            * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize );
+            break;
+            
+        case SQL_DESC_ROWVER:
+            * ( ( Word* ) pDataPtr ) = SQL_FALSE;               // assumes that all cols r not auto-updating
+            break;
+            
+        case SQL_DESC_SCALE:
+            * ( ( Word* ) pDataPtr ) = item->Scale;
+            break;
+            
+        case SQL_DESC_TYPE:
+            * ( ( Word* ) pDataPtr ) = item->DataVerboseType;
+            break;
+            
+        case SQL_DESC_UNNAMED:
+            * ( ( Word* ) pDataPtr ) = SQL_NAMED;
+            break;
+            
+        case SQL_DESC_UNSIGNED:
+            * ( ( Word* ) pDataPtr ) = SQL_FALSE;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+
+
+/////////////////////// ARD
+
+// -----------------------------------------------------------------------
+// to set a field value in ARD header
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetARDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d",
+                              pDesc, pFldID, pDataPtr, pDataSize ) );
+                              
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_ARRAY_SIZE:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD RowArraySize is set to %d", ( ULong ) pDataPtr ) );
+            pDesc->RowArraySize = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+            pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_BIND_OFFSET_PTR:
+            pDesc->BindOffsetPtr = ( Long* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_BIND_TYPE:
+            pDesc->BindTypeOrSize = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_COUNT:
+            // ???? requires that all descriptors which r above the specified
+            // value are freed
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - SQL_DESC_COUNT not implemented" ) );
+            return SQL_ERROR;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to set a field value in ARD item
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID,
+                                      const void* pDataPtr, Long pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLSetARDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc,
+                              pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) );
+    pARDItem     item;
+    
+    // precaution
+    if ( pDesc == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if item has not been specified directly
+    if ( pDescItem == NULL ) {
+        // get item from ARD
+        item = _SQLGetARDItem ( pDesc, pRecNum );
+        
+        // check if item located
+        if ( item == NULL ) {
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - invalid item" ) );
+            return SQL_ERROR;
+        }
+    }
+    
+    else
+    { item = pDescItem; }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_CONCISE_TYPE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ),
+                              & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_DATA_PTR:
+            item->DataPtr = ( void* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_CODE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr,
+                              & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
+            item->DateTimeIntervalPrec = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_INDICATOR_PTR:
+            item->SizeIndPtr = ( Long* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_LENGTH:
+        case SQL_DESC_OCTET_LENGTH:
+            item->DataSize = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_NUM_PREC_RADIX:
+            item->NumPrecRadix = ( Long ) pDataPtr;
+            break;
+            
+        case SQL_DESC_OCTET_LENGTH_PTR:                         // 1004
+            item->SizePtr = ( Long* ) pDataPtr;
+            break;
+            
+        case SQL_DESC_PRECISION:
+            item->DataSize = ( Word ) pDataPtr;                 // bytes required for numeric type
+            break;
+            
+        case SQL_DESC_SCALE:
+            item->Scale = ( Word ) pDataPtr;
+            break;
+            
+        case SQL_DESC_TYPE:
+            _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ),
+                              & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) );
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - unknown field (%d)", pFldID ) );
+            return SQL_ERROR;
+            break;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a field value from ARD
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize,
+                                  Long* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLGetARDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr,
+                              pDataSize, pDataSizePtr ) );
+                              
+    // precaution
+    if ( pDesc == NULL || pDataPtr == NULL ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - invalid params" ) );
+        return SQL_ERROR;
+    }
+    
+    // as per required field
+    switch ( pFldID ) {
+        case SQL_DESC_ALLOC_TYPE:
+            * ( ( Word* ) pDataPtr ) =  pDesc->AllocType;
+            break;
+            
+        case SQL_DESC_ARRAY_SIZE:
+            * ( ( ULong* ) pDataPtr ) = pDesc->RowArraySize;
+            break;
+            
+        case SQL_DESC_ARRAY_STATUS_PTR:
+            * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr;
+            break;
+            
+        case SQL_DESC_BIND_OFFSET_PTR:
+            * ( ( Long** ) pDataPtr ) = pDesc->BindOffsetPtr;
+            break;
+            
+        case SQL_DESC_BIND_TYPE:
+            * ( ( Long* ) pDataPtr ) = pDesc->BindTypeOrSize;
+            break;
+            
+        case SQL_DESC_COUNT:
+            * ( ( Word* ) pDataPtr ) = pDesc->DescCount;
+            break

<TRUNCATED>


[10/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_DIAG.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_DIAG.CPP b/odbc/Driver/KO_DIAG.CPP
new file mode 100644
index 0000000..238bb64
--- /dev/null
+++ b/odbc/Driver/KO_DIAG.CPP
@@ -0,0 +1,934 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_DIAG.CPP
+//
+// Purpose: Contains DIAG related functions.
+//          Contains debug/log related functions.
+//          The diagnostic functions work as per ODBC
+//          specification while the log functions
+//          are useful for debugging.
+//
+//          Each function call to the driver manager
+//          can be logged by it using Tracing feature. Over
+//          and above that our driver can also log call
+//          to each function. This is useful to trace the
+//          error faster and with precision. The _ODBCPopMsg
+//          function is used to show an immediate popup msg
+//
+//          Diagnostic message are to be maintained as a list
+//          at environment, connection and statement level. The
+//          details r encapsulated inside ODBCDiag structures
+//          defined in KylinODBC.h
+//
+//          SQLGetDiagRec allows u to get the most common fields
+//          of a diagnostic message which can be either an error
+//          or info. SQLGetDiagField allows you to get all the
+//          possible info but one field at a time
+//
+//          The local function _SQLPutDiagRow puts the row in the
+//          diag structure. There r versions of this function depending
+//          upon whether the diagnostic handle is directly available
+//          to caller and whether row and col info is applicable to the
+//          diagnostic situation
+//
+// Exported functions:
+//                       SQLGetDiagField
+//                       SQLGetDiagRec
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+#include <fcntl.h>
+#include <io.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <time.h>
+#include <stdarg.h>
+
+
+
+
+
+// --------------------- local functions ---------------------------------
+static pODBCDiagRow      _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum );
+static pODBCDiag         _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle );
+
+// --------------------- local functions ---------------------------------
+static LogLevel             currentLogLevel =
+    LogLevel_INFO;// Global variable to be set at the begining of pragram starts
+
+// -----------------------------------------------------------------------
+// to get a specified field from the specified diag row
+// -----------------------------------------------------------------------
+
+
+RETCODE SQL_API SQLGetDiagFieldW ( SQLSMALLINT     pHandleType,
+                                   SQLHANDLE       pHandle,
+                                   SQLSMALLINT     pRecNum,
+                                   SQLSMALLINT     pFldID,
+                                   SQLPOINTER      pDataPtr,
+                                   SQLSMALLINT     pDataSize,
+                                   SQLSMALLINT*    pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLGetDiagFieldW called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", pHandleType, pRecNum, pFldID,
+                              pDataSize ) );
+    bool            c;
+    pODBCDiag    diag;
+    pODBCDiagRow diagrow;
+    SQLSMALLINT dummySize = 0;//used when pDataSizePtr is NULL
+    
+    if ( pDataSizePtr == NULL )
+    { pDataSizePtr = &dummySize; }
+    
+    __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR );
+    diag = _SQLGetDiagHandle ( pHandleType, pHandle );
+    
+    if ( !diag ) { return SQL_ERROR; }
+    
+    // field may be in diag header
+    c = FALSE;
+    
+    // check the field type - header fields
+    switch ( pFldID ) {
+        case SQL_DIAG_CURSOR_ROW_COUNT:
+        case SQL_DIAG_ROW_COUNT:                            // rows affected by update/insert
+            if ( pHandleType == SQL_HANDLE_STMT ) {
+                if ( pDataPtr )
+                { * ( ( SQLLEN* ) pDataPtr ) = ( pHandle ) ? ( ( pODBCStmt ) pHandle )->RowCount : 0; }
+                
+                return SQL_SUCCESS;
+            }
+            
+            else
+            { return SQL_ERROR; }
+            
+        case SQL_DIAG_DYNAMIC_FUNCTION:
+            if ( pHandleType == SQL_HANDLE_STMT ) {
+                _SQLCopyWCharDataW ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, ( ( pODBCStmt ) pHandle )->Stmt,
+                                     ( ( pODBCStmt ) pHandle )->StmtLen );
+                return SQL_SUCCESS;
+            }
+            
+            else
+            { return SQL_ERROR; }
+            
+            return SQL_ERROR;
+            
+        case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
+            if ( pHandleType == SQL_HANDLE_STMT ) {
+                if ( pDataPtr )
+                { * ( ( StrPtr ) pDataPtr ) = 1; }          // ??? debug test only
+                
+                _SQLCopyWCharDataW ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, ( ( pODBCStmt ) pHandle )->Stmt,
+                                     ( ( ( pODBCStmt ) pHandle )->StmtLen ) );
+                return SQL_SUCCESS;
+            }
+            
+            else
+            { return SQL_ERROR; }
+            
+        case SQL_DIAG_NUMBER: {                             // number of rows in diag
+                Word i;
+                
+                // check if there r any diag rows
+                if ( diag->DiagRows ) {
+                    // loop to count the rows
+                    for ( i = 1, diagrow = diag->DiagRows; diagrow != NULL; diagrow = diagrow->Next, i ++ );
+                    
+                    if ( pDataPtr )  { * ( ( Word* ) pDataPtr ) = i; }
+                }
+                
+                else if ( pDataPtr )  { * ( ( Word* ) pDataPtr ) = 0; }
+                
+                return SQL_SUCCESS;
+            }
+            break;
+            
+        default:
+            c = TRUE;
+    }
+    
+    // check if only a header field was required
+    if ( c == FALSE )
+    { return SQL_SUCCESS; }
+    
+    // check row and buffer
+    if ( pRecNum <= 0 || pDataSize < 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "GetDiagField  xxx1" ) );
+        return SQL_ERROR;
+    }
+    
+    // now get the desired row first
+    if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL )
+    { return SQL_NO_DATA; }
+    
+    // now set info as per the field required
+    switch ( pFldID ) {
+        case SQL_DIAG_CLASS_ORIGIN:
+            _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, "ODBC 3.0", -1 );
+            break;
+            
+        case SQL_DIAG_COLUMN_NUMBER:
+        
+            // needs to be implemented
+            if ( pDataPtr )  { * ( ( Long* ) pDataPtr ) = diagrow->Col; }
+            
+            break;
+            
+        case SQL_DIAG_CONNECTION_NAME:
+            if ( pDataPtr )             { * ( ( char* ) pDataPtr ) = 0; }
+            
+            if ( pDataSizePtr )         { *pDataSizePtr   = 0; }
+            
+            break;
+            
+        case SQL_DIAG_MESSAGE_TEXT:
+            return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->Msg, -1 );
+            
+        case SQL_DIAG_NATIVE:
+            if ( pDataPtr )             { * ( ( Long* ) pDataPtr ) = diagrow->NativeErrorCode; }
+            
+            if ( pDataSizePtr )         { *pDataSizePtr   = 0; }
+            
+            break;
+            
+        case SQL_DIAG_ROW_NUMBER:
+        
+            // needs to be implemented
+            if ( pDataPtr )  { * ( ( Long* ) pDataPtr ) = diagrow->Row; }
+            
+            break;
+            
+        case SQL_DIAG_SERVER_NAME: {
+                CStrPtr svr;
+                
+                // if handle type is connection
+                if ( pHandleType  == SQL_HANDLE_DBC )
+                { svr = ( ( pODBCConn ) pHandle )->Server; }
+                
+                else if ( pHandleType == SQL_HANDLE_STMT && ( ( pODBCStmt ) pHandle )->Conn )
+                { svr = ( ( pODBCStmt ) pHandle )->Conn->Server; }
+                
+                else
+                { svr = ""; }
+                
+                return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, svr, -1 );
+            }
+            
+        case SQL_DIAG_SQLSTATE:
+            return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 );
+            
+        case SQL_DIAG_SUBCLASS_ORIGIN:
+            // ??? dummy
+            return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 );
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d",
+                                         pHandleType, pRecNum, pFldID, pDataSize ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+RETCODE SQL_API SQLGetDiagField ( SQLSMALLINT     pHandleType,
+                                  SQLHANDLE       pHandle,
+                                  SQLSMALLINT     pRecNum,
+                                  SQLSMALLINT     pFldID,
+                                  SQLPOINTER      pDataPtr,
+                                  SQLSMALLINT     pDataSize,
+                                  SQLSMALLINT*    pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", pHandleType, pRecNum, pFldID,
+                              pDataSize ) );
+    bool            c;
+    pODBCDiag    diag;
+    pODBCDiagRow diagrow;
+    SQLSMALLINT dummySize = 0;//used when pDataSizePtr is NULL
+    
+    if ( pDataSizePtr == NULL )
+    { pDataSizePtr = &dummySize; }
+    
+    __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR );
+    diag = _SQLGetDiagHandle ( pHandleType, pHandle );
+    
+    if ( !diag ) { return SQL_ERROR; }
+    
+    // field may be in diag header
+    c = FALSE;
+    
+    // check the field type - header fields
+    switch ( pFldID ) {
+        case SQL_DIAG_CURSOR_ROW_COUNT:
+        case SQL_DIAG_ROW_COUNT:                            // rows affected by update/insert
+            if ( pHandleType == SQL_HANDLE_STMT ) {
+                if ( pDataPtr )
+                { * ( ( SQLLEN* ) pDataPtr ) = ( pHandle ) ? ( ( pODBCStmt ) pHandle )->RowCount : 0; }
+                
+                return SQL_SUCCESS;
+            }
+            
+            else
+            { return SQL_ERROR; }
+            
+        case SQL_DIAG_DYNAMIC_FUNCTION:
+            if ( pHandleType == SQL_HANDLE_STMT ) {
+                unique_ptr<char[]> p ( wchar2char ( ( ( pODBCStmt ) pHandle )->Stmt ) );
+                _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, p.get(), ( ( pODBCStmt ) pHandle )->StmtLen );
+                return SQL_SUCCESS;
+            }
+            
+            else
+            { return SQL_ERROR; }
+            
+            return SQL_ERROR;
+            
+        case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
+            if ( pHandleType == SQL_HANDLE_STMT ) {
+                if ( pDataPtr )
+                { * ( ( StrPtr ) pDataPtr ) = 1; }          // ??? debug test only
+                
+                unique_ptr<char[]> p ( wchar2char ( ( ( pODBCStmt ) pHandle )->Stmt ) );
+                _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, p.get(), ( ( ( pODBCStmt ) pHandle )->StmtLen ) );
+                return SQL_SUCCESS;
+            }
+            
+            else
+            { return SQL_ERROR; }
+            
+        case SQL_DIAG_NUMBER: {                             // number of rows in diag
+                Word i;
+                
+                // check if there r any diag rows
+                if ( diag->DiagRows ) {
+                    // loop to count the rows
+                    for ( i = 1, diagrow = diag->DiagRows; diagrow != NULL; diagrow = diagrow->Next, i ++ );
+                    
+                    if ( pDataPtr )  { * ( ( Word* ) pDataPtr ) = i; }
+                }
+                
+                else if ( pDataPtr )  { * ( ( Word* ) pDataPtr ) = 0; }
+                
+                return SQL_SUCCESS;
+            }
+            break;
+            
+        default:
+            c = TRUE;
+    }
+    
+    // check if only a header field was required
+    if ( c == FALSE )
+    { return SQL_SUCCESS; }
+    
+    // check row and buffer
+    if ( pRecNum <= 0 || pDataSize < 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "GetDiagField  xxx1" ) );
+        return SQL_ERROR;
+    }
+    
+    // now get the desired row first
+    if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL )
+    { return SQL_NO_DATA; }
+    
+    // now set info as per the field required
+    switch ( pFldID ) {
+        case SQL_DIAG_CLASS_ORIGIN:
+            _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, "ODBC 3.0", -1 );
+            break;
+            
+        case SQL_DIAG_COLUMN_NUMBER:
+        
+            // needs to be implemented
+            if ( pDataPtr )  { * ( ( Long* ) pDataPtr ) = diagrow->Col; }
+            
+            break;
+            
+        case SQL_DIAG_CONNECTION_NAME:
+            if ( pDataPtr )             { * ( ( char* ) pDataPtr ) = 0; }
+            
+            if ( pDataSizePtr )         { *pDataSizePtr   = 0; }
+            
+            break;
+            
+        case SQL_DIAG_MESSAGE_TEXT:
+            return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->Msg, -1 );
+            
+        case SQL_DIAG_NATIVE:
+            if ( pDataPtr )             { * ( ( Long* ) pDataPtr ) = diagrow->NativeErrorCode; }
+            
+            if ( pDataSizePtr )         { *pDataSizePtr   = 0; }
+            
+            break;
+            
+        case SQL_DIAG_ROW_NUMBER:
+        
+            // needs to be implemented
+            if ( pDataPtr )  { * ( ( Long* ) pDataPtr ) = diagrow->Row; }
+            
+            break;
+            
+        case SQL_DIAG_SERVER_NAME: {
+                CStrPtr svr;
+                
+                // if handle type is connection
+                if ( pHandleType  == SQL_HANDLE_DBC )
+                { svr = ( ( pODBCConn ) pHandle )->Server; }
+                
+                else if ( pHandleType == SQL_HANDLE_STMT && ( ( pODBCStmt ) pHandle )->Conn )
+                { svr = ( ( pODBCStmt ) pHandle )->Conn->Server; }
+                
+                else
+                { svr = ""; }
+                
+                return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, svr, -1 );
+            }
+            
+        case SQL_DIAG_SQLSTATE:
+            return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 );
+            
+        case SQL_DIAG_SUBCLASS_ORIGIN:
+            // ??? dummy
+            return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 );
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d",
+                                         pHandleType, pRecNum, pFldID, pDataSize ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+RETCODE SQL_API SQLGetDiagRecW ( SQLSMALLINT     pHandleType,
+                                 SQLHANDLE       pHandle,
+                                 SQLSMALLINT     pRecNum,
+                                 SQLWCHAR*        pSqlstate,
+                                 SQLINTEGER*     pNativeErrorPtr,
+                                 SQLWCHAR*        pMsgTxtPtr,
+                                 SQLSMALLINT     pMsgTxtSize,
+                                 SQLSMALLINT*    pMsgTxtSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDiagRecW called, HandleType: %d, RecNum: %d, BufLen: %d", pHandleType,
+                              pRecNum, pMsgTxtSize ) );
+    pODBCDiag    diag;
+    pODBCDiagRow diagrow;
+    __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR );
+    diag = _SQLGetDiagHandle ( pHandleType, pHandle );
+    
+    if ( !diag ) { return SQL_ERROR; }
+    
+    // now get the desired diag row
+    if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "sql no data" ) );
+        return SQL_NO_DATA;
+    }
+    
+    // sql-state
+    if ( pSqlstate ) {
+        char2wchar ( diagrow->State, pSqlstate, -1 );
+    }
+    
+    // native error code
+    if ( pNativeErrorPtr )
+    { ( *pNativeErrorPtr ) = diagrow->NativeErrorCode; }
+    
+    // msg
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The message is %s", diagrow->Msg ) );
+    _SQLCopyWCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow->Msg, -1 );
+    // debug
+    //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"SQLGetDiagRec msg: %s", pMsgTxtPtr ? ( StrPtr )pMsgTxtPtr : "(unknown)" ));
+    RETCODE ret  = ( pMsgTxtSizePtr && ( *pMsgTxtSizePtr ) > pMsgTxtSize ) ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The SQLGetDiagRecW return code is %d", ret ) );
+    return ret;
+}
+
+
+
+// -----------------------------------------------------------------------
+// to get all details of a diag row on specified handle
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetDiagRec ( SQLSMALLINT     pHandleType,
+                                SQLHANDLE       pHandle,
+                                SQLSMALLINT     pRecNum,
+                                SQLCHAR*        pSqlstate,
+                                SQLINTEGER*     pNativeErrorPtr,
+                                SQLCHAR*        pMsgTxtPtr,
+                                SQLSMALLINT     pMsgTxtSize,
+                                SQLSMALLINT*    pMsgTxtSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDiagRec called, HandleType: %d, RecNum: %d, BufLen: %d", pHandleType,
+                              pRecNum, pMsgTxtSize ) );
+    pODBCDiag    diag;
+    pODBCDiagRow diagrow;
+    __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR );
+    diag = _SQLGetDiagHandle ( pHandleType, pHandle );
+    
+    if ( !diag ) { return SQL_ERROR; }
+    
+    // now get the desired diag row
+    if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL )
+    { return SQL_NO_DATA; }
+    
+    // sql-state
+    if ( pSqlstate )
+    { strcpy ( ( char* ) pSqlstate, diagrow->State ); }
+    
+    // native error code
+    if ( pNativeErrorPtr )
+    { ( *pNativeErrorPtr ) = diagrow->NativeErrorCode; }
+    
+    // msg
+    _SQLCopyCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow->Msg, -1 );
+    // debug
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDiagRec msg: %s", pMsgTxtPtr ? ( StrPtr ) pMsgTxtPtr : "(unknown)" ) );
+    return ( pMsgTxtSizePtr && ( *pMsgTxtSizePtr ) > pMsgTxtSize ) ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to post/record a diagnostic message in the specified DIAG struct
+// -----------------------------------------------------------------------
+
+pODBCDiagRow _SQLPutDiagRow ( pODBCDiag pDiag, StrPtr pFunc, StrPtr pState, Long pNativeErrorCode,
+                              StrPtr pMsgArgs, va_list pArgs ) {
+    Char                s[4096];                        // arbitary and maximum length of message
+    pODBCDiagRow     l;
+    pODBCDiagRow     r;
+    
+    // first set the value of source function, assuming less than 64
+    if ( pFunc )
+    { strcpy ( pDiag->Func, pFunc ); }
+    
+    // create message template
+    strcpy ( s, "[Kylin][ODBC 1.0(w) Driver]" );
+    
+    // check if there is some message
+    if ( pMsgArgs )
+    { vsprintf ( s + strlen ( s ), pMsgArgs, pArgs ); }
+    
+    else
+    { strcat ( s, "(unknown)" ); }
+    
+    // allocate a new row
+    r = new ODBCDiagRow;
+    // reset
+    memset ( r, 0, sizeof ( ODBCDiagRow ) );
+    
+    // set the values for state and native error code
+    if ( pState )       { strncpy ( r->State, pState, SQL_SQLSTATE_SIZE ); }
+    
+    r->NativeErrorCode = pNativeErrorCode;
+    // allocate space for message
+    r->Msg = new Char[strlen ( s ) + 1];
+    strcpy ( r->Msg, s );
+    // set the default row and col values
+    r->Row = SQL_ROW_NUMBER_UNKNOWN;
+    r->Col = SQL_COLUMN_NUMBER_UNKNOWN;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "DiagMsg: %s", s ) );
+    
+    // ATTACH TO LIST
+    
+    // check for any existing rows
+    if ( pDiag->DiagRows ) {
+        // iterate to last row
+        for ( l = pDiag->DiagRows; l->Next != NULL; l = l->Next );
+        
+        // attach
+        l->Next = r;            // next of last row
+        r->Prev = l;            // last row becomes the prev row of this row
+    }
+    
+    else {
+        // make it the first row
+        pDiag->DiagRows = r;
+    }
+    
+    return r;
+}
+
+// -----------------------------------------------------------------------
+// to post/record a diagnostic message in the specified DIAG struct
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFunc, StrPtr pState,
+                          Long pNativeErrorCode, StrPtr pMsgArgs, ... ) {
+    // note
+    // this implementation of function does not take row/col as param
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLPutDiagRow called, handle type is %d", pHandleType ) );
+    va_list             args;
+    pODBCDiag        diag;
+    pODBCDiagRow     r;
+    __CHK_HANDLE ( pHandle, pHandleType, BAD );
+    diag = _SQLGetDiagHandle ( pHandleType, pHandle );
+    
+    if ( !diag )
+    { return BAD; }
+    
+    // get va_args
+    va_start ( args, pMsgArgs );
+    r = _SQLPutDiagRow ( diag, pFunc, pState, pNativeErrorCode, pMsgArgs, args );
+    va_end ( args );
+    return ( r ) ? GOOD : BAD;
+}
+
+// -----------------------------------------------------------------------
+// to post/record a diagnostic message in the specified DIAG struct
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFunc, StrPtr pState,
+                          Long pNativeErrorCode, Long pRow, Long pCol, StrPtr pMsgArgs, ... ) {
+    // note
+    // this implementation of function takes take row/col as param
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLPutDiagRow called" ) );
+    va_list             args;
+    pODBCDiag        diag;
+    pODBCDiagRow     r;
+    __CHK_HANDLE ( pHandle, pHandleType, BAD );
+    diag = _SQLGetDiagHandle ( pHandleType, pHandle );
+    
+    if ( !diag )
+    { return BAD; }
+    
+    // get va_args
+    va_start ( args, pMsgArgs );
+    r = _SQLPutDiagRow ( diag, pFunc, pState, pNativeErrorCode, pMsgArgs, args );
+    va_end ( args );
+    
+    if ( r ) {
+        r->Row = pRow;
+        r->Col = pCol;
+        return GOOD;
+    }
+    
+    return BAD;
+}
+
+// -----------------------------------------------------------------------
+// to free a specifed diag, plucks from parent/list AND FREEs it
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLFreeDiag ( pODBCDiag pHandle ) {
+    pODBCDiagRow     t;
+    
+    // check if rows r there to be freed
+    while ( pHandle->DiagRows ) {
+        ////// PLUCK
+        t = pHandle->DiagRows;
+        pHandle->DiagRows = t->Next;
+        
+        if ( pHandle->DiagRows )
+        { ( pHandle->DiagRows )->Prev = NULL; }
+        
+        ////// PLUCKED
+        
+        // free contents of row
+        if ( t->Msg ) {
+            delete[] t->Msg;
+            t->Msg = NULL;
+        }
+        
+        // free the row itself
+        delete t;
+        // no rows
+        pHandle->DiagRows = NULL;
+    }
+    
+    // free any other contents of the diag structure
+    return GOOD;
+}
+
+
+// -----------------------------------------------------------------------
+// to get the diag handle out of specified handle
+// -----------------------------------------------------------------------
+
+static pODBCDiag _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle ) {
+    // first extract the diag details
+    switch ( pHandleType ) {
+        case SQL_HANDLE_ENV:
+            return & ( ( ( pODBCEnv ) pHandle )->Diag );
+            
+        case SQL_HANDLE_DBC:
+            return & ( ( ( pODBCConn ) pHandle )->Diag );
+            
+        case SQL_HANDLE_STMT:
+            return & ( ( ( pODBCStmt ) pHandle )->Diag );
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDiagRec was called with desciptor handle" ) );
+            return NULL;                   // ??? support for desc diag not available now
+    }
+}
+
+
+// -----------------------------------------------------------------------
+// to get a specified diag row from link list
+// -----------------------------------------------------------------------
+
+static pODBCDiagRow _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum ) {
+    Word                i;
+    pODBCDiagRow     r;
+    
+    // loop to locate the specified row
+    for ( i = 1, r = pHandle->DiagRows; r != NULL && i <= pRowNum && i != pRowNum; r = r->Next, i ++ );
+    
+    // return the row or NULL as the case may be
+    return ( r != NULL && i == pRowNum ) ? r : NULL;
+}
+
+// -----------------------------------------------------------------------
+// to show a message immmediately to a user
+// -----------------------------------------------------------------------
+
+void _ODBCPopMsg ( const char* pMsgArgs, ... ) {
+    Char                s[4096];                        // arbitary and maximum length of message
+    va_list             args;
+    
+    // check if there is some message
+    if ( pMsgArgs ) {
+        // convert to full msg including parsed params
+        va_start ( args, pMsgArgs );
+        vsprintf ( s, pMsgArgs, args );
+        va_end ( args );
+    }
+    
+    else
+    { s[0] = 0; }
+    
+    _ODBCLogMsg ( LogLevel_FATAL, s );
+    #ifdef SHIPPING
+    // no thing
+    _ODBCLogMsg ( LogLevel_FATAL, "In Shipping mode, Skip popping up window..." );
+    #else
+    // show as window
+    MessageBox ( GetDesktopWindow(), s, "Kylin ODBC Says :", MB_OK );
+    #endif
+}
+
+//pop directly
+void __ODBCPopMsg ( const char* pMsgArgs, ... ) {
+    Char                s[4096];                        // arbitary and maximum length of message
+    va_list             args;
+    
+    // check if there is some message
+    if ( pMsgArgs ) {
+        // convert to full msg including parsed params
+        va_start ( args, pMsgArgs );
+        vsprintf ( s, pMsgArgs, args );
+        va_end ( args );
+    }
+    
+    else
+    { s[0] = 0; }
+    
+    #ifdef _CONSOLE
+    // show on console
+    fprintf ( stderr, s )
+    #else
+    // show as window
+    MessageBox ( GetDesktopWindow(), s, "Kylin ODBC Says:", MB_OK );
+    #endif
+}
+
+// -----------------------------------------------------------------------
+// to start log for debugging
+// -----------------------------------------------------------------------
+
+bool fileExist ( char* path ) {
+    DWORD dwAttrib = GetFileAttributes ( path );
+    return ( dwAttrib != INVALID_FILE_ATTRIBUTES &&
+             ! ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) );
+}
+
+void _ODBCLogStart ( void ) {
+    OutputDebugString ( "ODBCLogStart is called\n" ); // for DBMON
+    StrPtr      t;
+    time_t      ltime;
+    
+    // check if log file is open
+    if ( gLogFile == -1 ) {
+        OutputDebugString ( "Try to init the log file\n" ); // for DBMON
+        
+        if ( GetFileAttributes ( "c:\\kylin" ) == INVALID_FILE_ATTRIBUTES ) {
+            if ( !CreateDirectory ( "c:\\kylin", NULL ) ) {
+                if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
+                    // directory already exists
+                    //good
+                    OutputDebugString ( "Log folder already exist, ? \n" ); // for DBMON
+                }
+                
+                else {
+                    // creation failed due to some other reason
+                    OutputDebugString ( "Failed to creat log folder\n" ); // for DBMON
+                    throw;
+                }
+            }
+        }
+        
+        else {
+            OutputDebugString ( "Log folder already exist\n" ); // for DBMON
+        }
+        
+        bool debugMode = fileExist ( "c:\\kylin\\debug" ) || fileExist ( "c:\\kylin\\debug.txt" );
+        
+        if ( debugMode ) {
+            currentLogLevel = LogLevel_DEBUG;
+            OutputDebugString ( "Debug mode is on" ); // for DBMON
+        }
+        
+        OutputDebugString ( "Try to open log file\n" ); // for DBMON
+        time_t     now = time ( 0 );
+        struct tm  tstruct;
+        char buffer[100];
+        tstruct = *localtime ( &now );
+        strftime ( buffer, 100, "%Y-%m-%d.%X", &tstruct );
+        
+        for ( unsigned int i = 0 ; i < strlen ( buffer ); i++ ) {
+            if ( buffer[i] == '.' || buffer[i] == ':' )
+            { buffer[i] = '-'; }
+        }
+        
+        char file[256];
+        file[0] = '\0';
+        strcat ( file, "c:\\kylin\\odbc-" );
+        strcat ( file, buffer );
+        strcat ( file, ".log" );
+        printf ( file );
+        gLogFile = _open ( file, _O_CREAT | _O_APPEND | _O_RDWR, _S_IWRITE );
+        OutputDebugString ( "Finish to open log file\n" ); // for DBMON
+        
+        if ( gLogFile == -1 ) {
+            OutputDebugString ( "Open Log file failed.\n" ); // for DBMON
+        }
+        
+        else {
+            OutputDebugString ( "Open Log file succeed, logs are written to log file now.\n" ); // for DBMON
+        }
+        
+        // set the log start time
+        time ( &ltime );
+        t = ctime ( &ltime );
+        _write ( gLogFile, "Log start: ", strlen ( "Log start: " ) );
+        _write ( gLogFile, t, strlen ( t ) );
+        _write ( gLogFile, "\n", 1 );
+        //if(t!=NULL)
+        //delete[] t;
+    }
+    
+    // check if file opened succesfully
+    if ( gLogFile != -1 )
+    { ++ gLogUsage; }               // increment log usage
+    
+    else {
+        __ODBCPOPMSG ( ( __ODBCPopMsg ( "Log failed" ) ) );
+    }
+}
+
+// -----------------------------------------------------------------------
+// to stop log
+// -----------------------------------------------------------------------
+
+void _ODBCLogStop ( int pForce ) {
+    StrPtr      t;
+    time_t      ltime;
+    
+    // check if log file is being used
+    if ( gLogUsage > 0 ) {
+        // decrement log usage
+        -- gLogUsage;
+        // commit
+        _commit ( gLogFile );
+        
+        // check if log needs to be closed
+        if ( gLogUsage == 0 || pForce == 1 ) {
+            // set the log start time
+            time ( &ltime );
+            t = ctime ( &ltime );
+            _write ( gLogFile, "Log end: ", strlen ( "Log end: " ) );
+            _write ( gLogFile, t, strlen ( t ) );
+            _write ( gLogFile, "\n", 1 );
+            //if(t!=NULL)
+            //delete t;
+            _close ( gLogFile );
+            gLogFile = -1;
+        }
+    }
+}
+
+// --------------------------------------------------------------------
+// log a specified message
+// --------------------------------------------------------------------
+void _ODBCLogMsg ( LogLevel level , const wchar_t* textW ) {
+    unique_ptr<char[]> p ( wchar2char ( textW ) );
+    _ODBCLogMsg ( level, p.get() );
+}
+
+void _ODBCLogMsg ( LogLevel level, const char* pMsgArgs, ... ) {
+    if ( level < currentLogLevel ) {
+        return;//skip
+    }
+    
+    Char                s[4096];                        // arbitary and maximum length of message
+    va_list             args;
+    
+    // check if there is a log file
+    if ( gLogFile != -1 ) {
+        switch ( level ) {
+            case LogLevel_DEBUG:
+                _write ( gLogFile, "[DEBUG]", 7 );
+                break;
+                
+            case LogLevel_INFO:
+                _write ( gLogFile, "[INFO ]", 7 );
+                break;
+                
+            case LogLevel_WARN:
+                _write ( gLogFile, "[WARN ]", 7 );
+                break;
+                
+            case LogLevel_ERROR:
+                _write ( gLogFile, "[ERROR]", 7 );
+                break;
+                
+            case LogLevel_FATAL:
+                _write ( gLogFile, "[FATAL]", 7 );
+                break;
+                
+            default:
+                break;
+        }
+        
+        time_t     now = time ( 0 );
+        struct tm  tstruct;
+        char buffer[100];
+        tstruct = *localtime ( &now );
+        strftime ( buffer, 100, "%Y-%m-%d.%X", &tstruct );
+        _write ( gLogFile, "[", 1 );
+        _write ( gLogFile, buffer, strlen ( buffer ) );
+        _write ( gLogFile, "]", 1 );
+        
+        // MSG PARSING
+        
+        // check if there is some message
+        if ( pMsgArgs ) {
+            // convert to full msg including parsed params
+            va_start ( args, pMsgArgs );
+            vsprintf ( s, pMsgArgs, args );
+            va_end ( args );
+        }
+        
+        else
+        { s[0] = 0; }
+        
+        // LOG
+        _write ( gLogFile, s, strlen ( s ) );
+        _write ( gLogFile, "\n", 1 );
+    }
+}
+
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_DTYPE.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_DTYPE.CPP b/odbc/Driver/KO_DTYPE.CPP
new file mode 100644
index 0000000..2c1c940
--- /dev/null
+++ b/odbc/Driver/KO_DTYPE.CPP
@@ -0,0 +1,361 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_DTYPE.CPP
+//
+// Purpose: Contains functions related to data types as per ODBC.
+//          For defining the type of data ODBC uses three params
+//          Concise Type, Verbose Type and DateTime Interval.
+//          All of these r intertwined, setting one of these
+//          influences the other two.
+//
+//          These r stored inside the descriptors and accessed via
+//          descriptor functions defined in KO_DESC.CPP. These
+//          functions in turn call the _SQLSetDataType function
+//          from this file.
+//
+//          _SQLCheckDataType is to check if the data type recd. from
+//          the server is valid or not.
+//
+//          GetIRDDataTypeDefaults is used to get the default values
+//          for a data type. The string data type like CHAR, VARCHAR
+//          is passed to this function and the default length, precision
+//          nullability is obtained. This is then overriden by the caller
+//          with the specific values recd. from the server
+//
+// ----------------------------------------------------------------------------
+
+#include "stdafx.h"
+
+
+// ---------------------- function prototypes --------------------------
+eGoodBad            _SQLCheckDataType ( Word pDataType );
+eGoodBad            _SQLCheckIntervalCode ( Word pIntervalCode );
+eGoodBad            _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* pVerboseDataType,
+                                      Word* pConciseDataType, Word* pDateTimeIntervalCode );
+eGoodBad            GetIRDDataTypeDefaults ( CStrPtr pDataType, Word* pSqlDataType, Word* pNativeDataType,
+                                             Word* pPrecision, Word* pScale, Long* pLength, Long* pRadix );
+
+// -----------------------------------------------------------------------
+// to check if the specified type is a valid SQL data type
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLCheckDataType ( Word pDataType ) {
+    switch ( pDataType ) {
+        case SQL_CHAR:
+        case SQL_VARCHAR:
+        case SQL_WCHAR:
+        case SQL_WVARCHAR:
+        case SQL_C_SSHORT:
+        case SQL_C_USHORT:
+        case SQL_SMALLINT:
+        case SQL_C_SLONG:
+        case SQL_C_ULONG:
+        case SQL_INTEGER:
+        case SQL_NUMERIC:
+        case SQL_DECIMAL:
+        case SQL_FLOAT:
+        case SQL_REAL:
+        case SQL_DOUBLE:
+        case SQL_TYPE_DATE:
+        case SQL_TYPE_TIME:
+        case SQL_TYPE_TIMESTAMP:
+        case SQL_BIT:
+        case SQL_DEFAULT:
+        case SQL_C_SBIGINT  :
+        case SQL_C_UBIGINT :
+        case SQL_C_TINYINT  :
+        case SQL_C_STINYINT :
+        case SQL_C_UTINYINT :
+            return GOOD;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLCheckDataType: Unknown data type: %d", pDataType ) );
+            return BAD;
+    }
+}
+
+
+// -----------------------------------------------------------------------
+// to check if the specified type is a valid interval code
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLCheckIntervalCode ( Word pIntervalCode ) {
+    // can check the interval code
+    return GOOD;
+}
+
+
+// -----------------------------------------------------------------------
+// to set the value of data type and interval codes in descriptors
+// -----------------------------------------------------------------------
+
+eGoodBad _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* pVerboseDataType,
+                           Word* pConciseDataType, Word* pDateTimeIntervalCode ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetDataType is called, pFldID:%d, pFldValue:%d", pFldID, pFldValue ) );
+    // note
+    // the data type, concise data type, datetime interval code r interdependent
+    // setting one of these changes the other.
+    Word concise_type;
+    Word verbose_type;
+    Word datetime_interval;
+    // initial values
+    concise_type        = pConciseDataType ? *pConciseDataType : 0;
+    verbose_type        = pVerboseDataType ? *pVerboseDataType : 0;
+    datetime_interval   = pDateTimeIntervalCode ? *pDateTimeIntervalCode : 0;
+    
+    // check if concise type has been specified
+    if ( pFldID == SQL_DESC_CONCISE_TYPE ) {
+        // set the concise type itself first
+        concise_type = pFldValue;
+        
+        // based on concise type set the verbose type and datetime interval
+        switch ( concise_type ) {
+            case SQL_TYPE_DATE:
+                //case SQL_C_TYPE_DATE:
+                verbose_type        = SQL_DATETIME;
+                datetime_interval   = SQL_CODE_DATE;
+                break;
+                
+            case SQL_TYPE_TIME:
+                //case SQL_C_TYPE_TIME:
+                verbose_type        = SQL_DATETIME;
+                datetime_interval   = SQL_CODE_TIME;
+                break;
+                
+            case SQL_TYPE_TIMESTAMP:
+                //case SQL_C_TYPE_TIMESTAMP:
+                verbose_type        = SQL_DATETIME;
+                datetime_interval   = SQL_CODE_TIMESTAMP;
+                break;
+                
+            case SQL_INTERVAL_MONTH:
+                //case SQL_C_INTERVAL_MONTH:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_MONTH;
+                break;
+                
+            case SQL_INTERVAL_YEAR:
+                //case SQL_C_INTERVAL_YEAR:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_YEAR;
+                break;
+                
+            case SQL_INTERVAL_YEAR_TO_MONTH:
+                //case SQL_C_INTERVAL_YEAR_TO_MONTH:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_YEAR_TO_MONTH;
+                break;
+                
+            case SQL_INTERVAL_DAY:
+                //case SQL_C_INTERVAL_DAY:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_DAY;
+                break;
+                
+            case SQL_INTERVAL_HOUR:
+                //case SQL_C_INTERVAL_HOUR:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_HOUR;
+                break;
+                
+            case SQL_INTERVAL_MINUTE:
+                //case SQL_C_INTERVAL_MINUTE:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_MINUTE;
+                break;
+                
+            case SQL_INTERVAL_SECOND:
+                //case SQL_C_INTERVAL_SECOND:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_SECOND;
+                break;
+                
+            case SQL_INTERVAL_DAY_TO_HOUR:
+                //case SQL_C_INTERVAL_DAY_TOHOUR:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_DAY_TO_HOUR;
+                break;
+                
+            case SQL_INTERVAL_DAY_TO_MINUTE:
+                //case SQL_C_INTERVAL_DAY_TO_MINUTE:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_DAY_TO_MINUTE;
+                break;
+                
+            case SQL_INTERVAL_DAY_TO_SECOND:
+                //case SQL_C_INTERVAL_DAY_TO_SECOND:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_DAY_TO_SECOND;
+                break;
+                
+            case SQL_INTERVAL_HOUR_TO_MINUTE:
+                //case SQL_C_INTERVAL_HOUR_TO_MINUTE:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_HOUR_TO_MINUTE;
+                break;
+                
+            case SQL_INTERVAL_HOUR_TO_SECOND:
+                //case SQL_C_INTERVAL_HOUR_TO_SECOND:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_HOUR_TO_SECOND;
+                break;
+                
+            case SQL_INTERVAL_MINUTE_TO_SECOND:
+                //case SQL_C_INTERVAL_MINUTE_TO_SECOND:
+                verbose_type        = SQL_INTERVAL;
+                datetime_interval   = SQL_CODE_MINUTE_TO_SECOND;
+                break;
+                
+            default:
+            
+                // check if data type if valid
+                if ( _SQLCheckDataType ( concise_type ) != GOOD )
+                { return BAD; }
+                
+                // concise type does not relate to datetime or interval
+                // hence both concise and verbose type r equal
+                verbose_type        = concise_type;
+                datetime_interval   = 0;
+        }
+    }
+    
+    // check if verbose data type is being set
+    else if ( pFldID == SQL_DESC_TYPE ) {
+        // set the verbose type itself first
+        verbose_type = pFldValue;
+        
+        // based on verbose type & datetime interval code determine concise type
+        switch ( verbose_type ) {
+            case SQL_INTERVAL:
+                switch ( datetime_interval ) {
+                    case SQL_CODE_DATE:
+                        concise_type = SQL_TYPE_DATE;
+                        break;
+                        
+                    case SQL_CODE_TIME:
+                        concise_type = SQL_TYPE_TIME;
+                        break;
+                        
+                    case SQL_CODE_TIMESTAMP:
+                        concise_type = SQL_TYPE_TIMESTAMP;
+                        break;
+                        
+                    default:
+                        // interval should have been set
+                        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetDataType: Interval code not yet set for SQL_INTERVAL" ) );
+                        return BAD;
+                }
+                
+                break;
+                
+            case SQL_DATETIME:
+                switch ( datetime_interval ) {
+                    case SQL_CODE_MONTH:
+                        concise_type = SQL_INTERVAL_MONTH;
+                        break;
+                        
+                    case SQL_CODE_YEAR:
+                        concise_type = SQL_INTERVAL_YEAR;
+                        break;
+                        
+                    case SQL_CODE_YEAR_TO_MONTH:
+                        concise_type = SQL_INTERVAL_YEAR_TO_MONTH;
+                        break;
+                        
+                    case SQL_CODE_DAY:
+                        concise_type = SQL_INTERVAL_DAY;
+                        break;
+                        
+                    case SQL_CODE_HOUR:
+                        concise_type = SQL_INTERVAL_HOUR;
+                        break;
+                        
+                    case SQL_CODE_MINUTE:
+                        concise_type = SQL_INTERVAL_MINUTE;
+                        break;
+                        
+                    case SQL_CODE_SECOND:
+                        concise_type = SQL_INTERVAL_SECOND;
+                        break;
+                        
+                    case SQL_CODE_DAY_TO_HOUR:
+                        concise_type = SQL_INTERVAL_DAY_TO_HOUR;
+                        break;
+                        
+                    case SQL_CODE_DAY_TO_MINUTE:
+                        concise_type = SQL_INTERVAL_DAY_TO_MINUTE;
+                        break;
+                        
+                    case SQL_CODE_DAY_TO_SECOND:
+                        concise_type = SQL_INTERVAL_DAY_TO_SECOND;
+                        break;
+                        
+                    case SQL_CODE_HOUR_TO_MINUTE:
+                        concise_type = SQL_INTERVAL_HOUR_TO_MINUTE;
+                        break;
+                        
+                    case SQL_CODE_HOUR_TO_SECOND:
+                        concise_type = SQL_INTERVAL_HOUR_TO_SECOND;
+                        break;
+                        
+                    case SQL_CODE_MINUTE_TO_SECOND:
+                        concise_type = SQL_INTERVAL_MINUTE_TO_SECOND;
+                        break;
+                        
+                    default:
+                        // interval should have been set
+                        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetDataType: Interval code not yet set for SQL_DATETIME" ) );
+                        return BAD;
+                }
+                
+                break;
+                
+            default:
+            
+                // check if data type if valid
+                if ( _SQLCheckDataType ( verbose_type ) != GOOD )
+                { return BAD; }
+                
+                // verbose type does not relate to datetime or interval
+                // hence both concise and verbose type r equal
+                concise_type        = verbose_type;
+                datetime_interval   = 0;
+                break;
+        }
+    }
+    
+    else if ( pFldID == SQL_DESC_DATETIME_INTERVAL_CODE ) {
+        // check if date interval code is valid
+        if ( _SQLCheckIntervalCode ( pFldValue ) != GOOD )
+        { return BAD; }
+        
+        // set the datetime interval code, autonomously
+        datetime_interval = pFldValue;
+    }
+    
+    // unknown field to set
+    else {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetDataType: Unknown field type" ) );
+        return BAD;
+    }
+    
+    // pass back values to caller
+    if ( pVerboseDataType )         { *pVerboseDataType        = verbose_type; }
+    
+    if ( pConciseDataType )         { *pConciseDataType        = concise_type; }
+    
+    if ( pDateTimeIntervalCode )    { *pDateTimeIntervalCode   = datetime_interval; }
+    
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to get specific detail about a data type
+// -----------------------------------------------------------------------
+
+eGoodBad GetIRDDataTypeDefaults ( CStrPtr pDataType, Word* pSqlDataType, Word* pNativeDataType, Word* pPrecision,
+                                  Word* pScale, Long* pLength, Long* pRadix ) {
+    return BAD;
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_EXEC.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_EXEC.CPP b/odbc/Driver/KO_EXEC.CPP
new file mode 100644
index 0000000..6242c48
--- /dev/null
+++ b/odbc/Driver/KO_EXEC.CPP
@@ -0,0 +1,321 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_EXEC.CPP
+//
+// Purpose:     Contains function for executing queries.
+//              After a request is prepared by the caller
+//              control is passed to _SQLExecStmtFromReq.
+//              This function
+//              1. puts the request into the
+//              statement structure. Right now this involves
+//              putting the statement text to the structure
+//              but it can be extended. (PutReqToStmt)
+//              2. The actual request-response takes place
+//              on REST call
+//              3. The result is validated and again put
+//              inside the statement structure for proper
+//              access via IRD, resultdata and so on. (PutRespToStmt)
+//
+//
+//              Either a qeuery can be executed directly
+//              using SQLExecDirect or it can be executed
+//              after it is prepared using SQLPrepare. This
+//              is used in case mulitple queries r to be executed
+//              with just a parameter change and the server
+//              is capable of storing the query is a semi-processed
+//              form providing for speed. Our SQLPrepare is nothing
+//              but Execute only.
+//
+// Exported functions:
+//                       SQLPrepare
+//                       SQLExecute
+//                       SQLExecDirect
+//                       SQLCancel
+//                       SQLEndTran
+//                       SQLSetPos
+//                       SQLCloseCursor
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+#include "REST.h"
+
+
+// --------------------- local functions prototypes -----------------------
+static eGoodBad ProcessStmtForParams ( pODBCStmt pStmt, const wchar_t* pStmtText, Long pTextLength,
+                                       wchar_t*& s );
+
+
+// -----------------------------------------------------------------------
+// to convert a stmt to an SZ string plus include param values
+// -----------------------------------------------------------------------
+
+static eGoodBad ProcessStmtForParams ( pODBCStmt pStmt, const wchar_t* pStmtText, Long pTextLength, wchar_t* & s ) {
+    // note
+    // since the param feature has not yet been implemented
+    // this function just creates a zero-terminated version
+    // of the stmt string
+    Long t = 0;
+    
+    // calc stmt length
+    if ( pStmtText )
+    { t = ( pTextLength > 0 ) ? pTextLength : ( Long ) wcslen ( pStmtText ); }
+    
+    // allocate new space for stmt
+    s = new wchar_t[t + 1];
+    // make copy
+    memcpy ( s, pStmtText, t * sizeof ( wchar_t ) );
+    // SZ
+    s[t] = 0;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to finalize a response to stmt structure
+// -----------------------------------------------------------------------
+
+eGoodBad PutRespToStmt ( pODBCStmt pStmt, std::unique_ptr<SQLResponse> resp ) {
+    // check the response type
+    if ( true ) {
+        // TRANSFER  to stmt
+        pStmt->CurRowsetStartRow      = NULL;                           // start of current rowset
+        pStmt->CurRowsetStartRowPos   = 0;                              // absolute position
+        pStmt->CurRowsetEndRow        = NULL;                           // end of current rowset
+        pStmt->CurRowsetEndRowPos     = 0;                              // absolute position
+        pStmt->RowCount         =  resp->results.size();
+        pStmt->IRD.DescCount    = ( Word ) resp->columnMetas.size();
+        pStmt->IRD.RowDesc      = std::move ( resp );                               // IRD
+    }
+    
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to execute a statement given in form of rest query
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLExecStmtFromReq ( pODBCStmt pStmt, bool pPrepared ) {
+    ////// this part should not be required if already prepared
+    // release existing stmt contents
+    //SQLFreeStmt ( pStmt, SQL_CLOSE );
+    //////
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "================================================================" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "start exec the query: " ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, pStmt->Stmt ) );
+    std::unique_ptr<SQLResponse> p;
+    
+    try {
+        p = restQuery ( pStmt->Stmt, pStmt->Conn->Server, pStmt->Conn->ServerPort, pStmt->Conn->UserName, pStmt->Conn->Password,
+                        pStmt->Conn->Project );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The REST request succeed" ) );
+    }
+    
+    catch ( const exception& e ) {
+        std::stringstream ss;
+        ss << "The REST query request failed, the error message is: " << e.what();
+        std::string s = ss.str();
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, s.c_str() ) );
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLExecStmtFromReq", "01000", -1, ( char* ) s.c_str() );
+        return SQL_ERROR;
+    }
+    
+    // feed stmt structure with response, stmt will take charge of deleting it
+    if ( p == NULL ||  p->isException == true || PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) {
+        return SQL_ERROR;
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "Successfully done executing the query" ) );
+    return SQL_SUCCESS;
+}
+
+
+
+
+// -----------------------------------------------------------------------
+// to prepare a sql statement for executing
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLPrepare ( SQLHSTMT    pStmt,
+                             SQLCHAR*    pStmtText,
+                             SQLINTEGER  pTextLength ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPrepare called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLPrepare not implemented, use SQLPrepareW" ) );
+    return SQL_ERROR;
+}
+
+/*
+     Kylin uses rest request for query executing, SQLPrepare does not do anything meaningful
+*/
+RETCODE SQL_API SQLPrepareW ( SQLHSTMT    pStmt,
+                              SQLWCHAR*    pStmtText,
+                              SQLINTEGER  pTextLength ) {
+    wchar_t*      s;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPrepareW called on: %d", pStmt ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // precaution
+    if ( pStmtText == NULL || ( pTextLength <= 0 && pTextLength != SQL_NTS ) ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLPrepare - bad params" ) );
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLPrepare", "01000", -1, "SQLPrepare - bad params" );
+        return SQL_ERROR;
+    }
+    
+    // MANAGE STMT CONTENT
+    
+    // convert to full request, with zero termination ( as well as params - later )
+    if ( ProcessStmtForParams ( ( pODBCStmt ) pStmt, pStmtText, pTextLength, s ) == BAD )
+    { return SQL_ERROR; }
+    
+    // release existing stmt contents
+    SQLFreeStmt ( pStmt, SQL_CLOSE );
+    // replace with new stmt string
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The query being prepared is :" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, s ) );
+    ( ( pODBCStmt ) pStmt )->Stmt = s;
+    ( ( pODBCStmt ) pStmt )->StmtLen = pTextLength;
+    // MARK as prepared
+    // set the flag
+    ( ( pODBCStmt ) pStmt )->Prepared = 1;
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to execute a prepared statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLExecute ( HSTMT pStmt ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLExecute called on: %d", pStmt ) );
+    Word        x;
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // check if prepared
+    if ( ( ( pODBCStmt ) pStmt )->Prepared != 1 ) {
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLExecute", "01000", -1, "No prepared stmt" );
+        return SQL_ERROR;
+    }
+    
+    // excute the request
+    x  = _SQLExecStmtFromReq ( ( pODBCStmt ) pStmt, 1 );
+    return x;
+}
+
+// -----------------------------------------------------------------------
+// to execute a sql statement directly
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLExecDirect ( SQLHSTMT    pStmt,
+                                SQLCHAR*    pStmtText,
+                                SQLINTEGER  pTextLength ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLExecDirect called, strlen is %d, pTextLength is %d",
+                              strlen ( ( char* ) pStmtText ), pTextLength ) );
+    unique_ptr<wchar_t[]> pStmtTextW ( char2wchar ( ( char* ) pStmtText ) );
+    return SQLExecDirectW ( pStmt, ( SQLWCHAR* ) pStmtTextW.get(), pTextLength );
+}
+
+RETCODE SQL_API SQLExecDirectW ( SQLHSTMT    pStmt,
+                                 SQLWCHAR*    pStmtText,
+                                 SQLINTEGER  pTextLength ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLExecDirectW called on: %d", pStmt ) );
+    wchar_t*      s;
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // precaution
+    if ( pStmtText == NULL || ( pTextLength <= 0 && pTextLength != SQL_NTS ) ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExecDirect - bad params" ) );
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLExecDirectW", "01000", -1, "bad params" );
+        return SQL_ERROR;
+    }
+    
+    // convert to full request, with zero termination ( as well as params - later )
+    if ( ProcessStmtForParams ( ( pODBCStmt ) pStmt, ( wchar_t* ) pStmtText, pTextLength, s ) == BAD )
+    { return SQL_ERROR; }
+    
+    // release existing stmt contents
+    SQLFreeStmt ( pStmt, SQL_CLOSE );
+    // replace with new stmt string
+    ( ( pODBCStmt ) pStmt )->Stmt = s;
+    ( ( pODBCStmt ) pStmt )->StmtLen = pTextLength;
+    // mark it as prepared
+    ( ( pODBCStmt ) pStmt )->Prepared = 1;
+    // execute
+    RETCODE code = SQLExecute ( pStmt );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLExecDirectW exited on with %d", code ) );
+    return code;
+}
+
+// ----------------------------------------------------------------------
+// to cancel any asynchronous processing, or pending data request
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API SQLCancel ( HSTMT pStmt ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "SQLCancel called" ) );
+    //if ( pStmt )
+    //    // clear all previous diag info
+    //{ _SQLFreeDiag ( & ( ( ( pODBCStmt ) pStmt )->Diag ) ); }
+    return SQL_SUCCESS;
+}
+
+
+// ----------------------------------------------------------------------
+// to commit/rollback all stmts on connection or connections on env
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API SQLEndTran ( SQLSMALLINT     pHandleType,
+                             SQLHANDLE       pHandle,
+                             SQLSMALLINT     pCompletionType ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLEndTran called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLEndTran not implemented" ) );
+    return SQL_ERROR;
+}
+
+// ----------------------------------------------------------------------
+// to set cursor position in a rowset, allows an appl to refresh/update/delete data in rowset
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API SQLSetPos ( SQLHSTMT        pStmt,
+                            SQLUSMALLINT    pRowNumber,
+                            SQLUSMALLINT    pOperation,
+                            SQLUSMALLINT    pLockType ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetPos called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetPos not implemented" ) );
+    return SQL_ERROR;
+}
+
+// ----------------------------------------------------------------------
+// to close a cursor that has been opened on a statement and discards pending results.
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API SQLCloseCursor ( SQLHSTMT pStmt ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLCloseCursor called" ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // check if there is some result
+    if (
+        ( ( pODBCStmt ) pStmt )->IRD.RowDesc != NULL ) {
+        // free the results
+        return SQLFreeStmt ( pStmt, SQL_CLOSE );
+    }
+    
+    else {
+        // error condition
+        _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLCloseCursor", "24000", -1, "Invalid cursor state" );
+        return SQL_ERROR;
+    }
+}
+
+// ----------------------------------------------------------------------
+// to perform bulk insertions & bulk bookmark operations, like update, delete & fetch by bookmark.
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API SQLBulkOperations ( SQLHSTMT        pStmt,
+                                    SQLUSMALLINT    pOperation ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBulkOperations called\n" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLBulkOperations not implemented" ) );
+    return SQL_ERROR;
+}


[14/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
add odbc driver to maven repository


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

Branch: refs/heads/0.8
Commit: d1dcfd155c480e31a5a29af165c8a5e1ae87f140
Parents: 480453e
Author: honma <ho...@ebay.com>
Authored: Wed Jul 15 17:42:00 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Wed Jul 15 17:42:15 2015 +0800

----------------------------------------------------------------------
 odbc/.gitignore                                 |   36 +
 odbc/Common/Common.vcxproj                      |  205 +
 odbc/Common/Common.vcxproj.filters              |   75 +
 odbc/Common/Common.vcxproj.user                 |    4 +
 odbc/Common/Dump.cpp                            |   65 +
 odbc/Common/Dump.h                              |    3 +
 odbc/Common/Gzip.cpp                            |   68 +
 odbc/Common/Gzip.h                              |    4 +
 odbc/Common/JDBCODBC.cpp                        |  131 +
 odbc/Common/JDBCODBC.h                          |  443 ++
 odbc/Common/JsonConverter.cpp                   |  154 +
 odbc/Common/JsonConverter.h                     |   13 +
 odbc/Common/MsgTypes.h                          |  415 ++
 odbc/Common/QueryCache.cpp                      |   69 +
 odbc/Common/QueryCache.h                        |    5 +
 odbc/Common/REST.cpp                            |  363 ++
 odbc/Common/REST.h                              |   16 +
 odbc/Common/ReadMe.txt                          |   29 +
 odbc/Common/StringUtils.cpp                     |  165 +
 odbc/Common/StringUtils.h                       |   25 +
 odbc/Common/Win32/Release/.gitignore            |    1 +
 odbc/Common/base64.cpp                          |   97 +
 odbc/Common/base64.h                            |   10 +
 odbc/Common/x64/Release/.gitignore              |    1 +
 odbc/Driver/.gitignore                          |    2 +
 odbc/Driver/GODBC.RC                            |  177 +
 odbc/Driver/KO_ALLOC.CPP                        |  608 ++
 odbc/Driver/KO_ATTR.CPP                         |  897 +++
 odbc/Driver/KO_CONN.CPP                         | 1010 +++
 odbc/Driver/KO_CTLG.CPP                         |  341 ++
 odbc/Driver/KO_Config.cpp                       |  677 +++
 odbc/Driver/KO_DESC.CPP                         | 2778 +++++++++
 odbc/Driver/KO_DIAG.CPP                         |  934 +++
 odbc/Driver/KO_DTYPE.CPP                        |  361 ++
 odbc/Driver/KO_EXEC.CPP                         |  321 +
 odbc/Driver/KO_FETCH.CPP                        | 1213 ++++
 odbc/Driver/KO_INFO.CPP                         | 1152 ++++
 odbc/Driver/KO_PARAM.CPP                        |   85 +
 odbc/Driver/KO_UTILS.CPP                        |  566 ++
 odbc/Driver/KylinODBC.CPP                       |  352 ++
 odbc/Driver/KylinODBC.H                         |  644 ++
 odbc/Driver/TypeConvertion.h                    |  539 ++
 .../Win32/Release/Intermediate/.gitignore       |    2 +
 odbc/Driver/driver.DEF                          |   85 +
 odbc/Driver/driver.dsp                          |  247 +
 odbc/Driver/driver.vcxproj                      |  374 ++
 odbc/Driver/driver.vcxproj.filters              |   85 +
 odbc/Driver/driver.vcxproj.user                 |    4 +
 odbc/Driver/resource.h                          |   32 +
 odbc/Driver/stdafx.cpp                          |    1 +
 odbc/Driver/stdafx.h                            |    3 +
 odbc/Driver/version.props                       |   14 +
 odbc/Driver/x64/Release/Intermediate/.gitignore |    2 +
 odbc/Installer(64bit)/Installer(64bit).isl      | 5736 ++++++++++++++++++
 odbc/Installer(64bit)/Installer(64bit).isproj   |   37 +
 .../Installer(64bit)/Express/Interm/.gitignore  |    1 +
 .../SingleImage/DiskImages/DISK1/.gitignore     |    1 +
 .../Express/SingleImage/LogFiles/.gitignore     |    1 +
 .../Express/SingleImage/Reports/.gitignore      |    1 +
 odbc/Installer/Installer.isl                    | 5716 +++++++++++++++++
 odbc/Installer/Installer.isproj                 |   37 +
 .../Installer/Express/Interm/.gitignore         |    1 +
 .../SingleImage/DiskImages/DISK1/.gitignore     |    1 +
 .../Express/SingleImage/LogFiles/.gitignore     |    1 +
 .../Express/SingleImage/Reports/.gitignore      |    1 +
 odbc/KylinODBC.sln                              |  296 +
 odbc/LICENSE                                    |  202 +
 odbc/README.md                                  |   61 +
 odbc/ReadMe.txt                                 |   53 +
 odbc/TestDLL/ColorPrint.cpp                     |   44 +
 odbc/TestDLL/ColorPrint.h                       |    5 +
 odbc/TestDLL/CompareQueryTests.cpp              |  530 ++
 odbc/TestDLL/QueryFlowTest.cpp                  |   32 +
 odbc/TestDLL/Report.cpp                         |    9 +
 odbc/TestDLL/RestAPITest.cpp                    |   20 +
 odbc/TestDLL/SimpleQueryTest.cpp                |   30 +
 odbc/TestDLL/Source.cpp                         |   13 +
 odbc/TestDLL/TestDLL.vcxproj                    |  107 +
 odbc/TestDLL/TestDLL.vcxproj.filters            |   48 +
 odbc/TestDLL/TestDLL.vcxproj.user               |    7 +
 odbc/TestDLL/Tests.h                            |   29 +
 odbc/TestDLL/testqueries.txt                    |   82 +
 odbc/ThirdPartyLibraries.txt                    |    9 +
 odbc/doc/reference/0205agarwal.zip              |  Bin 0 -> 858699 bytes
 odbc/doc/reference/ODBC Driver Development.docx |  Bin 0 -> 238372 bytes
 ...61\345\212\250\347\250\213\345\272\217.docx" |  Bin 0 -> 681289 bytes
 odbc/ipch/driver-646534d9/.gitignore            |    1 +
 87 files changed, 29015 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/.gitignore b/odbc/.gitignore
new file mode 100644
index 0000000..bc31b54
--- /dev/null
+++ b/odbc/.gitignore
@@ -0,0 +1,36 @@
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.out
+*.app
+
+*.opensdf
+*.sdf
+*.log
+*.tlog
+*.pdb
+*.suo
+
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Common.vcxproj
----------------------------------------------------------------------
diff --git a/odbc/Common/Common.vcxproj b/odbc/Common/Common.vcxproj
new file mode 100644
index 0000000..fe2f63b
--- /dev/null
+++ b/odbc/Common/Common.vcxproj
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{6EE1C577-1826-4EA2-86AC-FE8047D396A9}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>Common</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Win32\Release;$(LibraryPath)</LibraryPath>
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Release64;$(LibraryPath)</LibraryPath>
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <IncludePath>$(CPPREST_HOME)\Release\include;C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Win32\Debug;C:\Program Files %28x86%29\Visual Leak Detector\lib\Win32;$(LibraryPath)</LibraryPath>
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <IncludePath>$(CPPREST_HOME)\Release\include;$(IncludePath)</IncludePath>
+    <LibraryPath>$(CPPREST_HOME)\Binaries\Debug64;$(LibraryPath)</LibraryPath>
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;ASMV;ASMINF;ZLIB_WINAPI;WIN32;_DEBUG;_LIB;_NO_ASYNCRTIMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <AdditionalIncludeDirectories>$(ZLIB_HOME);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <Lib>
+      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Lib>
+    <Lib>
+      <AdditionalLibraryDirectories>$(ZLIB_HOME)\contrib\vstudio\vc11\x86\ZlibDllDebug;$(ZLIB_HOME)\contrib\vstudio\vc11\x86\ZlibStatDebug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;ASMV;ASMINF;ZLIB_WINAPI;WIN32;NDEBUG;_DEBUG;_LIB;_NO_ASYNCRTIMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <AdditionalIncludeDirectories>$(ZLIB_HOME);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <Lib>
+      <AdditionalLibraryDirectories>$(ZLIB_HOME)\contrib\vstudio\vc11\x64\ZlibStatDebug;$(ZLIB_HOME)\contrib\vstudio\vc11\x64\ZlibDllDebug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;ASMV;ASMINF;ZLIB_WINAPI;WIN32;NDEBUG;_LIB;_NO_ASYNCRTIMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <AdditionalIncludeDirectories>$(ZLIB_HOME);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+    <Lib>
+      <AdditionalLibraryDirectories>$(ZLIB_HOME)\contrib\vstudio\vc11\x86\ZlibStatRelease;$(ZLIB_HOME)\contrib\vstudio\vc11\x86\ZlibDllRelease;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;ASMV;ASMINF;ZLIB_WINAPI;WIN32;NDEBUG;_LIB;_NO_ASYNCRTIMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <AdditionalIncludeDirectories>$(ZLIB_HOME);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WholeProgramOptimization>false</WholeProgramOptimization>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+    <Lib>
+      <AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>$(ZLIB_HOME)\contrib\vstudio\vc11\x64\ZlibStatRelease;$(ZLIB_HOME)\contrib\vstudio\vc11\x64\ZlibDllRelease;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Lib>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Base64.h" />
+    <ClInclude Include="Dump.h" />
+    <ClInclude Include="Gzip.h" />
+    <ClInclude Include="JDBCODBC.h" />
+    <ClInclude Include="JsonConverter.h" />
+    <ClInclude Include="MsgTypes.h" />
+    <ClInclude Include="QueryCache.h" />
+    <ClInclude Include="REST.h" />
+    <ClInclude Include="StringUtils.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Base64.cpp" />
+    <ClCompile Include="Dump.cpp" />
+    <ClCompile Include="Gzip.cpp" />
+    <ClCompile Include="JDBCODBC.cpp" />
+    <ClCompile Include="JsonConverter.cpp" />
+    <ClCompile Include="QueryCache.cpp" />
+    <ClCompile Include="REST.cpp" />
+    <ClCompile Include="StringUtils.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Common.vcxproj.filters
----------------------------------------------------------------------
diff --git a/odbc/Common/Common.vcxproj.filters b/odbc/Common/Common.vcxproj.filters
new file mode 100644
index 0000000..790f9df
--- /dev/null
+++ b/odbc/Common/Common.vcxproj.filters
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="JDBCODBC.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="MsgTypes.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="REST.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="StringUtils.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Dump.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Base64.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="QueryCache.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Gzip.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="JsonConverter.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="JDBCODBC.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="REST.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="StringUtils.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Dump.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Base64.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="QueryCache.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Gzip.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="JsonConverter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Common.vcxproj.user
----------------------------------------------------------------------
diff --git a/odbc/Common/Common.vcxproj.user b/odbc/Common/Common.vcxproj.user
new file mode 100644
index 0000000..a375ae3
--- /dev/null
+++ b/odbc/Common/Common.vcxproj.user
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Dump.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/Dump.cpp b/odbc/Common/Dump.cpp
new file mode 100644
index 0000000..e085861
--- /dev/null
+++ b/odbc/Common/Dump.cpp
@@ -0,0 +1,65 @@
+#include    <assert.h>
+#include    <stdio.h>
+#include    <ctype.h>
+#include    <string.h>
+
+void displayHexRecord ( char* data, int count, int record_length ) {
+    int i;
+    
+    for ( i = 0; i < count; i++ ) { printf ( "%02x ", data[i] & 0xff ); }
+    
+    for ( ; i < record_length; i++ ) { printf ( "	" ); }
+    
+    printf ( ": " );
+    
+    for ( i = 0; i < count; i++ ) {
+        if ( isgraph ( data[i] ) ) { putchar ( data[i] ); }
+        
+        else          { putchar ( '.' ); }
+    }
+    
+    putchar ( '\n' );
+}
+
+void bufferHexRecord ( char* data, int count, int record_length, char* buffer ) {
+    int i;
+    
+    for ( i = 0; i < count; i++ ) {
+        sprintf ( buffer + strlen ( buffer ), "%02x ", data[i] & 0xff );
+    }
+    
+    for ( ; i < record_length; i++ )
+    { sprintf ( buffer + strlen ( buffer ), " " ); }
+    
+    sprintf ( buffer + strlen ( buffer ), ": " );
+    
+    for ( i = 0; i < count; i++ ) {
+        if ( isgraph ( data[i] ) ) {
+            buffer[strlen ( buffer ) + 1] = '\0';
+            buffer[strlen ( buffer )] = data[i];
+        }
+        
+        else {
+            buffer[strlen ( buffer ) + 1] = '\0';
+            buffer[strlen ( buffer )] = '.';
+        }
+    }
+    
+    buffer[strlen ( buffer ) + 1] = '\0';
+    buffer[strlen ( buffer )] = '\n';
+}
+
+//dump 16 * lines bytes, readable test stored in buffer, reserve 100 bytes in buffer for one line
+void hexDump ( char* data, int lines, char* buffer, bool forward ) {
+    if ( !forward ) {
+        data -= lines * 16;
+    }
+    
+    buffer[0] = '\0';
+    
+    for ( int i = 0 ; i < lines ; ++i ) {
+        sprintf ( buffer + strlen ( buffer ), "%10d  ", data );
+        bufferHexRecord ( data, 16, 16, buffer );
+        data += 16;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Dump.h
----------------------------------------------------------------------
diff --git a/odbc/Common/Dump.h b/odbc/Common/Dump.h
new file mode 100644
index 0000000..36f7430
--- /dev/null
+++ b/odbc/Common/Dump.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void hexDump ( char* data, int lines, char* buffer, bool forward );
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Gzip.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/Gzip.cpp b/odbc/Common/Gzip.cpp
new file mode 100644
index 0000000..995540a
--- /dev/null
+++ b/odbc/Common/Gzip.cpp
@@ -0,0 +1,68 @@
+#include <cstdio>
+#include <string>
+#include <cstring>
+#include <cstdlib>
+#include "zlib.h"
+#include "zconf.h"
+
+using namespace std;
+
+bool gzipInflate ( const std::string& compressedBytes, std::string& uncompressedBytes ) {
+    if ( compressedBytes.size() == 0 ) {
+        uncompressedBytes = compressedBytes ;
+        return true ;
+    }
+    
+    uncompressedBytes.clear() ;
+    unsigned full_length = compressedBytes.size() ;
+    unsigned half_length = compressedBytes.size() / 2;
+    unsigned uncompLength = full_length ;
+    char* uncomp = ( char* ) calloc ( sizeof ( char ), uncompLength );
+    z_stream strm;
+    strm.next_in = ( Bytef* ) compressedBytes.c_str();
+    strm.avail_in = compressedBytes.size() ;
+    strm.total_out = 0;
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    bool done = false ;
+    
+    if ( inflateInit2 ( &strm, ( 16 + MAX_WBITS ) ) != Z_OK ) {
+        free ( uncomp );
+        return false;
+    }
+    
+    while ( !done ) {
+        // If our output buffer is too small
+        if ( strm.total_out >= uncompLength ) {
+            // Increase size of output buffer
+            char* uncomp2 = ( char* ) calloc ( sizeof ( char ), uncompLength + half_length );
+            memcpy ( uncomp2, uncomp, uncompLength );
+            uncompLength += half_length ;
+            free ( uncomp );
+            uncomp = uncomp2 ;
+        }
+        
+        strm.next_out = ( Bytef* ) ( uncomp + strm.total_out );
+        strm.avail_out = uncompLength - strm.total_out;
+        // Inflate another chunk.
+        int err = inflate ( &strm, Z_SYNC_FLUSH );
+        
+        if ( err == Z_STREAM_END ) { done = true; }
+        
+        else if ( err != Z_OK )  {
+            break;
+        }
+    }
+    
+    if ( inflateEnd ( &strm ) != Z_OK ) {
+        free ( uncomp );
+        return false;
+    }
+    
+    for ( size_t i = 0; i < strm.total_out; ++i ) {
+        uncompressedBytes += uncomp[ i ];
+    }
+    
+    free ( uncomp );
+    return true ;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Gzip.h
----------------------------------------------------------------------
diff --git a/odbc/Common/Gzip.h b/odbc/Common/Gzip.h
new file mode 100644
index 0000000..2fb4b88
--- /dev/null
+++ b/odbc/Common/Gzip.h
@@ -0,0 +1,4 @@
+#pragma once
+#include <string>
+
+bool gzipInflate ( const std::string& compressedBytes, std::string& uncompressedBytes );
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/JDBCODBC.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/JDBCODBC.cpp b/odbc/Common/JDBCODBC.cpp
new file mode 100644
index 0000000..39e8278
--- /dev/null
+++ b/odbc/Common/JDBCODBC.cpp
@@ -0,0 +1,131 @@
+#include "JDBCODBC.h"
+
+ODBCTypes JDBC2ODBC ( int jtype ) {
+    JDBCTypes temp = ( JDBCTypes ) jtype;
+    
+    switch ( temp ) {
+        case JDBC_BOOLEAN:
+            return ODBCTypes::ODBC_Bit ;
+            break;
+            
+        case JDBC_BIT:
+            return ODBCTypes::ODBC_Bit;
+            break;
+            
+        case JDBC_TINYINT:
+            return ODBCTypes::ODBC_TinyInt;
+            break;
+            
+        case JDBC_SMALLINT:
+            return ODBCTypes::ODBC_SmallInt;
+            break;
+            
+        case JDBC_INTEGER:
+            return ODBCTypes::ODBC_Integer;
+            break;
+            
+        case JDBC_BIGINT:
+            return ODBCTypes::ODBC_BigInt;
+            break;
+            
+        case JDBC_FLOAT:
+            return ODBCTypes::ODBC_Float;
+            break;
+            
+        case JDBC_REAL:
+            return ODBCTypes::ODBC_Real;
+            break;
+            
+        case JDBC_DOUBLE:
+            return ODBCTypes::ODBC_Double;
+            break;
+            
+        case JDBC_NUMERIC:
+            return ODBCTypes::ODBC_Numeric;
+            break;
+            
+        case JDBC_DECIMAL:
+            return ODBCTypes::ODBC_Decimal;
+            break;
+            
+        case JDBC_CHAR:
+            //return ODBCTypes::ODBC_Char;
+            return ODBCTypes::ODBC_WChar;//it's a unicode dirver
+            break;
+            
+        case JDBC_VARCHAR:
+            //return ODBCTypes::ODBC_VarChar;
+            return ODBCTypes::ODBC_WChar;//it's a unicode dirver
+            break;
+            
+        case 2000://"ANY" type in KYLIN
+            return ODBCTypes::ODBC_WChar;//it's a unicode dirver
+            break;
+            
+        case JDBC_LONGVARCHAR:
+            return ODBCTypes::ODBC_LongVarChar;
+            break;
+            
+        case JDBC_DATE:
+            return ODBCTypes::ODBC_Type_Date;
+            break;
+            
+        case JDBC_TIME:
+            return ODBCTypes::ODBC_Type_Time;
+            break;
+            
+        case JDBC_TIMESTAMP:
+            return ODBCTypes::ODBC_Type_Timestamp;
+            break;
+            
+        case JDBC_BINARY:
+            return ODBCTypes::ODBC_Binary;
+            break;
+            
+        case JDBC_VARBINARY:
+            return ODBCTypes::ODBC_VarBinary;
+            break;
+            
+        case JDBC_LONGVARBINARY:
+            return ODBCTypes::ODBC_LongVarBinary;
+            break;
+            
+        /*  case NULL:
+            break;
+            case OTHER:
+            break;
+            case JAVA_OBJECT:
+            break;
+            case DISTINCT:
+            break;
+            case STRUCT:
+            break;
+            case ARRAY:
+            break;
+            case BLOB:
+            break;
+            case CLOB:
+            break;
+            case REF:
+            break;
+            case DATALINK:
+            break;
+            case BOOLEAN:
+            break;
+            case ROWID:
+            break;
+            case NCHAR:
+            break;
+            case NVARCHAR:
+            break;
+            case LONGNVARCHAR:
+            break;
+            case NCLOB:
+            break;
+            case SQLXML:
+            break;*/
+        default:
+            throw;
+            break;
+    }
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/JDBCODBC.h
----------------------------------------------------------------------
diff --git a/odbc/Common/JDBCODBC.h b/odbc/Common/JDBCODBC.h
new file mode 100644
index 0000000..71849f5
--- /dev/null
+++ b/odbc/Common/JDBCODBC.h
@@ -0,0 +1,443 @@
+#pragma once
+
+
+
+
+enum JDBCTypes {
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>BIT</code>.
+    */
+    JDBC_BIT = -7,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>TINYINT</code>.
+    */
+    JDBC_TINYINT = -6,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>SMALLINT</code>.
+    */
+    JDBC_SMALLINT = 5,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>INTEGER</code>.
+    */
+    JDBC_INTEGER = 4,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>BIGINT</code>.
+    */
+    JDBC_BIGINT = -5,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>FLOAT</code>.
+    */
+    JDBC_FLOAT = 6,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>REAL</code>.
+    */
+    JDBC_REAL = 7,
+    
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>DOUBLE</code>.
+    */
+    JDBC_DOUBLE = 8,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>NUMERIC</code>.
+    */
+    JDBC_NUMERIC = 2,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>DECIMAL</code>.
+    */
+    JDBC_DECIMAL = 3,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>CHAR</code>.
+    */
+    JDBC_CHAR = 1,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>VARCHAR</code>.
+    */
+    JDBC_VARCHAR = 12,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>LONGVARCHAR</code>.
+    */
+    JDBC_LONGVARCHAR = -1,
+    
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>DATE</code>.
+    */
+    JDBC_DATE = 91,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>TIME</code>.
+    */
+    JDBC_TIME = 92,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>TIMESTAMP</code>.
+    */
+    JDBC_TIMESTAMP = 93,
+    
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>BINARY</code>.
+    */
+    JDBC_BINARY = -2,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>VARBINARY</code>.
+    */
+    JDBC_VARBINARY = -3,
+    
+    /**
+        <P>The constant in the Java programming language, sometimes referred
+        to as a type code, that identifies the generic SQL type
+        <code>LONGVARBINARY</code>.
+    */
+    JDBC_LONGVARBINARY = -4,
+    
+    /**
+        <P>The constant in the Java programming language
+        that identifies the generic SQL value
+        <code>NULL</code>.
+    */
+    //NULL = 0,
+    
+    /**
+        The constant in the Java programming language that indicates
+        that the SQL type is database-specific and
+        gets mapped to a Java object that can be accessed via
+        the methods <code>getObject</code> and <code>setObject</code>.
+    */
+    JDBC_OTHER = 1111,
+    
+    
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>JAVA_OBJECT</code>.
+        @since 1.2
+    */
+    JDBC_JAVA_OBJECT = 2000,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>DISTINCT</code>.
+        @since 1.2
+    */
+    JDBC_DISTINCT = 2001,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>STRUCT</code>.
+        @since 1.2
+    */
+    JDBC_STRUCT = 2002,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>ARRAY</code>.
+        @since 1.2
+    */
+    JDBC_ARRAY = 2003,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>BLOB</code>.
+        @since 1.2
+    */
+    JDBC_BLOB = 2004,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>CLOB</code>.
+        @since 1.2
+    */
+    JDBC_CLOB = 2005,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type
+        <code>REF</code>.
+        @since 1.2
+    */
+    JDBC_REF = 2006,
+    
+    /**
+        The constant in the Java programming language, somtimes referred to
+        as a type code, that identifies the generic SQL type <code>DATALINK</code>.
+    
+        @since 1.4
+    */
+    JDBC_DATALINK = 70,
+    
+    /**
+        The constant in the Java programming language, somtimes referred to
+        as a type code, that identifies the generic SQL type <code>BOOLEAN</code>.
+    
+        @since 1.4
+    */
+    JDBC_BOOLEAN = 16,
+    
+    //------------------------- JDBC 4.0 -----------------------------------
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type <code>ROWID</code>
+    
+        @since 1.6
+    
+    */
+    JDBC_ROWID = -8,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type <code>NCHAR</code>
+    
+        @since 1.6
+    */
+    JDBC_NCHAR = -15,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type <code>NVARCHAR</code>.
+    
+        @since 1.6
+    */
+    JDBC_NVARCHAR = -9,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type <code>LONGNVARCHAR</code>.
+    
+        @since 1.6
+    */
+    JDBC_LONGNVARCHAR = -16,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type <code>NCLOB</code>.
+    
+        @since 1.6
+    */
+    JDBC_NCLOB = 2011,
+    
+    /**
+        The constant in the Java programming language, sometimes referred to
+        as a type code, that identifies the generic SQL type <code>XML</code>.
+    
+        @since 1.6
+    */
+    JDBC_SQLXML = 2009
+};
+
+enum ODBCTypes {
+    // Summary:
+    //     Maps to SQL_GUID.
+    ODBC_Guid = -11,
+    //
+    // Summary:
+    //     Maps to SQL_WLONGVARCHAR.  Native Type: System.String
+    ODBC_WLongVarChar = -10,
+    //
+    // Summary:
+    //     Maps to SQL_WVARCHAR.  Native Type: System.String
+    ODBC_WVarChar = -9,
+    //
+    // Summary:
+    //     Maps to SQL_WCHAR.  Native Type: System.String
+    ODBC_WChar = -8,
+    //
+    // Summary:
+    //     Maps to SQL_BIT.  Native Type: System.Boolean
+    ODBC_Bit = -7,
+    //
+    // Summary:
+    //     Maps to SQL_TINYINT.  Native Type: System.SByte
+    ODBC_TinyInt = -6,
+    //
+    // Summary:
+    //     Maps to SQL_BIGINT.  Native Type: System.Int64
+    ODBC_BigInt = -5,
+    //
+    // Summary:
+    //     Maps to SQL_LONGVARBINARY.  Native Type: array[System.Byte]
+    ODBC_LongVarBinary = -4,
+    //
+    // Summary:
+    //     Maps to SQL_VARBINARY.  Native Type: array[System.Byte]
+    ODBC_VarBinary = -3,
+    //
+    // Summary:
+    //     Maps to SQL_BINARY.  Native Type: array[System.Byte]
+    ODBC_Binary = -2,
+    //
+    // Summary:
+    //     Maps to SQL_LONGVARCHAR.  Native Type: System.String
+    ODBC_LongVarChar = -1,
+    //
+    // Summary:
+    //     Maps to SQL_CHAR.  Native Type: System.String
+    ODBC_Char = 1,
+    //
+    // Summary:
+    //     Maps to SQL_NUMERIC.  Native Type: System.Decimal
+    ODBC_Numeric = 2,
+    //
+    // Summary:
+    //     Maps to SQL_DECIMAL.  Native Type: System.Decimal
+    ODBC_Decimal = 3,
+    //
+    // Summary:
+    //     Maps to SQL_INTEGER.  Native Type: System.Int32
+    ODBC_Integer = 4,
+    //
+    // Summary:
+    //     Maps to SQL_SMALLINT.  Native Type: System.Int16
+    ODBC_SmallInt = 5,
+    //
+    // Summary:
+    //     Maps to SQL_FLOAT.  Native Type: System.Double
+    ODBC_Float = 6,
+    //
+    // Summary:
+    //     Maps to SQL_REAL.  Native Type: System.Single
+    ODBC_Real = 7,
+    //
+    // Summary:
+    //     Maps to SQL_DOUBLE.  Native Type: System.Double
+    ODBC_Double = 8,
+    //
+    // Summary:
+    //     Maps to SQL_DATETIME. This type should NOT be used with CreateTypeMetadata,
+    //     as it is not a valid type identifier.
+    ODBC_DateTime = 9,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL. Not a valid type identifier.
+    ODBC_Interval = 10,
+    //
+    // Summary:
+    //     Maps to SQL_VARCHAR.  Native Type: System.String
+    ODBC_VarChar = 12,
+    //
+    // Summary:
+    //     Does not map to an ODBC SQL type.  Native Type: System.DateTimeOffset
+    ODBC_DateTimeOffset = 36,
+    //
+    // Summary:
+    //     Maps to SQL_TYPE_DATE.  Native Type: System.DateTime
+    ODBC_Type_Date = 91,
+    //
+    // Summary:
+    //     Maps to SQL_TYPE_TIME.  Native Type: System.DateTime
+    ODBC_Type_Time = 92,
+    //
+    // Summary:
+    //     Maps to SQL_TYPE_TIMESTAMP.  Native Type: System.DateTime
+    ODBC_Type_Timestamp = 93,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_YEAR.  Native Type: Simba.DotNetDSI.DataEngine.DSIMonthSpan
+    ODBC_Interval_Year = 101,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_MONTH.  Native Type: Simba.DotNetDSI.DataEngine.DSIMonthSpan
+    ODBC_Interval_Month = 102,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_DAY.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Day = 103,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_HOUR.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Hour = 104,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_MINUTE.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Minute = 105,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Second = 106,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_YEAR_TO_MONTH.  Native Type: Simba.DotNetDSI.DataEngine.DSIMonthSpan
+    ODBC_Interval_Year_To_Month = 107,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_DAY_TO_HOUR.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Day_To_Hour = 108,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_DAY_TO_MINUTE.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Day_To_Minute = 109,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_DAY_TO_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Day_To_Second = 110,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_HOUR_TO_MINUTE.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Hour_To_Minute = 111,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_HOUR_TO_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Hour_To_Second = 112,
+    //
+    // Summary:
+    //     Maps to SQL_INTERVAL_MINUTE_TO_SECOND.  Native Type: Simba.DotNetDSI.DataEngine.DSITimeSpan
+    ODBC_Interval_Minute_To_Second = 113,
+};
+
+ODBCTypes JDBC2ODBC ( int jtype );

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/JsonConverter.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/JsonConverter.cpp b/odbc/Common/JsonConverter.cpp
new file mode 100644
index 0000000..adc639a
--- /dev/null
+++ b/odbc/Common/JsonConverter.cpp
@@ -0,0 +1,154 @@
+#include "JsonConverter.h"
+
+#define ASSIGN_IF_NOT_NULL(x,y,z)  if(!y.is_null())x=y.z
+#define x_ASSIGN_IF_NOT_NULL(x,y,z)  if(!y.is_null())x=wstring2string(y.z)
+
+
+TableMeta* TableMetaFromJSON ( web::json::value & object ) {
+    TableMeta* result = new TableMeta();
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_CAT, object[U ( "table_CAT" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_SCHEM , object[U ( "table_SCHEM" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_NAME , object[U ( "table_NAME" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_TYPE , object[U ( "table_TYPE" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->REMARKS , object[U ( "remarks" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TYPE_CAT , object[U ( "type_CAT" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TYPE_SCHEM , object[U ( "type_SCHEM" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TYPE_NAME , object[U ( "type_NAME" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->SELF_REFERENCING_COL_NAME , object[U ( "self_REFERENCING_COL_NAME" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->REF_GENERATION , object[U ( "ref_GENERATION" )], as_string() );
+    return result;
+}
+
+ColumnMeta* ColumnMetaFromJSON ( web::json::value & object ) {
+    ColumnMeta* result = new ColumnMeta();
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_CAT , object[U ( "table_CAT" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_SCHEM , object[U ( "table_SCHEM" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->TABLE_NAME , object[U ( "table_NAME" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->COLUMN_NAME , object[U ( "column_NAME" )], as_string() );
+    //ASSIGN_IF_NOT_NULL(result->DATA_TYPE ,object[U("data_TYPE")], as_integer());
+    x_ASSIGN_IF_NOT_NULL ( result->TYPE_NAME , object[U ( "type_NAME" )], as_string() );
+    ASSIGN_IF_NOT_NULL ( result->COLUMN_SIZE , object[U ( "column_SIZE" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->BUFFER_LENGTH , object[U ( "buffer_LENGTH" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->DECIMAL_DIGITS , object[U ( "decimal_DIGITS" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->NUM_PREC_RADIX , object[U ( "num_PREC_RADIX" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->NULLABLE , object[U ( "nullable" )], as_integer() );
+    x_ASSIGN_IF_NOT_NULL ( result->REMARKS , object[U ( "remarks" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->COLUMN_DEF , object[U ( "column_DEF" )], as_string() );
+    //ASSIGN_IF_NOT_NULL(result->SQL_DATA_TYPE ,object[U("sql_DATA_TYPE")], as_integer());
+    ASSIGN_IF_NOT_NULL ( result->SQL_DATETIME_SUB , object[U ( "sql_DATETIME_SUB" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->CHAR_OCTET_LENGTH , object[U ( "char_OCTET_LENGTH" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->ORDINAL_POSITION , object[U ( "ordinal_POSITION" )], as_integer() );
+    x_ASSIGN_IF_NOT_NULL ( result->IS_NULLABLE , object[U ( "is_NULLABLE" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->SCOPE_CATLOG , object[U ( "scope_CATLOG" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->SCOPE_SCHEMA , object[U ( "scope_SCHEMA" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->SCOPE_TABLE , object[U ( "scope_TABLE" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->IS_AUTOINCREMENT , object[U ( "iS_AUTOINCREMENT" )], as_string() );
+    
+    if ( !object[U ( "source_DATA_TYPE" )].is_null() ) {
+        result->SOURCE_DATA_TYPE = ( short ) object[U ( "source_DATA_TYPE" )].as_integer();
+    }
+    
+    // the orig value passed from REST is java.sql.Types, we convert it to SQL Type
+    
+    if ( !object[U ( "data_TYPE" )].is_null() ) {
+        result->DATA_TYPE = JDBC2ODBC ( object[U ( "data_TYPE" )].as_integer() );
+    }
+    
+    if ( !object[U ( "sql_DATA_TYPE" )].is_null() ) {
+        result->SQL_DATA_TYPE = JDBC2ODBC ( object[U ( "sql_DATA_TYPE" )].as_integer() );
+    }
+    
+    return result;
+}
+
+std::unique_ptr<MetadataResponse> MetadataResponseFromJSON ( web::json::value & object ) {
+    std::unique_ptr<MetadataResponse> result ( new MetadataResponse() );
+    web::json::array& tableMetaArray = object.as_array();
+    
+    for ( auto iter = tableMetaArray.begin(); iter != tableMetaArray.end(); ++iter ) {
+        result->tableMetas.push_back ( TableMetaFromJSON ( *iter ) );
+        web::json::value& columns = ( *iter ) [U ( "columns" )];
+        web::json::array& columnsMetaArray = columns.as_array();
+        
+        for ( auto inner_iter = columnsMetaArray.begin(); inner_iter != columnsMetaArray.end(); ++inner_iter ) {
+            result->columnMetas.push_back ( ColumnMetaFromJSON ( *inner_iter ) );
+        }
+    }
+    
+    return result;
+}
+SelectedColumnMeta* SelectedColumnMetaFromJSON ( web::json::value & object ) {
+    SelectedColumnMeta* result = new SelectedColumnMeta();
+    ASSIGN_IF_NOT_NULL ( result->isAutoIncrement , object[U ( "autoIncrement" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->isCaseSensitive , object[U ( "caseSensitive" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->isSearchable , object[U ( "searchable" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->isCurrency , object[U ( "currency" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->isNullable , object[U ( "isNullable" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->isSigned , object[U ( "signed" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->displaySize , object[U ( "displaySize" )], as_integer() );
+    x_ASSIGN_IF_NOT_NULL ( result->label , object[U ( "label" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->name , object[U ( "name" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->schemaName , object[U ( "schemaName" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->catelogName , object[U ( "catelogName" )], as_string() );
+    x_ASSIGN_IF_NOT_NULL ( result->tableName , object[U ( "tableName" )], as_string() );
+    ASSIGN_IF_NOT_NULL ( result->precision , object[U ( "precision" )], as_integer() );
+    ASSIGN_IF_NOT_NULL ( result->scale , object[U ( "scale" )], as_integer() );
+    //ASSIGN_IF_NOT_NULL(result->columnType ,object[U("columnType")], as_integer());
+    x_ASSIGN_IF_NOT_NULL ( result->columnTypeName , object[U ( "columnTypeName" )], as_string() );
+    ASSIGN_IF_NOT_NULL ( result->isReadOnly , object[U ( "readOnly" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->isWritable , object[U ( "writable" )], as_bool() );
+    ASSIGN_IF_NOT_NULL ( result->isDefinitelyWritable , object[U ( "definitelyWritable" )], as_bool() );
+    
+    if ( !object[U ( "columnType" )].is_null() ) {
+        result->columnType = JDBC2ODBC ( object[U ( "columnType" )].as_integer() );
+    }
+    
+    return result;
+}
+
+void constructUnflattenResults ( SQLResponse* result, web::json::value& o_results ) {
+    if ( o_results.is_null() )
+    { return; }
+    
+    for ( auto iter = o_results.as_array().begin(); iter != o_results.as_array().end(); ++iter ) {
+        SQLRowContent* row = new SQLRowContent();
+        
+        for ( auto jter = iter->as_array().begin(); jter != iter->as_array().end(); ++jter ) {
+            if ( jter->is_null() ) {
+                wstring emptyCell;
+                row->contents.push_back ( emptyCell );
+            }
+            
+            else {
+                row->contents.push_back ( ( jter->as_string() ) );
+            }
+        }
+        
+        result->results.push_back ( row );
+    }
+}
+
+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 ) {
+            result->columnMetas.push_back ( SelectedColumnMetaFromJSON ( *iter ) );
+        }
+    }
+    
+    constructUnflattenResults ( result.get(), o_results );
+    return result;
+}
+
+std::unique_ptr<ErrorMessage> ErrorMessageFromJSON ( web::json::value & object ) {
+    std::unique_ptr<ErrorMessage> result ( new ErrorMessage() );
+    ASSIGN_IF_NOT_NULL ( result->url, object[U ( "url" )], as_string() );
+    ASSIGN_IF_NOT_NULL ( result->msg, object[U ( "exception" )], as_string() );
+    return result;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/JsonConverter.h
----------------------------------------------------------------------
diff --git a/odbc/Common/JsonConverter.h b/odbc/Common/JsonConverter.h
new file mode 100644
index 0000000..ac6dbcf
--- /dev/null
+++ b/odbc/Common/JsonConverter.h
@@ -0,0 +1,13 @@
+
+#pragma once
+
+#include "cpprest/json.h"
+#include "cpprest/asyncrt_utils.h"
+#include "MsgTypes.h"
+
+TableMeta* TableMetaFromJSON ( web::json::value & object );
+ColumnMeta* ColumnMetaFromJSON ( web::json::value & object );
+SelectedColumnMeta* SelectedColumnMetaFromJSON ( web::json::value & object );
+std::unique_ptr<MetadataResponse> MetadataResponseFromJSON ( web::json::value & object );
+std::unique_ptr<SQLResponse> SQLResponseFromJSON ( web::json::value & object );
+std::unique_ptr<ErrorMessage> ErrorMessageFromJSON ( web::json::value & object );

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/MsgTypes.h
----------------------------------------------------------------------
diff --git a/odbc/Common/MsgTypes.h b/odbc/Common/MsgTypes.h
new file mode 100644
index 0000000..ba5b427
--- /dev/null
+++ b/odbc/Common/MsgTypes.h
@@ -0,0 +1,415 @@
+// ----------------------------------------------------------------------------
+//
+// File:        MsgTypes.h
+//
+// Purpose:     Message protocols for kylin deriver to connect with Rest Server
+//
+// Author:      Hongbin Ma
+//
+
+#pragma once
+
+#include <string>
+#include <vector>
+#include <sstream>
+
+#include "StringUtils.h"
+#include "JDBCODBC.h"
+
+#define ASSIGN_IF_NOT_NULL(x,y,z)  if(!y.is_null())x=y.z
+#define x_ASSIGN_IF_NOT_NULL(x,y,z)  if(!y.is_null())x=wstring2string(y.z)
+
+using namespace std;
+
+class  TableMeta {
+  public:
+    string TABLE_CAT;
+    string TABLE_SCHEM;
+    string TABLE_NAME;
+    string TABLE_TYPE;
+    string REMARKS;
+    string TYPE_CAT;
+    string TYPE_SCHEM;
+    string TYPE_NAME;
+    string SELF_REFERENCING_COL_NAME;
+    string REF_GENERATION;
+    
+};
+
+class ColumnMeta {
+  public:
+    string TABLE_CAT;
+    string TABLE_SCHEM;
+    string TABLE_NAME;
+    string COLUMN_NAME;
+    int DATA_TYPE;
+    string TYPE_NAME;
+    int COLUMN_SIZE;
+    int BUFFER_LENGTH;
+    int DECIMAL_DIGITS;
+    int NUM_PREC_RADIX;
+    int NULLABLE;
+    string REMARKS;
+    string COLUMN_DEF;
+    int SQL_DATA_TYPE;
+    int SQL_DATETIME_SUB;
+    int CHAR_OCTET_LENGTH;
+    int ORDINAL_POSITION;
+    string IS_NULLABLE;
+    string SCOPE_CATLOG;
+    string SCOPE_SCHEMA;
+    string SCOPE_TABLE;
+    short SOURCE_DATA_TYPE;
+    string IS_AUTOINCREMENT;
+    
+};
+
+class MetadataResponse {
+  public:
+    std::vector<TableMeta*> tableMetas;
+    std::vector<ColumnMeta*> columnMetas;
+    
+    ~MetadataResponse() {
+        for ( std::vector<TableMeta*>::size_type i = 0 ; i < tableMetas.size(); ++i ) {
+            TableMeta* p = tableMetas.at ( i );
+            delete p;
+        }
+        
+        for ( std::vector<ColumnMeta*>::size_type i = 0 ; i < columnMetas.size(); ++i ) {
+            ColumnMeta* p = columnMetas.at ( i );
+            delete p;
+        }
+    }
+    
+};
+
+class SelectedColumnMeta {
+  public:
+    bool isAutoIncrement;
+    bool isCaseSensitive;
+    bool isSearchable;
+    bool isCurrency;
+    int isNullable ;//0:nonull, 1:nullable, 2: nullableunknown
+    bool isSigned ;
+    int displaySize;
+    string label;// AS keyword
+    string name ;
+    string schemaName ;
+    string catelogName;
+    string tableName;
+    int precision;
+    int scale;
+    int columnType ;// the orig value passed from REST is java.sql.Types, we convert it to SQL Type
+    string columnTypeName ;
+    bool isReadOnly;
+    bool isWritable ;
+    bool isDefinitelyWritable ;
+    
+};
+
+class SQLRowContent {
+  public:
+    std::vector<wstring> contents;
+    
+};
+
+class SQLResponse {
+  public:
+    // the data type for each column
+    std::vector<SelectedColumnMeta*> columnMetas;
+    
+    // the results rows, each row contains several columns
+    std::vector<SQLRowContent*> results;
+    
+    // if not select query, only return affected row count
+    int affectedRowCount;
+    
+    // flag indicating whether an exception occurred
+    bool isException;
+    
+    // if isException, the detailed exception message
+    wstring exceptionMessage;
+    
+    ~SQLResponse() {
+        for ( std::vector<SelectedColumnMeta*>::size_type i = 0 ; i < columnMetas.size(); ++i ) {
+            SelectedColumnMeta* p = columnMetas.at ( i );
+            delete p;
+        }
+        
+        for ( std::vector<SQLRowContent*>::size_type i = 0 ; i < results.size(); ++i ) {
+            SQLRowContent* p = results.at ( i );
+            delete p;
+        }
+    }
+    
+    static std::unique_ptr<SQLResponse> MakeResp4SQLTables ( MetadataResponse* meta ) {
+        std::unique_ptr<SQLResponse> ret ( new SQLResponse() );
+        FillColumnMetas4SQLTables ( ret.get() );
+        
+        for ( auto i = meta->tableMetas.begin(); i != meta->tableMetas.end(); i++ ) {
+            SQLRowContent* temp = new SQLRowContent();
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_CAT ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_SCHEM ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_NAME ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_TYPE ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->REMARKS ) );
+            ret->results.push_back ( temp );
+        }
+        
+        return ret;
+    }
+    
+    static std::unique_ptr<SQLResponse> MakeResp4SQLColumns ( MetadataResponse* meta, char* tableName, char* columnName ) {
+        std::unique_ptr<SQLResponse> ret ( new SQLResponse() );
+        FillColumnMetas4SQLColumns ( ret.get() );
+        
+        for ( auto i = meta->columnMetas.begin(); i != meta->columnMetas.end(); i++ ) {
+            //filter
+            if ( tableName != NULL && _stricmp ( tableName, ( *i )->TABLE_NAME.c_str() ) != 0 )
+            { continue; }
+            
+            if ( columnName != NULL && _stricmp ( columnName, ( *i )->COLUMN_NAME.c_str() ) != 0 )
+            { continue; }
+            
+            SQLRowContent* temp = new SQLRowContent();
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_CAT ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_SCHEM ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->TABLE_NAME ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->COLUMN_NAME ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->DATA_TYPE ) ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->TYPE_NAME ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->COLUMN_SIZE ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->BUFFER_LENGTH ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->DECIMAL_DIGITS ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->NUM_PREC_RADIX ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->NULLABLE ) ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->REMARKS ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->COLUMN_DEF ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->SQL_DATA_TYPE ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->SQL_DATETIME_SUB ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->CHAR_OCTET_LENGTH ) ) );
+            temp->contents.push_back ( string2wstring ( std::to_string ( ( *i )->ORDINAL_POSITION ) ) );
+            temp->contents.push_back ( string2wstring ( ( *i )->IS_NULLABLE ) );
+            temp->contents.push_back ( L"0" ); //user_data_type
+            ret->results.push_back ( temp );
+        }
+        
+        return ret;
+    }
+    
+    static std::string GetString ( int i ) {
+        std::ostringstream ss;
+        ss << i;
+        return ss.str();
+    }
+    
+    static void FillColumnMetas4SQLTables ( SQLResponse* sqlResp ) {
+        SelectedColumnMeta* m1 = new SelectedColumnMeta();
+        m1->label = "TABLE_CAT";
+        m1->name = "TABLE_CAT";
+        m1->displaySize = 128;
+        m1->scale = 0;
+        m1->isNullable = 1;
+        m1->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m2 = new SelectedColumnMeta();
+        m2->label = "TABLE_SCHEM";
+        m2->name = "TABLE_SCHEM";
+        m2->displaySize = 128;
+        m2->scale = 0;
+        m2->isNullable = 1;
+        m2->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m3 = new SelectedColumnMeta();
+        m3->label = "TABLE_NAME";
+        m3->name = "TABLE_NAME";
+        m3->displaySize = 128;
+        m3->scale = 0;
+        m3->isNullable = 1;
+        m3->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m4 = new SelectedColumnMeta();
+        m4->label = "TABLE_TYPE";
+        m4->name = "TABLE_TYPE";
+        m4->displaySize = 32;
+        m4->scale = 0;
+        m4->isNullable = 1;
+        m4->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m5 = new SelectedColumnMeta();
+        m5->label = "REMARKS";
+        m5->name = "REMARKS";
+        m5->displaySize = 254;
+        m5->scale = 0;
+        m5->isNullable = 1;
+        m5->columnType = ODBCTypes::ODBC_WVarChar;
+        sqlResp->columnMetas.push_back ( m1 );
+        sqlResp->columnMetas.push_back ( m2 );
+        sqlResp->columnMetas.push_back ( m3 );
+        sqlResp->columnMetas.push_back ( m4 );
+        sqlResp->columnMetas.push_back ( m5 );
+    }
+    
+    static void FillColumnMetas4SQLColumns ( SQLResponse* sqlResp ) {
+        SelectedColumnMeta* m1 = new SelectedColumnMeta();
+        m1->label = "TABLE_CAT";
+        m1->name = "TABLE_CAT";
+        m1->displaySize = 128;
+        m1->scale = 0;
+        m1->isNullable = 1;
+        m1->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m2 = new SelectedColumnMeta();
+        m2->label = "TABLE_SCHEM";
+        m2->name = "TABLE_SCHEM";
+        m2->displaySize = 128;
+        m2->scale = 0;
+        m2->isNullable = 1;
+        m2->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m3 = new SelectedColumnMeta();
+        m3->label = "TABLE_NAME";
+        m3->name = "TABLE_NAME";
+        m3->displaySize = 128;
+        m3->scale = 0;
+        m3->isNullable = 1;
+        m3->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m4 = new SelectedColumnMeta();
+        m4->label = "COLUMN_NAME";
+        m4->name = "COLUMN_NAME";
+        m4->displaySize = 128;
+        m4->scale = 0;
+        m4->isNullable = 0;
+        m4->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m5 = new SelectedColumnMeta();
+        m5->label = "DATA_TYPE";
+        m5->name = "DATA_TYPE";
+        m5->displaySize = 5;
+        m5->scale = 0;
+        m5->isNullable = 0;
+        m5->columnType = ODBCTypes::ODBC_SmallInt;
+        SelectedColumnMeta* m6 = new SelectedColumnMeta();
+        m6->label = "TYPE_NAME";
+        m6->name = "TYPE_NAME";
+        m6->displaySize = 128;
+        m6->scale = 0;
+        m6->isNullable = 0;
+        m6->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m7 = new SelectedColumnMeta();
+        m7->label = "COLUMN_SIZE";
+        m7->name = "COLUMN_SIZE";
+        m7->displaySize = 10;
+        m7->scale = 0;
+        m7->isNullable = 1;
+        m7->columnType = ODBCTypes::ODBC_Integer;
+        SelectedColumnMeta* m8 = new SelectedColumnMeta();
+        m8->label = "BUFFER_LENGTH";
+        m8->name = "BUFFER_LENGTH";
+        m8->displaySize = 10;
+        m8->scale = 0;
+        m8->isNullable = 1;
+        m8->columnType = ODBCTypes::ODBC_Integer;
+        SelectedColumnMeta* m9 = new SelectedColumnMeta();
+        m9->label = "DECIMAL_DIGITS";
+        m9->name = "DECIMAL_DIGITS";
+        m9->displaySize = 5;
+        m9->scale = 0;
+        m9->isNullable = 1;
+        m9->columnType = ODBCTypes::ODBC_SmallInt;
+        SelectedColumnMeta* m10 = new SelectedColumnMeta();
+        m10->label = "NUM_PREC_RADIX";
+        m10->name = "NUM_PREC_RADIX";
+        m10->displaySize = 5;
+        m10->scale = 0;
+        m10->isNullable = 1;
+        m10->columnType = ODBCTypes::ODBC_SmallInt;
+        SelectedColumnMeta* m11 = new SelectedColumnMeta();
+        m11->label = "NULLABLE";
+        m11->name = "NULLABLE";
+        m11->displaySize = 5;
+        m11->scale = 0;
+        m11->isNullable = 0;
+        m11->columnType = ODBCTypes::ODBC_SmallInt;
+        SelectedColumnMeta* m12 = new SelectedColumnMeta();
+        m12->label = "REMARKS";
+        m12->name = "REMARKS";
+        m12->displaySize = 128;
+        m12->scale = 0;
+        m12->isNullable = 1;
+        m12->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m13 = new SelectedColumnMeta();
+        m13->label = "COLUMN_DEF";
+        m13->name = "COLUMN_DEF";
+        m13->displaySize = 4000;
+        m13->scale = 0;
+        m13->isNullable = 1;
+        m13->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m14 = new SelectedColumnMeta();
+        m14->label = "SQL_DATA_TYPE";
+        m14->name = "SQL_DATA_TYPE";
+        m14->displaySize = 5;
+        m14->scale = 0;
+        m14->isNullable = 0;
+        m14->columnType = ODBCTypes::ODBC_SmallInt;
+        SelectedColumnMeta* m15 = new SelectedColumnMeta();
+        m15->label = "SQL_DATETIME_SUB";
+        m15->name = "SQL_DATETIME_SUB";
+        m15->displaySize = 5;
+        m15->scale = 0;
+        m15->isNullable = 1;
+        m15->columnType = ODBCTypes::ODBC_SmallInt;
+        SelectedColumnMeta* m16 = new SelectedColumnMeta();
+        m16->label = "CHAR_OCTET_LENGTH";
+        m16->name = "CHAR_OCTET_LENGTH";
+        m16->displaySize = 10;
+        m16->scale = 0;
+        m16->isNullable = 1;
+        m16->columnType = ODBCTypes::ODBC_Integer;
+        SelectedColumnMeta* m17 = new SelectedColumnMeta();
+        m17->label = "ORDINAL_POSITION";
+        m17->name = "ORDINAL_POSITION";
+        m17->displaySize = 10;
+        m17->scale = 0;
+        m17->isNullable = 0;
+        m17->columnType = ODBCTypes::ODBC_Integer;
+        SelectedColumnMeta* m18 = new SelectedColumnMeta();
+        m18->label = "IS_NULLABLE";
+        m18->name = "IS_NULLABLE";
+        m18->displaySize = 254;
+        m18->scale = 0;
+        m18->isNullable = 1;
+        m18->columnType = ODBCTypes::ODBC_WVarChar;
+        SelectedColumnMeta* m19 = new SelectedColumnMeta();
+        m19->label = "USER_DATA_TYPE";
+        m19->name = "USER_DATA_TYPE";
+        m19->displaySize = 5;
+        m19->scale = 0;
+        m19->isNullable = 1;
+        m19->columnType = ODBCTypes::ODBC_SmallInt;
+        sqlResp->columnMetas.push_back ( m1 );
+        sqlResp->columnMetas.push_back ( m2 );
+        sqlResp->columnMetas.push_back ( m3 );
+        sqlResp->columnMetas.push_back ( m4 );
+        sqlResp->columnMetas.push_back ( m5 );
+        sqlResp->columnMetas.push_back ( m6 );
+        sqlResp->columnMetas.push_back ( m7 );
+        sqlResp->columnMetas.push_back ( m8 );
+        sqlResp->columnMetas.push_back ( m9 );
+        sqlResp->columnMetas.push_back ( m10 );
+        sqlResp->columnMetas.push_back ( m11 );
+        sqlResp->columnMetas.push_back ( m12 );
+        sqlResp->columnMetas.push_back ( m13 );
+        sqlResp->columnMetas.push_back ( m14 );
+        sqlResp->columnMetas.push_back ( m15 );
+        sqlResp->columnMetas.push_back ( m16 );
+        sqlResp->columnMetas.push_back ( m17 );
+        sqlResp->columnMetas.push_back ( m18 );
+        sqlResp->columnMetas.push_back ( m19 );
+    }
+    
+};
+
+
+
+class ErrorMessage {
+  public:
+    wstring  url;
+    
+    // if isException, the detailed exception message
+    wstring  msg;
+    
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/QueryCache.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/QueryCache.cpp b/odbc/Common/QueryCache.cpp
new file mode 100644
index 0000000..6c5f869
--- /dev/null
+++ b/odbc/Common/QueryCache.cpp
@@ -0,0 +1,69 @@
+#include "QueryCache.h"
+#include <cpprest/http_client.h>
+#include <cpprest/filestream.h>
+#include <cpprest/json.h>
+#include <cpprest/uri.h>
+#include <regex>
+#include "Dump.h"
+#include "JsonConverter.h"
+
+
+const wchar_t* alwaysFailQueries[7] = {
+    L"(\\s)*CREATE(\\s)*LOCAL(\\s)*TEMPORARY(\\s)*TABLE(\\s)*\"XTableau_B_Connect\"(\\s)*\\((\\s)*\"COL\"(\\s)*INTEGER(\\s)*\\)(\\s)*ON(\\s)*COMMIT(\\s)*PRESERVE(\\s)*ROWS(\\s)*",
+    L"(\\s)*DROP(\\s)*TABLE(\\s)*\"XTableau_B_Connect\"(\\s)*",
+    L"(\\s)*SELECT(\\s)*TOP(\\s)*1(\\s)*\"COL\"(\\s)*FROM(\\s)*\\(SELECT(\\s)*1(\\s)*AS(\\s)*\"COL\"(\\s)*\\)(\\s)*AS(\\s)*\"CHECKTOP\"(\\s)*",
+    L"(\\s)*SELECT(\\s)*\"SUBCOL\"(\\s)*AS(\\s)*\"COL\"(\\s)*FROM(\\s)*\\((\\s)*SELECT(\\s)*1(\\s)*AS(\\s)*\"SUBCOL\"(\\s)*\\)(\\s)*\"SUBQUERY\"(\\s)*GROUP(\\s)*BY(\\s)*1(\\s)*",
+    L"(\\s)*SELECT(\\s)*\"SUBCOL\"(\\s)*AS(\\s)*\"COL\"(\\s)*FROM(\\s)*\\((\\s)*SELECT(\\s)*1(\\s)*AS(\\s)*\"SUBCOL\"(\\s)*\\)(\\s)*\"SUBQUERY\"(\\s)*GROUP(\\s)*BY(\\s)*\"COL\"(\\s)*",
+    L"(\\s)*INSERT(\\s)*INTO(\\s)*\"XTableau_C_Connect\"(\\s)*SELECT(\\s)*\\*(\\s)*FROM(\\s)*\\(SELECT(\\s)*1(\\s)*AS(\\s)*COL(\\s)*\\)(\\s)*AS(\\s)*CHECKTEMP(\\s)*LIMIT(\\s)*1(\\s)*",
+    L"(\\s)*DROP(\\s)*TABLE(\\s)*\"XTableau_C_Connect\"(\\s)*"
+};
+
+const wchar_t* alwaysSuccessQueries[3] = {
+    L"(\\s)*SELECT(\\s)*1(\\s)*",
+    L"(\\s)*SELECT(\\s)*\"COL\"(\\s)*FROM(\\s)*\\(SELECT(\\s)*1(\\s)*AS(\\s)*\"COL\"\\)(\\s)*AS(\\s)*\"SUBQUERY\"(\\s)*",
+    L"(\\s)*SELECT(\\s)*\"COL\"(\\s)*FROM(\\s)*\\(SELECT(\\s)*1(\\s)*AS(\\s)*\"COL\"\\)(\\s)*AS(\\s)*\"CHECKTOP\"(\\s)*LIMIT(\\s)*1(\\s)*"
+};
+
+const wchar_t* alwaysSuccessResults[3] = {
+    L"{\"columnMetas\":[{\"isNullable\":2,\"displaySize\":11,\"label\":\"COL\",\"name\":\"COL\",\"schemaName\":\"\",\"catelogName\":\"\",\"tableName\":\"\",\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"int4\",\"writable\":true,\"caseSensitive\":false,\"autoIncrement\":false,\"searchable\":true,\"currency\":false,\"signed\":true,\"definitelyWritable\":false,\"readOnly\":false}],\"results\":[[\"1\"]],\"isResultsFlatten\":false,\"flattenResult\":null,\"flattenResultOriginalSize\":0,\"cubes\":null,\"affectedRowCount\":0,\"isException\":false,\"exceptionMessage\":null,\"duration\":0.002,\"partial\":false}",
+    L"{\"columnMetas\":[{\"isNullable\":2,\"displaySize\":11,\"label\":\"COL\",\"name\":\"COL\",\"schemaName\":\"\",\"catelogName\":\"\",\"tableName\":\"\",\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"int4\",\"writable\":true,\"caseSensitive\":false,\"autoIncrement\":false,\"searchable\":true,\"currency\":false,\"signed\":true,\"definitelyWritable\":false,\"readOnly\":false}],\"results\":[[\"1\"]],\"isResultsFlatten\":false,\"flattenResult\":null,\"flattenResultOriginalSize\":0,\"cubes\":null,\"affectedRowCount\":0,\"isException\":false,\"exceptionMessage\":null,\"duration\":0.002,\"partial\":false}",
+    L"{\"columnMetas\":[{\"isNullable\":2,\"displaySize\":11,\"label\":\"COL\",\"name\":\"COL\",\"schemaName\":\"\",\"catelogName\":\"\",\"tableName\":\"\",\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"int4\",\"writable\":true,\"caseSensitive\":false,\"autoIncrement\":false,\"searchable\":true,\"currency\":false,\"signed\":true,\"definitelyWritable\":false,\"readOnly\":false}],\"results\":[[\"1\"]],\"isResultsFlatten\":false,\"flattenResult\":null,\"flattenResultOriginalSize\":0,\"cubes\":null,\"affectedRowCount\":0,\"isException\":false,\"exceptionMessage\":null,\"duration\":0.002,\"partial\":false}"
+};
+
+int findQuery ( const wchar_t* sql, const wchar_t** regexs, int size ) {
+    for ( int i = 0; i < size; ++i ) {
+        std::tr1::wregex rgx ( regexs[i], regex_constants::icase );
+        bool match = std::tr1::regex_search ( sql, rgx );
+        
+        if ( match ) {
+            return i;
+        }
+    }
+    
+    return -1;
+}
+
+int findInAlwaysSuccessQuery ( const wchar_t* sql ) {
+    return findQuery ( sql, alwaysSuccessQueries, sizeof ( alwaysSuccessQueries ) / sizeof ( wchar_t* ) );
+}
+
+int findInAlwaysFailQuery ( const wchar_t* sql ) {
+    return findQuery ( sql, alwaysFailQueries, sizeof ( alwaysFailQueries ) / sizeof ( wchar_t* ) );
+}
+
+unique_ptr<SQLResponse> loadCache ( const wchar_t* query ) {
+    int index = 0;
+    
+    if ( findInAlwaysFailQuery ( query ) >= 0 ) {
+        throw  exception ( "Unsupported SQL" );
+    }
+    
+    else if ( ( index = findInAlwaysSuccessQuery ( query ) ) >= 0 ) {
+        web::json::value v = web::json::value::parse ( alwaysSuccessResults[index] );
+        std::unique_ptr<SQLResponse> r = SQLResponseFromJSON ( v );
+        //overwrite(r.get());
+        return r;
+    }
+    
+    return NULL;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/QueryCache.h
----------------------------------------------------------------------
diff --git a/odbc/Common/QueryCache.h b/odbc/Common/QueryCache.h
new file mode 100644
index 0000000..e3e55e3
--- /dev/null
+++ b/odbc/Common/QueryCache.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#include "MsgTypes.h"
+
+unique_ptr<SQLResponse> loadCache ( const wchar_t* query );
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/REST.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/REST.cpp b/odbc/Common/REST.cpp
new file mode 100644
index 0000000..b008f4d
--- /dev/null
+++ b/odbc/Common/REST.cpp
@@ -0,0 +1,363 @@
+#include <cpprest/http_client.h>
+#include <cpprest/filestream.h>
+#include <cpprest/json.h>
+#include <cpprest/uri.h>
+#include <string>
+#include <windows.h>
+#include "Base64.h"
+#include "StringUtils.h"
+#include "REST.h"
+#include "Gzip.h"
+#include "QueryCache.h"
+#include "JsonConverter.h"
+
+#include <ctime>
+#include <fcntl.h>
+#include <io.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+
+using namespace utility;
+using namespace web::http;
+using namespace web::http::client;
+using namespace concurrency::streams;
+using namespace web;
+using namespace web::json;
+
+void printLog ( const char* msg ) {
+    time_t     now = time ( 0 );
+    struct tm  tstruct;
+    char buffer[100];
+    tstruct = *localtime ( &now );
+    strftime ( buffer, 100, "%Y-%m-%d.%X", &tstruct );
+    printf ( buffer );
+    printf ( "\n" );
+    printf ( msg );
+    printf ( "\n" );
+}
+
+/// <summary>
+/// Find the longest length
+/// </summary>
+/// <param name="results"></param>
+/// <param name="column"></param>
+/// <returns></returns>
+int ScanForLength ( std::vector<SQLRowContent*> results, int column ) {
+    int max = 0;
+    
+    for ( auto p = results.begin(); p < results.end(); p++ ) {
+        SQLRowContent* result = *p;
+        int length = result->contents[column].size();
+        
+        if ( length > max )
+        { max = length; }
+    }
+    
+    return max;
+}
+
+/// <summary>
+/// Scale is Maximum number of digits to the right of the decimal point.
+/// Find the largest scale.
+/// </summary>
+/// <param name="results"></param>
+/// <param name="column"></param>
+/// <returns></returns>
+int ScanForScale ( std::vector<SQLRowContent*> results, int column ) {
+    int max = 0;
+    
+    for ( auto p = results.begin(); p < results.end(); p++ ) {
+        SQLRowContent* result = *p;
+        int length = result->contents[column].size();
+        int dotLocation = result->contents[column].find ( L"." );
+        
+        if ( dotLocation != string::npos ) {
+            int scale = length - 1 - dotLocation;
+            
+            if ( scale > max )
+            { max = scale; }
+        }
+    }
+    
+    return max;
+}
+
+
+void overwrite ( SQLResponse* res ) {
+    for ( int i = 0; i < ( int ) res->columnMetas.size(); ++i ) {
+        SelectedColumnMeta* meta = res->columnMetas[i];
+        ODBCTypes t = ( ODBCTypes ) meta->columnType;
+        int scale = 0;
+        int length = 0;
+        
+        switch ( t ) {
+            case ODBCTypes::ODBC_Numeric:
+            case ODBCTypes::ODBC_Decimal:
+            case ODBCTypes::ODBC_Double:
+            case ODBCTypes::ODBC_Real:
+            case ODBCTypes::ODBC_Float:
+                scale = ScanForScale ( res->results, i );
+                meta->scale = scale;
+                meta->scale = 4;
+                break;
+                
+            case ODBCTypes::ODBC_Char:
+            case ODBCTypes::ODBC_VarChar:
+            case ODBCTypes::ODBC_LongVarChar:
+            case ODBCTypes::ODBC_WChar:
+            case ODBCTypes::ODBC_WVarChar:
+            case ODBCTypes::ODBC_WLongVarChar:
+            case ODBCTypes::ODBC_DateTime:
+            case ODBCTypes::ODBC_Type_Date:
+            case ODBCTypes::ODBC_Type_Time:
+            case ODBCTypes::ODBC_Type_Timestamp:
+                length = ScanForLength ( res->results, i );
+                meta->displaySize = length;
+                meta->precision = length;
+                break;
+                
+            default:
+                break;
+        }
+    }
+}
+
+std::wstring completeServerStr ( char* serverStr, long port ) {
+    //concat the whole server string
+    char completeServerAddr[256];
+    char portSuffix[10];
+    sprintf ( portSuffix, ":%d", port );
+    
+    if ( strstr ( serverStr, "https://" ) == serverStr ||
+            strstr ( serverStr, "http://" ) == serverStr ) {
+        sprintf ( completeServerAddr, "%s", serverStr );
+    }
+    
+    else {
+        // by default use https
+        sprintf ( completeServerAddr, "https://%s", serverStr );
+    }
+    
+    if ( strstr ( serverStr, portSuffix ) == NULL ) {
+        strcat ( completeServerAddr, portSuffix );
+    }
+    
+    return string2wstring ( std::string ( completeServerAddr ) );
+}
+
+
+http_request makeRequest ( const char* username, const char* passwd, const wchar_t* uriStr , http::method method ) {
+    http_request request;
+    char s[128];
+    sprintf ( s, "%s:%s", username, passwd );
+    std::string b64 = base64_encode ( ( unsigned char const* ) s, strlen ( s ) );
+    request.set_method ( method );
+    request.set_request_uri ( uri ( uri::encode_uri ( uriStr ) ) );
+    request.headers().add ( header_names::authorization, string2wstring ( "Basic " + b64 ) );
+    request.headers().add ( header_names::content_type, "application/json" );
+    return request;
+}
+
+bool restAuthenticate ( char* serverAddr, long port, char* username, char* passwd ) {
+    wstring  serverAddrW = completeServerStr ( serverAddr,  port ) ;
+    http_client_config config;
+    config.set_timeout ( utility::seconds ( 300 ) );
+    http_client session ( serverAddrW, config );
+    //can get project list only when correct username/password is given
+    http_request request = makeRequest ( username, passwd, L"/kylin/api/projects", methods::GET );
+    http_response response = session.request ( request ).get();
+    
+    if ( response.status_code() == status_codes::OK )
+    { return true; }
+    
+    else
+    { return false; }
+}
+
+void restListProjects ( char* serverAddr, long port, char* username, char* passwd , std::vector<string>& holder ) {
+    wstring  serverAddrW = completeServerStr ( serverAddr,  port );
+    http_client_config config;
+    config.set_timeout ( utility::seconds ( 300 ) );
+    http_client session ( serverAddrW, config );
+    http_request request = makeRequest ( username, passwd, L"/kylin/api/projects", methods::GET );
+    http_response response = session.request ( request ).get();
+    
+    if ( response.status_code() == status_codes::OK ) {
+        web::json::value projects = response.extract_json().get();
+        
+        for ( auto iter = projects.as_array().begin(); iter != projects.as_array().end(); ++iter ) {
+            holder.push_back ( wstring2string ( ( *iter ) [U ( "name" )].as_string() ) );
+        }
+        
+        if ( holder.size() == 0 )
+        { throw exception ( "There is no project available in this server" ); }
+    }
+    
+    else if ( response.status_code() == status_codes::InternalError ) {
+        std::unique_ptr<ErrorMessage> em = ErrorMessageFromJSON ( response.extract_json().get() );
+        string errorMsg = wstring2string ( em->msg );
+        throw  exception ( errorMsg.c_str() );
+    }
+    
+    else {
+        throw exception ( "REST request(listproject) Invalid Response status code : " + response.status_code() );
+    }
+}
+
+std::unique_ptr<MetadataResponse> restGetMeta ( char* serverAddr, long port , char* username, char* passwd,
+                                                char* project ) {
+    wstring  serverAddrW = completeServerStr ( serverAddr,  port ) ;
+    http_client_config config;
+    config.set_timeout ( utility::seconds ( 300 ) );
+    http_client session ( serverAddrW, config );
+    std::wstringstream wss;
+    wss << L"/kylin/api/tables_and_columns" << L"?project=" << project;
+    http_request request = makeRequest ( username, passwd, wss.str().c_str(), methods::GET );
+    http_response response = session.request ( request ).get();
+    
+    if ( response.status_code() == status_codes::OK ) {
+        return MetadataResponseFromJSON ( response.extract_json().get() );
+    }
+    
+    else if ( response.status_code() == status_codes::Unauthorized ) {
+        throw exception ( "Username/Password Unauthorized." );
+    }
+    
+    else if ( response.status_code() == status_codes::InternalError ) {
+        std::unique_ptr<ErrorMessage> em = ErrorMessageFromJSON ( response.extract_json().get() );
+        string errorMsg = wstring2string ( em->msg );
+        throw  exception ( errorMsg.c_str() );
+    }
+    
+    else {
+        throw exception ( "REST request(getmeta) Invalid Response status code : " + response.status_code() );
+    }
+}
+
+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;
+    
+    for ( size_t pos = 0;; pos += 2 ) {
+        pos = ret.find ( L"\"", pos );
+        
+        if ( pos == wstring::npos ) { break; }
+        
+        ret.insert ( pos, L"\\" );
+    }
+    
+    return ret;
+}
+
+wstring getBodyString ( http_response& response ) {
+    bool isGzipped = response.headers().has ( L"Content-Encoding" );
+    
+    if ( isGzipped ) {
+        isGzipped = false;
+        http_headers::iterator iterator = response.headers().find ( L"Content-Encoding" );
+        
+        if ( iterator != response.headers().end() ) {
+            wstring contentEncoding = iterator->second;
+            
+            if ( contentEncoding.find ( L"gzip" ) != std::string::npos )
+            { isGzipped = true; }
+        }
+    }
+    
+    container_buffer<std::string> bodyBuffer;
+    response.body().read_to_end ( bodyBuffer ).get();
+    const std::string& raw = bodyBuffer.collection();
+    std::string uncompressed;
+    
+    if ( isGzipped ) {
+        bool decompressStatus = gzipInflate ( raw, uncompressed );
+        
+        if ( !decompressStatus )
+        { throw exception ( "gzip decompress failed" ); }
+    }
+    
+    else {
+        uncompressed = raw;
+    }
+    
+    //convert the string from utf8 to wchar
+    int size_needed = ::MultiByteToWideChar ( CP_UTF8, 0, ( char* ) uncompressed.c_str(), uncompressed.size(), NULL, 0 );
+    std::wstring ret ( size_needed, 0 );
+    ::MultiByteToWideChar ( CP_UTF8, 0, ( char* ) uncompressed.c_str(), uncompressed.size(), &ret[0], size_needed );
+    return ret;
+}
+
+std::unique_ptr<SQLResponse> restQuery ( wchar_t* rawSql, char* serverAddr, long port, char* username,
+                                         char* passwd,
+                                         char* project ) {
+    //using local cache to intercept probing queries
+    std::unique_ptr<SQLResponse> cachedQueryRes = loadCache ( rawSql );
+    
+    if ( cachedQueryRes != NULL )
+    { return cachedQueryRes; }
+    
+    //real requesting
+    wstring serverAddrW = completeServerStr ( serverAddr,  port ) ;
+    http_client_config config;
+    config.set_timeout ( utility::seconds ( 36000 ) );
+    http_client session ( serverAddrW, config );
+    http_request request = makeRequest ( username, passwd, L"/kylin/api/query", methods::POST );
+    wstring sql = cookQuery ( rawSql );
+    std::wstringstream wss;
+    wss << L"{ \"acceptPartial\": false, \"project\" : \"" << project << L"\", " <<  " \"sql\" : \"" << sql << L"\" }"  ;
+    request.set_body ( wss.str(), L"application/json" );
+    request.headers().add ( header_names::accept_encoding, "gzip,deflate" );
+    http::status_code status;
+    http_response response;
+    
+    try {
+        response = session.request ( request ).get();
+        status = response.status_code();
+    }
+    
+    catch ( std::exception& e ) {
+        std::stringstream ss;
+        ss << "An exception is throw Error message: " << e.what();
+        throw exception ( ss.str().c_str() );
+    }
+    
+    wstring ret = getBodyString ( response );
+    
+    if ( status == status_codes::OK ) {
+        //convert to json
+        web::json::value actualRes = web::json::value::parse ( ret );
+        std::unique_ptr<SQLResponse> r = SQLResponseFromJSON ( actualRes );
+        
+        if ( r->isException == true ) {
+            string expMsg = wstring2string ( r->exceptionMessage );
+            throw exception ( expMsg.c_str() );
+        }
+        
+        overwrite ( r.get() );
+        return r;
+    }
+    
+    else if ( status == status_codes::InternalError ) {
+        std::unique_ptr<ErrorMessage> em = ErrorMessageFromJSON ( web::json::value::parse ( ret ) );
+        string expMsg = wstring2string ( em->msg );
+        throw  exception ( expMsg.c_str() );
+    }
+    
+    else {
+        throw exception ( "Unknown exception in rest query with return code " + status );
+    }
+    
+    return NULL;
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/REST.h
----------------------------------------------------------------------
diff --git a/odbc/Common/REST.h b/odbc/Common/REST.h
new file mode 100644
index 0000000..99cd90f
--- /dev/null
+++ b/odbc/Common/REST.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "vld.h"
+#include "MsgTypes.h"
+
+//REST
+bool restAuthenticate ( char* serverAddr, long port, char* username, char* passwd );
+
+void restListProjects ( char* serverAddr, long port, char* username, char* passwd, std::vector<string>& holder );
+
+std::unique_ptr<SQLResponse> restQuery ( wchar_t* rawSql, char* serverAddr, long port, char* username,
+                                         char* passwd,
+                                         char* project );
+
+std::unique_ptr<MetadataResponse> restGetMeta ( char* serverAddr, long port, char* username, char* passwd,
+                                                char* project );



[12/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_CONN.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_CONN.CPP b/odbc/Driver/KO_CONN.CPP
new file mode 100644
index 0000000..2a5233b
--- /dev/null
+++ b/odbc/Driver/KO_CONN.CPP
@@ -0,0 +1,1010 @@
+// ----------------------------------------------------------------------------
+//
+// File:    KO_CONN.CPP
+//
+// Purpose: Contains the main connection functions more
+//          specifically SQLDriverConnect.
+//
+//          Only SQLDriverConnect with DSN specified is supported now.
+//          The DSN must have been set properly with ODBCAD.exe
+//
+//          Most functions in this file either to support the dialog box or
+//          help in manipulation or parsing of key-value pairs
+//
+// Exported functions:
+//                       SQLDriverConnect
+//                       SQLConnect
+//                       SQLBrowseConnect
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+#include <stdio.h>
+#include <resource.h>
+
+#include "REST.h"
+
+// ------------------------------ local defines -------------------------------
+#define MAX_KEYS_STR_LEN       1024                 // arbitray for loading keys from DSN file
+#define MAX_CONN_STR_LEN       2048                 // arbitray for building key-values from DSN
+#define KV_BLOCK_SIZE          5                    // arbitray size for a set of key-value pairs
+
+// ------------------------ local callback functions  -------------------------
+INT_PTR CALLBACK DlgDSNCfg1Proc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+// ----------------------------- local functions ------------------------------
+static eGoodBad     CreateAndSetConnProp ( pODBCConn pConn, Word pPropID, void* pPropValue );
+
+static eGoodBad     PutDataToDlgDSNCfg1 ( pODBCConn pConn, HWND hDlg );
+
+static eGoodBad     GetDataFromDlgDSNCfg1 ( HWND hDlg, pODBCConn pConn );
+
+static Word         PromptForConnInfo ( SQLHDBC pConn );
+
+static eGoodBad     LoadKeyValuesfromFileDSN ( pODBCConn pConn, CStrPtr pDSNName, Word* pNumPair,
+                                               struct ODBCKV** pKV );
+
+static bool         AddKVToConnStr ( StrPtr pKey, StrPtr pValue, Word* iPos, StrPtr pStrConn, Word pMaxLen );
+static bool         BuildConnStr ( char* pStrConn, Word pMaxLen, pODBCConn pConn, struct ODBCKV* KVInput,
+                                   Word iKVInputPairs, struct ODBCKV* KVFileDSN, Word iKVFileDSNPairs );
+
+
+
+// -----------------------------------------------------------------------
+// to set a specified property in the connection structure
+// -----------------------------------------------------------------------
+
+eGoodBad SetConnProp ( pODBCConn pConn, Word pPropID, void* pPropValue ) {
+    // note
+    // this function does not create a copy of char data
+    // it just transfers the pointer
+    // numeric data is assumed to be a pointer
+    
+    // check property
+    switch ( pPropID ) {
+        case CONN_PROP_SERVER:
+        
+            // check if a new value has to be put
+            if ( pPropValue ) {
+                copyTrimmed ( & ( ( char* ) pConn->Server ), ( char* ) pPropValue );
+            }
+            
+            if ( pConn->Server == NULL || strlen ( pConn->Server ) == 0 ) {
+                __ODBCPopMsg ( "Server cannot be empty" );
+                return BAD;
+            }
+            
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The server is set to %s", pConn->Server ) );
+            break;
+            
+        case CONN_PROP_PORT:
+        
+            // numeric values are passed as pointer to value
+            if ( pPropValue )
+            { pConn->ServerPort = * ( ( ULong* ) pPropValue ); }
+            
+            if ( pConn->ServerPort == 0 ) {
+                __ODBCPopMsg ( "ServerPort cannot be 0" );
+                return BAD;
+            }
+            
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The port is set to %d", pConn->ServerPort ) );
+            break;
+            
+        case CONN_PROP_UID:
+        
+            // check if a new value has to be put
+            if ( pPropValue )
+            { copyTrimmed ( & ( ( char* ) pConn->UserName ), ( char* ) pPropValue ); }
+            
+            if ( pConn->UserName == NULL || strlen ( pConn->UserName ) == 0 ) {
+                __ODBCPopMsg ( "UserName cannot be empty" );
+                return BAD;
+            }
+            
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The uid is set to %s", pConn->UserName ) );
+            break;
+            
+        case CONN_PROP_PWD:
+        
+            // check if a new value has to be put
+            if ( pPropValue )
+            { copyTrimmed ( & ( ( char* ) pConn->Password ), ( char* ) pPropValue ); }
+            
+            if ( pConn->Password == NULL || strlen ( pConn->Password ) == 0 ) {
+                __ODBCPopMsg ( "Password cannot be empty" );
+                return BAD;
+            }
+            
+            break;
+            
+        case CONN_PROP_PROJECT:
+        
+            // check if a new value has to be put
+            if ( pPropValue )
+            { copyTrimmed ( & ( ( char* ) pConn->Project ), ( char* ) pPropValue ); }
+            
+            if ( pConn->Project == NULL || strlen ( pConn->Project ) == 0 ) {
+                __ODBCPopMsg ( "Project cannot be empty" );
+                return BAD;
+            }
+            
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "Bad connection property" ) );
+            return BAD;
+    }
+    
+    return GOOD;
+}
+
+
+// -----------------------------------------------------------------------
+// to create copy of a value and then set it in the struct
+// -----------------------------------------------------------------------
+
+static eGoodBad CreateAndSetConnProp ( pODBCConn pConn, Word pPropID, void* pPropValue ) {
+    bool    IsPropStr;
+    
+    // precaution
+    if ( !pConn )
+    { return BAD; }
+    
+    // determine the prop type
+    switch ( pPropID ) {
+        case CONN_PROP_PORT:                // port is stored as a number
+            IsPropStr = FALSE;
+            break;
+            
+        default:
+            IsPropStr = TRUE;
+            break;
+    }
+    
+    // check property type
+    if ( IsPropStr ) {
+        Word    x;
+        unique_ptr<char[]> s = NULL;
+        // find length of property
+        x = pPropValue ? strlen ( ( StrPtr ) pPropValue ) : 0;
+        
+        // check if something
+        if ( x > 0 ) {
+            // create copy of property
+            s = make_unique_str ( x );
+            // store
+            strcpy ( s.get(), ( StrPtr ) pPropValue );
+        }
+        
+        // now set the property
+        return SetConnProp ( pConn, pPropID, s.get() );
+    }
+    
+    else {
+        Long    v;
+        // convert value to integer
+        v = ( pPropValue ) ? atoi ( ( StrPtr ) pPropValue ) : 0;
+        // now set the property
+        return SetConnProp ( pConn, pPropID, &v );
+    }
+}
+
+// -----------------------------------------------------------------------
+// to provide the default data to DSN config dialog 1
+// -----------------------------------------------------------------------
+
+static eGoodBad PutDataToDlgDSNCfg1 ( pODBCConn pConn, HWND hDlg ) {
+    BOOL    x;
+    
+    // precaution
+    if ( !pConn || !hDlg ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "PutDataToDlgDSNCfg1 - Bad params" ) );
+        return BAD;
+    }
+    
+    // server name/IP
+    if ( pConn->Server )
+    { x = SetDlgItemText ( hDlg, IDC_SERVER, pConn->Server ); }
+    
+    else
+    { x = SetDlgItemText ( hDlg, IDC_SERVER, "" ); }
+    
+    if ( !x )  { return BAD; }
+    
+    // server port
+    if ( pConn->ServerPort )
+    { x = SetDlgItemInt ( hDlg, IDC_PORT, pConn->ServerPort, FALSE ); }
+    
+    else
+    { x = SetDlgItemInt ( hDlg, IDC_PORT, DEFAULT_PORT, FALSE ); }
+    
+    if ( !x )  { return BAD; }
+    
+    // user name
+    if ( pConn->UserName )
+    { x = SetDlgItemText ( hDlg, IDC_UID, pConn->UserName ); }
+    
+    else
+    { x = SetDlgItemText ( hDlg, IDC_UID, "" ); }
+    
+    if ( !x )  { return BAD; }
+    
+    // password
+    if ( pConn->Password )
+    { x = SetDlgItemText ( hDlg, IDC_PWD, pConn->Password ); }
+    
+    else
+    { x = SetDlgItemText ( hDlg, IDC_PWD, "" ); }
+    
+    if ( !x )  { return BAD; }
+    
+    return GOOD;
+}
+
+
+
+// -----------------------------------------------------------------------
+// to fetch the data from the dialog 1 into the conn-struct
+// -----------------------------------------------------------------------
+
+static eGoodBad GetDataFromDlgDSNCfg1 ( HWND hDlg, pODBCConn pConn ) {
+    Long    x;
+    std::unique_ptr<char[]>  n = NULL;
+    eGoodBad status;
+    
+    // note
+    // no error handling is currently being done for
+    // GetDlgItemText/GetDlgItemInt/SetConnProp
+    // generally should not be a problem
+    
+    // precaution
+    if ( !pConn || !hDlg ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "GetDataFromDlgDSNCfg1 - Bad params" ) );
+        return BAD;
+    }
+    
+    ////// server name/IP
+    // get length of input text
+    x = SendDlgItemMessage ( hDlg, IDC_SERVER, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        n = make_unique_str ( x );                              // allocate space for holding the text
+        GetDlgItemText ( hDlg, IDC_SERVER, n.get(), x + 1 );      // get text from dialog
+    }
+    
+    else
+    { n = NULL; }                                           // no input
+    
+    // set value in struct
+    status = SetConnProp ( pConn, CONN_PROP_SERVER, n.get() );
+    
+    if ( status == BAD ) { return BAD; }
+    
+    /////  Port
+    // get value
+    x = GetDlgItemInt ( hDlg, IDC_PORT, NULL, FALSE );
+    // set value in struct
+    status = SetConnProp ( pConn, CONN_PROP_PORT, &x );
+    
+    if ( status == BAD ) { return BAD; }
+    
+    ////// User name
+    // get length
+    x = SendDlgItemMessage ( hDlg, IDC_UID, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        // allocate space
+        n = make_unique_str ( x );                              // allocate space for holding the text
+        GetDlgItemText ( hDlg, IDC_UID, n.get(), x + 1 );
+    }
+    
+    else
+    { n = NULL; }
+    
+    // set value in struct
+    status = SetConnProp ( pConn, CONN_PROP_UID, n.get() );
+    
+    if ( status == BAD ) { return BAD; }
+    
+    ////// Password
+    // get length
+    x = SendDlgItemMessage ( hDlg, IDC_PWD, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        // allocate space
+        n = make_unique_str ( x );                              // allocate space for holding the text
+        GetDlgItemText ( hDlg, IDC_PWD, n.get(), x + 1 );
+    }
+    
+    else
+    { n = NULL; }
+    
+    // set value in struct
+    status = SetConnProp ( pConn, CONN_PROP_PWD, n.get() );
+    
+    if ( status == BAD ) { return BAD; }
+    
+    return GOOD;
+}
+
+
+// --------------------------------------------------------------------------
+// call back for DSN config dialog 1
+// --------------------------------------------------------------------------
+
+INT_PTR CALLBACK DlgDSNCfg1Proc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
+    pODBCConn pgConn = NULL;
+    eGoodBad status = GOOD;
+    RETCODE ret = SQL_SUCCESS;
+    
+    switch ( uMsg ) {
+        case WM_INITDIALOG:
+            // store the structure for future use
+            SetWindowLongPtr ( hDlg, DWLP_USER, lParam );
+            // initialize the dialog with data from conn struct
+            PutDataToDlgDSNCfg1 ( ( pODBCConn ) lParam, hDlg );
+            // set focus automatically
+            return TRUE;
+            
+        case WM_COMMAND:
+            switch ( LOWORD ( wParam ) ) {
+                case IDC_CONNECT: {
+                        HWND hwndCombo = GetDlgItem ( hDlg, IDC_COMBO1 );
+                        HWND hwndOK = GetDlgItem ( hDlg, IDOK );
+                        // fetch all information from controls & feed to struct
+                        pgConn = ( pODBCConn ) GetWindowLongPtr ( hDlg, DWLP_USER );
+                        status = GetDataFromDlgDSNCfg1 ( hDlg, pgConn );
+                        
+                        if ( status == BAD ) {
+                            //Blank input, already popped message
+                            return FALSE;
+                        }
+                        
+                        ret = TryAuthenticate ( pgConn );
+                        
+                        if ( ret == SQL_ERROR ) {
+                            //validation of data & other prompts goes here
+                            __ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
+                            return FALSE;
+                        }
+                        
+                        //passed verification
+                        EnableWindow ( hwndCombo, TRUE );
+                        
+                        try {
+                            std::vector<string> projects;
+                            restListProjects ( pgConn->Server, pgConn->ServerPort, pgConn->UserName, pgConn->Password, projects );
+                            
+                            for ( unsigned int i = 0 ; i < projects.size(); ++i ) {
+                                SendMessage ( hwndCombo, ( UINT ) CB_ADDSTRING, ( WPARAM ) 0, ( LPARAM ) projects.at ( i ).c_str() );
+                            }
+                            
+                            SendMessage ( hwndCombo, CB_SETCURSEL, ( WPARAM ) 0, ( LPARAM ) 0 );
+                        }
+                        
+                        catch ( exception& e ) {
+                            __ODBCPopMsg ( e.what() );
+                            return FALSE;
+                        }
+                        
+                        EnableWindow ( hwndOK, TRUE );
+                        return TRUE;
+                    }
+                    
+                case IDOK: {
+                        pgConn = ( pODBCConn ) GetWindowLongPtr ( hDlg, DWLP_USER );
+                        HWND hwndCombo = GetDlgItem ( hDlg, IDC_COMBO1 );
+                        int ItemIndex = SendMessage ( ( HWND ) hwndCombo, ( UINT ) CB_GETCURSEL,
+                                                      ( WPARAM ) 0, ( LPARAM ) 0 );
+                        TCHAR  projectName[256];
+                        ( TCHAR ) SendMessage ( ( HWND ) hwndCombo, ( UINT ) CB_GETLBTEXT,
+                                                ( WPARAM ) ItemIndex, ( LPARAM ) projectName );
+                        SetConnProp ( pgConn, CONN_PROP_PROJECT, projectName );
+                        //last trial with project given
+                        ret = TryFetchMetadata ( pgConn );
+                        
+                        if ( ret == SQL_ERROR ) {
+                            //validation of data & other prompts goes here
+                            __ODBCPopMsg ( "Something went wrong with your selected project" );
+                            return FALSE;
+                        }
+                        
+                        EndDialog ( hDlg, wParam );
+                        return TRUE;
+                    }
+                    
+                // Fall through, do not break or return
+                case IDCANCEL:
+                    // indicate end with control id as return value
+                    EndDialog ( hDlg, wParam );
+                    return TRUE;
+            }
+    }
+    
+    return FALSE;
+}
+
+
+
+// -----------------------------------------------------------------------
+// to get connection info from user
+// -----------------------------------------------------------------------
+
+static Word PromptForConnInfo ( SQLHDBC pConn ) {
+    int     i;
+    // invoke dialog to fetch info
+    i = DialogBoxParam ( ghInstDLL, MAKEINTRESOURCE ( IDD_DSN_CFG1 ), NULL, DlgDSNCfg1Proc, ( LPARAM ) pConn );
+    
+    // check status
+    switch ( i ) {
+        case IDOK:
+            return 1;           // complete
+            
+        default:
+            return 0;           // user-cancelled
+    }
+}
+
+
+// -----------------------------------------------------------------------
+// to split a given string into key value pairs separated with semi-colon
+// -----------------------------------------------------------------------
+
+eGoodBad CvtStrToKeyValues ( CStrPtr pStr, Word pMaxLen, Word* pNumPair, struct ODBCKV** pKV ) {
+    bool    flgError;
+    Word    x;
+    Word    pairs;
+    Word    i, len;
+    struct ODBCKV*    kvtemp;
+    struct ODBCKV*    kv;
+    // caller safe
+    *pNumPair   = 0;
+    *pKV        = NULL;
+    // local initializations
+    kvtemp  = NULL;
+    kv      = NULL;
+    
+    // main loop to split the strings into key values
+    for ( pairs = 0, i = 0, len = ( pMaxLen > 0 ) ? pMaxLen : strlen ( pStr ), flgError = FALSE; i < len &&
+            !flgError; pairs ++ ) {
+        // find the length of key
+        for ( x = 0; pStr[i] != '=' && i < len; x ++, i ++ );
+        
+        // check if a valid key found
+        if ( x <= 0 ) {
+            flgError = TRUE;                // error condition
+            continue;
+        }
+        
+        // allocate a new record ie key-value if required
+        if ( kv == NULL || pairs % KV_BLOCK_SIZE == 0 ) {
+            // allocate more records
+            kvtemp = new struct ODBCKV[pairs + KV_BLOCK_SIZE];
+            memset ( kvtemp, 0, sizeof ( struct ODBCKV ) * ( pairs + KV_BLOCK_SIZE ) );
+            
+            // transfer the old ones into this new one
+            if ( kv ) {
+                memcpy ( kvtemp, kv, sizeof ( struct ODBCKV ) *pairs );
+                delete[] kv;
+                kv = NULL;
+            }
+            
+            // now start using the new one
+            kv      = kvtemp;
+            kvtemp  = NULL;
+        }
+        
+        // create key in current row
+        kv[pairs].key = new Char[x + 1];
+        // put key
+        strncpy ( kv[pairs].key, pStr + ( i - x ), x );
+        kv[pairs].key[x] = 0;
+        // move ahead to ignore equals sign
+        ++ i;
+        
+        // find the length of value
+        if ( strcmp ( kv[pairs].key, "PWD" ) != 0 ) {
+            for ( x = 0;  pStr[i] != ';' && i < len; x ++, i ++ ) ;
+        }
+        
+        else {
+            //There may exist ; in PWD
+            for ( x = 0;  i < len; x ++, i ++ ) {
+                if ( strncmp ( &pStr[i], ";SERVER=", 8 ) == 0 )
+                { break; }
+            }
+        }
+        
+        // check if a non-empty value found
+        if ( x > 0 ) {
+            // create value in current row
+            kv[pairs].value = new Char[x + 1];
+            // put value
+            strncpy ( kv[pairs].value, pStr + ( i - x ), x );
+            kv[pairs].value[x] = 0;
+        }
+        
+        // move ahead to ignore the semi-colon at end of key-value
+        ++ i;
+    }
+    
+    // check for error condition
+    if ( flgError ) {
+        // clean up
+        if ( kv ) {
+            delete[] kv;
+            kv = NULL;
+        }
+        
+        return BAD;                // error condition
+    }
+    
+    else {
+        *pNumPair   = pairs;
+        *pKV        = kv;
+        return GOOD;
+    }
+}
+
+void        FreeGenODBCKeyValues ( ODBCKV* keyvalues, int pairs ) {
+    for ( int i = 0 ; i < pairs; ++i ) {
+        if ( keyvalues[i].key )
+        { delete[] keyvalues[i].key ; }
+        
+        if ( keyvalues[i].value )
+        { delete[] keyvalues[i].value; }
+    }
+}
+
+
+// -----------------------------------------------------------------------
+// to find a particular key and/or value in key-value pair list
+// -----------------------------------------------------------------------
+
+bool FindInKeyValues ( CStrPtr pKey, CStrPtr pValue, struct ODBCKV* pKV, Word pItems, Word* pPosition ) {
+    Word    i;
+    bool    flgMatch;
+    
+    // loop to traverse the list
+    for ( i = 0, flgMatch = FALSE; i < pItems; i ++ ) {
+        // match key
+        flgMatch = ( pKey && _stricmp ( pKey, pKV[i].key ) == 0 );
+        
+        // match value
+        if ( pValue && pKV[i].value )
+        { flgMatch = ( _stricmp ( pValue, pKV[i].value ) == 0 ); }
+        
+        // break if match
+        if ( flgMatch ) { break; }
+    }
+    
+    // check if found
+    if ( flgMatch ) {
+        if ( pPosition )  { *pPosition = i; }
+        
+        return TRUE;
+    }
+    
+    return FALSE;
+}
+
+
+// -----------------------------------------------------------------------
+// to load key value pairs from a File DSN
+// -----------------------------------------------------------------------
+
+static eGoodBad LoadKeyValuesfromFileDSN ( pODBCConn pConn, CStrPtr pDSNName, Word* pNumPair,
+                                           struct ODBCKV** pKV ) {
+    //Never called
+    throw - 1;
+}
+
+
+// -----------------------------------------------------------------------
+// to add a key-value pair to specified conn string
+// -----------------------------------------------------------------------
+
+static bool AddKVToConnStr ( StrPtr pKey, StrPtr pValue, Word* iPos, StrPtr pStrConn, Word pMaxLen ) {
+    Word    i, j;
+    
+    // precaution
+    if ( !pKey )
+    { return FALSE; }
+    
+    // get length of key and value
+    i = strlen ( pKey );
+    j = ( pValue ) ? strlen ( pValue ) : 0;
+    
+    // check if both can be added along with equal sign & semi-colon
+    if ( *iPos + i + j + 2 <= pMaxLen ) {
+        strcat ( pStrConn, pKey );
+        strcat ( pStrConn, "=" );
+        
+        if ( pValue )
+        { strcat ( pStrConn, pValue ); }
+        
+        strcat ( pStrConn, ";" );
+        ( *iPos ) = ( *iPos ) + i + j + 2;  // re-position
+        return TRUE;
+    }
+    
+    return FALSE;
+}
+
+
+// -----------------------------------------------------------------------
+// to build the out-connection string
+// -----------------------------------------------------------------------
+
+static bool BuildConnStr ( char* pStrConn, Word pMaxLen, pODBCConn pConn, struct ODBCKV* KVInput,
+                           Word iKVInputPairs, struct ODBCKV* KVFileDSN, Word iKVFileDSNPairs ) {
+    Word    iPos = 0;
+    Char    p[32];                              // arbitary for string port number as string
+    // initializations
+    memset ( pStrConn, 0, pMaxLen );
+    // convert port number to string
+    _itoa ( pConn->ServerPort, p, 10 );
+    
+    // transfer all strings from struct
+    if ( !AddKVToConnStr ( "DRIVER", "{KylinODBCDriver}", &iPos, pStrConn, pMaxLen ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "AddKVToConnStr failed in %s", "Driver" ) );
+        return FALSE;
+    }
+    
+    if ( !AddKVToConnStr ( "SERVER", pConn->Server, &iPos, pStrConn, pMaxLen ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "AddKVToConnStr failed in %s", "Server" ) );
+        return FALSE;
+    }
+    
+    if ( !AddKVToConnStr ( "PROJECT", pConn->Project, &iPos, pStrConn, pMaxLen ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "AddKVToConnStr failed in %s", "Project" ) );
+        return FALSE;
+    }
+    
+    if ( !AddKVToConnStr ( "PORT", p, &iPos, pStrConn, pMaxLen ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "AddKVToConnStr failed in %s", "Port" ) );
+        return FALSE;
+    }
+    
+    if ( !AddKVToConnStr ( "UID", pConn->UserName, &iPos, pStrConn, pMaxLen ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "AddKVToConnStr failed in %s", "Uid" ) );
+        return FALSE;
+    }
+    
+    if ( !AddKVToConnStr ( "PWD", pConn->Password, &iPos, pStrConn, pMaxLen ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "AddKVToConnStr failed in %s", "Pwd" ) );
+        return FALSE;
+    }
+    
+    return TRUE;
+}
+
+// -----------------------------------------------------------------------
+// to connect to the driver
+// -----------------------------------------------------------------------
+RETCODE SQL_API SQLDriverConnectW ( SQLHDBC            hdbc,
+                                    SQLHWND             hwnd,
+                                    SQLWCHAR*           szConnStrIn,
+                                    SQLSMALLINT         cchConnStrIn,
+                                    SQLWCHAR*           szConnStrOut,
+                                    SQLSMALLINT         cchConnStrOutMax,
+                                    SQLSMALLINT*        pcchConnStrOut,
+                                    SQLUSMALLINT        fDriverCompletion ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDriverConnectW called, cchConnStrIn %d, cchConnStrOutMax %d, wcslen %d",
+                              cchConnStrIn, cchConnStrOutMax, wcslen ( szConnStrIn ) ) );
+    int inStrLength = wcslen ( szConnStrIn ) + 1;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The inStr Length is : %d", inStrLength ) );
+    unique_ptr<char[]> pInStr ( new char[inStrLength] );
+    unique_ptr<char[]> pOutStr ( new char[cchConnStrOutMax + 1] );
+    wchar2char ( szConnStrIn, pInStr.get(), inStrLength );
+    //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"The inStr is : %s",pInStr.get()));
+    SQLSMALLINT outStrLength = 0 ;
+    RETCODE code = SQLDriverConnect ( hdbc, hwnd, ( SQLCHAR* ) pInStr.get(), cchConnStrIn, ( SQLCHAR* ) pOutStr.get(),
+                                      cchConnStrOutMax, &outStrLength, fDriverCompletion );
+                                      
+    if ( code == SQL_ERROR ) {
+        return code;
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pcchConnStrOut null? %d, cchConnStrOutMax > 0 ? %d, szConnStrOut null? %d",
+                              pcchConnStrOut == NULL, cchConnStrOutMax > 0 , szConnStrOut == NULL ) );
+                              
+    if ( cchConnStrOutMax > 0 && pcchConnStrOut && szConnStrOut ) {
+        char2wchar ( pOutStr.get(), szConnStrOut, ( int ) cchConnStrOutMax );
+        *pcchConnStrOut = wcslen ( szConnStrOut );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "(W)The Length of Out Conn Str is %d", *pcchConnStrOut ) );
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the ret code is %d", code ) );
+    return code;
+}
+
+RETCODE SQL_API SQLDriverConnect ( SQLHDBC         pConn,
+                                   SQLHWND         pWndHandle,
+                                   SQLCHAR*        pInConnStr,
+                                   SQLSMALLINT     pInConnStrLen,
+                                   SQLCHAR*        pOutConnStr,
+                                   SQLSMALLINT     pOutConnStrLen,
+                                   SQLSMALLINT*    pOutConnStrLenPtr,
+                                   SQLUSMALLINT    pDriverCompletion ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The window handle is %d, the driver completion flag is %d", pWndHandle,
+                              pDriverCompletion ) );
+    pODBCConn pgConn = ( pODBCConn ) pConn;
+    bool    f;
+    bool    flgDriver, flgDSN;                                  // flags for knowing if these key present in string
+    bool    flgServer, flgPort, flgUID, flgPWD, flgProj;         // flags for knowing if these key present in string
+    Word    i, n;
+    Word    iKVInputPairs;             // no of key value pairs as input
+    Word    iDriverPos, iDSNPos;                    // ??? can be eliminated by optimization of code
+    Word    iServerPos, iPortPos, iUIDPos, iPWDPos, iProjPos;     // ??? can be eliminated by optimization of code
+    struct ODBCKV* KVInput;                    // key value as input via  function param
+    struct ODBCKV* KV;                         // generic, temp
+    
+    if ( !pInConnStr ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLDriverConnect: pInConnStr is required" ) );
+        return SQL_ERROR;
+    }
+    
+    else {
+        //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"The passed-in Connection Str is %s",(char*)pInConnStr));
+    }
+    
+    __CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    // caller safe
+    if ( pOutConnStr ) { *pOutConnStr = 0; }
+    
+    if ( pOutConnStrLenPtr ) { *pOutConnStrLenPtr = 0; }
+    
+    // initializations
+    KVInput     = NULL;
+    flgServer   = FALSE;
+    flgPort     = FALSE;
+    flgUID      = FALSE;
+    flgPWD      = FALSE;
+    flgProj     = FALSE;
+    
+    // check if an in-string has been specified
+    if ( pInConnStr ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Parsing the in str" ) );
+        
+        // split into key-value pairs
+        if ( CvtStrToKeyValues ( ( StrPtr ) pInConnStr, pInConnStrLen, &iKVInputPairs, &KVInput ) != GOOD ) {
+            return SQL_ERROR;
+        }
+        
+        // first check if dsn keyword is present
+        flgDSN = FindInKeyValues ( "DSN", NULL, KVInput, iKVInputPairs, &iDSNPos );
+        // look for driver only if DSN is absent else Driver is always ignored
+        flgDriver = ( flgDSN ) ? FALSE : FindInKeyValues ( "DRIVER", NULL, KVInput, iKVInputPairs, &iDriverPos );
+        
+        // if DSN is to be used, fetch its set of key values
+        if ( flgDSN ) {
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The in str is a dsn string" ) );
+            //connect by dsn
+            SetCurrentDSN ( ( char* ) pInConnStr, "SQLDriverConnect" );
+            
+            if ( LoadODBCINIDataToConn ( pgConn ) != GOOD ) {
+                return SQL_ERROR;
+            }
+        }
+        
+        else if ( flgDriver ) {
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The in str is a driver string" ) );
+            /************* debug
+                for (  i = 0, n = iKVInputPairs, KV = KVInput; i < n; i++ )
+                fprintf ( stderr, "Index: %d, Key: %s, Value: %s\n", i, KV[i].key ? KV[i].key : "(nokey)", KV[i].value ? KV[i].value : "(no value)" );
+            *********/
+            
+            // loop to parse both input key-values and DSN key-values & feed into struct
+            for ( i = 0, n = iKVInputPairs, KV = KVInput; i < n; i++ ) {
+                if ( !flgServer ) {
+                    flgServer = FindInKeyValues ( "SERVER", NULL, KV, n, &iServerPos );
+                    
+                    if ( flgServer ) { CreateAndSetConnProp ( ( pODBCConn ) pConn, CONN_PROP_SERVER, KV[iServerPos].value ); }
+                }
+                
+                if ( !flgPort ) {
+                    flgPort = FindInKeyValues ( "PORT", NULL, KV, n, &iPortPos );
+                    
+                    if ( flgPort )  { CreateAndSetConnProp ( ( pODBCConn ) pConn, CONN_PROP_PORT, KV[iPortPos].value ); }
+                }
+                
+                if ( !flgUID ) {
+                    flgUID = FindInKeyValues ( "UID", NULL, KV, n, &iUIDPos );
+                    
+                    if ( flgUID ) {
+                        CreateAndSetConnProp ( ( pODBCConn ) pConn, CONN_PROP_UID, KV[iUIDPos].value );
+                        __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "Log in as User : %s ", KV[iUIDPos].value ) );
+                    }
+                }
+                
+                if ( !flgPWD ) {
+                    flgPWD = FindInKeyValues ( "PWD", NULL, KV, n, &iPWDPos );
+                    
+                    if ( flgPWD )  { CreateAndSetConnProp ( ( pODBCConn ) pConn, CONN_PROP_PWD, KV[iPWDPos].value ); }
+                }
+                
+                if ( !flgProj ) {
+                    flgProj = FindInKeyValues ( "PROJECT", NULL, KV, n, &iProjPos );
+                    
+                    if ( flgProj )  { CreateAndSetConnProp ( ( pODBCConn ) pConn, CONN_PROP_PROJECT, KV[iProjPos].value ); }
+                }
+            }
+        }
+        
+        else {
+            _SQLPutDiagRow ( SQL_HANDLE_DBC, pConn, "SQLDriverConnectW", "HY000", 1045, "Only DSN or driver connect is allowed" );
+            __ODBCPOPMSG ( _ODBCPopMsg ( "Only DSN or driver connect is allowed, instead of %s", pInConnStr ) );
+            return SQL_ERROR;
+        }
+        
+        FreeGenODBCKeyValues ( KVInput, iKVInputPairs );
+        delete[] KVInput;
+    }
+    
+    else if ( pDriverCompletion == SQL_DRIVER_NOPROMPT ) {  // check if no-prompt forced
+        __ODBCPOPMSG ( _ODBCPopMsg ( "No connection string && no prompt specified" ) );
+        _SQLPutDiagRow ( SQL_HANDLE_DBC, pConn, "SQLDriverConnectW", "HY000", 1045,
+                         "Access denied. (using UID: NO , using password: NO)" );
+        return SQL_ERROR;
+    }
+    
+    RETCODE ret;
+    
+    // check if prompt required ie any info is missing
+    if ( flgDriver && ( !flgServer || !flgPort || !flgUID || !flgPWD || !flgProj ) ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "Connection info imcomplete, prompt for input..." ) );
+        
+        if ( flgUID && !flgPWD &&  pDriverCompletion == SQL_DRIVER_NOPROMPT ) {
+            _SQLPutDiagRow ( SQL_HANDLE_DBC, pConn, "SQLDriverConnectW", "HY000", 1045,
+                             "Access denied for user 'root'@'kylin-tableau-clean.com' (using password: NO)" );
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR,
+                                      "UID present but PWD absent, guessing it's on Tableau Server, return SQL ERROR" ) );
+            return SQL_ERROR;
+        }
+        
+        //connect by driver
+        // fetch entire connection information thru dialogs
+        switch ( PromptForConnInfo ( pConn ) ) {
+            case 0:         // user-cancelled
+                return SQL_NO_DATA_FOUND;
+                
+            default:
+                break;
+        }
+        
+        ret = SQL_SUCCESS;
+    }
+    
+    else {
+        ret = TryFetchMetadata ( pgConn ) ;
+        
+        if ( ret == SQL_ERROR ) {
+            return ret;
+        }
+    }
+    
+    // OUT CONN STRING
+    // build the out-connection string if required
+    if ( pOutConnStr && pOutConnStrLen > 0 && pOutConnStrLenPtr ) {
+        if ( flgDriver ) {
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Building out str..." ) );
+            // build the out conn string using key value pairs
+            f = BuildConnStr ( ( StrPtr ) pOutConnStr, pOutConnStrLen, ( pODBCConn ) pConn, NULL, 0, NULL, 0 );
+            
+            if ( !f ) {
+                _SQLPutDiagRow ( SQL_HANDLE_DBC, pConn, "SQLDriverConnectW", "HY000", 1045, "Out connection string not complete" );
+            }
+        }
+        
+        else {
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Copy in str to out str" ) );
+            strcpy ( ( char* ) pOutConnStr, ( char* ) pInConnStr );
+        }
+        
+        *pOutConnStrLenPtr = strlen ( ( StrPtr ) pOutConnStr );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The Length of Out Conn Str is %d", *pOutConnStrLenPtr ) );
+    }
+    
+    else {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "skip writing to the out put string" ) );
+    }
+    
+    return ret;
+}
+
+
+RETCODE   TryFetchMetadata ( pODBCConn pgConn ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "start loading metadata..." ) );
+    
+    try {
+        pgConn->meta = std::move ( restGetMeta ( pgConn->Server, pgConn->ServerPort, pgConn->UserName, pgConn->Password,
+                                                 pgConn->Project ) );
+    }
+    
+    catch ( const exception& e ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, "The REST request failed to get metadata" ) );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, e.what() ) );
+        _SQLPutDiagRow ( SQL_HANDLE_DBC, pgConn, "SQLDriverConnect", "HY000", 1045, "Access denied. (using password: NO)" );
+        return SQL_ERROR;
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "End loading metadata" ) );
+    return SQL_SUCCESS;
+}
+
+RETCODE   TryAuthenticate ( pODBCConn pgConn ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Start authenticating.." ) );
+    
+    try {
+        bool authenticated = restAuthenticate ( pgConn->Server, pgConn->ServerPort, pgConn->UserName, pgConn->Password );
+        
+        if ( !authenticated )
+        { throw exception ( "Username/Password incorrect." ); }
+    }
+    
+    catch ( const exception& e ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, "The REST request failed to authenticate." ) );
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, e.what() ) );
+        _SQLPutDiagRow ( SQL_HANDLE_DBC, pgConn, "SQLDriverConnect", "HY000", 1045, "Access denied. (using password: NO)" );
+        return SQL_ERROR;
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "End authenticating" ) );
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to connect to the server using standard parameters
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLConnect ( SQLHDBC     pConn,
+                             SQLCHAR*    pServerName,
+                             SQLSMALLINT pServerNameLen,
+                             SQLCHAR*    pUserName,
+                             SQLSMALLINT pUserNameLen,
+                             SQLCHAR*    pPassword,
+                             SQLSMALLINT pPasswordLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLConnect called" ) );
+    __CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLConnect - not implemented, use SQLDriverConnect" ) );
+    return SQL_ERROR;
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    return ( SQL_SUCCESS );
+}
+
+SQLRETURN SQL_API SQLConnectW ( SQLHDBC             hdbc,
+                                SQLWCHAR* szDSN,
+                                SQLSMALLINT         cchDSN,
+                                SQLWCHAR* szUID,
+                                SQLSMALLINT         cchUID,
+                                SQLWCHAR* szAuthStr,
+                                SQLSMALLINT         cchAuthStr
+                              ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLConnectW called" ) );
+    __CHK_HANDLE ( hdbc, SQL_HANDLE_DBC, SQL_ERROR );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLConnectW - not implemented, use SQLDriverConnectW" ) );
+    return SQL_ERROR;
+    _SQLFreeDiag ( _DIAGCONN ( hdbc ) );
+    return ( SQL_SUCCESS );
+}
+
+
+
+// -----------------------------------------------------------------------
+// to connect in multiple iterations
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLBrowseConnect ( SQLHDBC         pConn,
+                                   SQLCHAR*        InConnectionString,
+                                   SQLSMALLINT     StringLength1,
+                                   SQLCHAR*        OutConnectionString,
+                                   SQLSMALLINT     BufferLength,
+                                   SQLSMALLINT*    StringLength2Ptr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBrowseConnect called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLBrowseConnect - not implemented, use SQLDriverConnect" ) );
+    return SQL_ERROR;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_CTLG.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_CTLG.CPP b/odbc/Driver/KO_CTLG.CPP
new file mode 100644
index 0000000..0170428
--- /dev/null
+++ b/odbc/Driver/KO_CTLG.CPP
@@ -0,0 +1,341 @@
+// ----------------------------------------------------------------------------
+//
+// File:    KO_CTLG.CPP
+//
+// Purpose: Contains catalog functions
+//          Functions that allow collection of metadata/information
+//          about the database are termed as catalog functions.
+//          For example SQLTables allows you to get all the
+//          databases, users on the server or tables in database.
+//          Similarly SQLColumns allows you to get all the cols
+//          in a table.
+//
+// Exported functions:
+//                       SQLTables
+//                       SQLColumns
+//                       SQLSpecialColumns
+//                       SQLStatistics
+//                       SQLPrimaryKeys
+//                       SQLForeignKeys
+//                       SQLTablePrivileges
+//                       SQLColumnPrivileges
+//                       SQLProcedures
+//                       SQLProcedureColumns
+//
+// ----------------------------------------------------------------------------
+
+#include "stdafx.h"
+
+
+
+// -----------------------------------------------------------------------
+// to get list of catalog(database), schema(users), tables(tables)
+// ------------------------------------------------------------------------
+
+RETCODE SQL_API SQLTablesW ( SQLHSTMT        pStmt,
+                             SQLWCHAR*        pCatalogName,
+                             SQLSMALLINT     pCatalogNameSize,
+                             SQLWCHAR*        pSchemaName,
+                             SQLSMALLINT     pSchemaNameSize,
+                             SQLWCHAR*        pTableName,
+                             SQLSMALLINT     pTableNameSize,
+                             SQLWCHAR*        pTableType,
+                             SQLSMALLINT     pTableTypeSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLTablesW is called " ) );
+    unique_ptr<char[]> p1 ( wchar2char ( pCatalogName ) );
+    unique_ptr<char[]> p2 ( wchar2char ( pSchemaName ) );
+    unique_ptr<char[]> p3 ( wchar2char ( pTableName ) );
+    unique_ptr<char[]> p4 ( wchar2char ( pTableType ) );
+    return SQLTables ( pStmt, ( SQLCHAR* )  p1.get(), pCatalogNameSize, ( SQLCHAR* ) p2.get(), pSchemaNameSize,
+                       ( SQLCHAR* )  p3.get(), pTableNameSize, ( SQLCHAR* ) p4.get(), pTableTypeSize );
+}
+
+RETCODE SQL_API SQLTables ( SQLHSTMT        pStmt,
+                            SQLCHAR*        pCatalogName,
+                            SQLSMALLINT     pCatalogNameSize,
+                            SQLCHAR*        pSchemaName,
+                            SQLSMALLINT     pSchemaNameSize,
+                            SQLCHAR*        pTableName,
+                            SQLSMALLINT     pTableNameSize,
+                            SQLCHAR*        pTableType,
+                            SQLSMALLINT     pTableTypeSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLTables: Ctlg: %s, %d, Schema: %s, %d, Table: %s,%d, Type: %s, %d",
+                              pCatalogName, pCatalogNameSize, pSchemaName, pSchemaNameSize, pTableName, pTableNameSize, pTableType,
+                              pTableTypeSize ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    std::unique_ptr<SQLResponse> p = SQLResponse::MakeResp4SQLTables ( ( ( pODBCStmt ) pStmt )->Conn->meta.get() );
+    
+    if ( PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) {
+        return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to get the list of column names in specified tables
+// ------------------------------------------------------------------------
+
+RETCODE SQL_API SQLColumnsW ( SQLHSTMT        pStmt,
+                              SQLWCHAR*        pCtlgName,
+                              SQLSMALLINT     pCtlgNameLen,
+                              SQLWCHAR*        pSchemaName,
+                              SQLSMALLINT     pSchemaNameLen,
+                              SQLWCHAR*        pTableName,
+                              SQLSMALLINT     pTableNameLen,
+                              SQLWCHAR*        pColumnName,
+                              SQLSMALLINT     pColumnNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColumnsW is called" ) );
+    unique_ptr<char[]> p1 ( wchar2char ( pCtlgName ) );
+    unique_ptr<char[]> p2 ( wchar2char ( pSchemaName ) );
+    unique_ptr<char[]> p3 ( wchar2char ( pTableName ) );
+    unique_ptr<char[]> p4 ( wchar2char ( pColumnName ) );
+    return SQLColumns ( pStmt, ( SQLCHAR* ) p1.get(), pCtlgNameLen, ( SQLCHAR* )  p2.get(), pSchemaNameLen,
+                        ( SQLCHAR* )    p3.get(), pTableNameLen, ( SQLCHAR* ) p4.get(), pColumnNameLen );
+}
+
+RETCODE SQL_API SQLColumns ( SQLHSTMT        pStmt,
+                             SQLCHAR*        pCtlgName,
+                             SQLSMALLINT     pCtlgNameLen,
+                             SQLCHAR*        pSchemaName,
+                             SQLSMALLINT     pSchemaNameLen,
+                             SQLCHAR*        pTableName,
+                             SQLSMALLINT     pTableNameLen,
+                             SQLCHAR*        pColumnName,
+                             SQLSMALLINT     pColumnNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColumns called, Ctlg: %s, %d. Schema: %s, %d, Table: %s, %d, Col: %s, %d",
+                              pCtlgName, pCtlgNameLen, pSchemaName, pSchemaNameLen, pTableName, pTableNameLen, pColumnName, pColumnNameLen ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    // feed stmt structure with response
+    std::unique_ptr<SQLResponse> p = SQLResponse::MakeResp4SQLColumns ( ( ( pODBCStmt ) pStmt )->Conn->meta.get(),
+                                     ( char* ) pTableName, ( char* ) pColumnName );
+                                     
+    if ( PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) {
+        return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get the list of column names which make a row unqiue or r updateable
+// ------------------------------------------------------------------------
+
+SQLRETURN SQL_API SQLSpecialColumns ( SQLHSTMT        pStmt,
+                                      SQLUSMALLINT    pIdentifierType,
+                                      SQLCHAR*        pCtlgName,
+                                      SQLSMALLINT     pCtlgNameLen,
+                                      SQLCHAR*        pSchemaName,
+                                      SQLSMALLINT     pSchemaNameLen,
+                                      SQLCHAR*        pTableName,
+                                      SQLSMALLINT     pTableNameLen,
+                                      SQLUSMALLINT    pScope,
+                                      SQLUSMALLINT    pNullable )
+
+{
+    // note
+    // possible values for pIdentifierType are
+    // SQL_BEST_ROWID ----- primary key columns
+    // SQL_ROWVER --------- all updateable columns
+    //
+    // possible values for pScope are
+    // SQL_SCOPE_CURROW
+    // SQL_SCOPE_TRANSACTION
+    // SQL_SCOPE_SESSION
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSpecialColumns called, Ctlg: %s, %d. Schema: %s, %d, Table: %s, %d",
+                              pCtlgName, pCtlgNameLen, pSchemaName, pSchemaNameLen, pTableName, pTableNameLen ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSpecialColumns not implemented" ) );
+    return SQL_ERROR;
+}
+
+// -----------------------------------------------------------------------
+// to get table and/or index statistics
+// ------------------------------------------------------------------------
+
+RETCODE SQL_API SQLStatistics ( SQLHSTMT        pStmt,
+                                SQLCHAR*        pCtlgName,
+                                SQLSMALLINT     pCtlgNameLen,
+                                SQLCHAR*        pSchemaName,
+                                SQLSMALLINT     pSchemaNameLen,
+                                SQLCHAR*        pTableName,
+                                SQLSMALLINT     pTableNameLen,
+                                SQLUSMALLINT    pUnique,
+                                SQLUSMALLINT    pReserved ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLStatistics called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLStatistics not implemented" ) );
+    return SQL_ERROR;
+}
+
+// -----------------------------------------------------------------------
+// to get columns which make up the p-keys
+// ------------------------------------------------------------------------
+RETCODE SQL_API SQLPrimaryKeysW ( SQLHSTMT    pStmt,
+                                  SQLWCHAR*    pCtlgName,
+                                  SQLSMALLINT pCtlgNameLen,
+                                  SQLWCHAR*    pSchemaName,
+                                  SQLSMALLINT pSchemaNameLen,
+                                  SQLWCHAR*    pTableName,
+                                  SQLSMALLINT pTableNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPrimaryKeysW called" ) );
+    return SQLPrimaryKeys ( pStmt, NULL, NULL, NULL, NULL, NULL, NULL );
+}
+
+
+RETCODE SQL_API SQLPrimaryKeys ( SQLHSTMT    pStmt,
+                                 SQLCHAR*    pCtlgName,
+                                 SQLSMALLINT pCtlgNameLen,
+                                 SQLCHAR*    pSchemaName,
+                                 SQLSMALLINT pSchemaNameLen,
+                                 SQLCHAR*    pTableName,
+                                 SQLSMALLINT pTableNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPrimaryKeys called" ) );
+    std::unique_ptr<SQLResponse> p ( new SQLResponse() );
+    
+    if ( PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) {
+        return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to get foreign key information
+// ------------------------------------------------------------------------
+RETCODE SQL_API SQLForeignKeysW ( SQLHSTMT        pStmt,
+                                  SQLWCHAR*        pPKCtlgName,
+                                  SQLSMALLINT     pPKCtlgNameLen,
+                                  SQLWCHAR*        pPKSchemaName,
+                                  SQLSMALLINT     pPKSchemaNameLen,
+                                  SQLWCHAR*        pPKTableName,
+                                  SQLSMALLINT     pPKTableNameLen,
+                                  SQLWCHAR*        pFKCtlgName,
+                                  SQLSMALLINT     pFKCtlgNameLen,
+                                  SQLWCHAR*        pFKSchemaName,
+                                  SQLSMALLINT     pFKSchemaNameLen,
+                                  SQLWCHAR*        pFKTableName,
+                                  SQLSMALLINT     pFKTableNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLForeignKeysW called" ) );
+    unique_ptr<char[]> p1 ( wchar2char ( pPKCtlgName ) );
+    unique_ptr<char[]> p2 ( wchar2char ( pPKSchemaName ) );
+    unique_ptr<char[]> p3 ( wchar2char ( pPKTableName ) );
+    unique_ptr<char[]> p4 ( wchar2char ( pFKCtlgName ) );
+    unique_ptr<char[]> p5 ( wchar2char ( pFKSchemaName ) );
+    unique_ptr<char[]> p6 ( wchar2char ( pFKTableName ) );
+    return SQLForeignKeys ( pStmt,
+                            ( SQLCHAR* ) p1.get(),
+                            pPKCtlgNameLen,
+                            ( SQLCHAR* ) p2.get(),
+                            pPKSchemaNameLen,
+                            ( SQLCHAR* ) p3.get(),
+                            pPKTableNameLen,
+                            ( SQLCHAR* ) p4.get(),
+                            pFKCtlgNameLen,
+                            ( SQLCHAR* ) p5.get(),
+                            pFKSchemaNameLen,
+                            ( SQLCHAR* ) p6.get(),
+                            pFKTableNameLen );
+}
+
+RETCODE SQL_API SQLForeignKeys ( SQLHSTMT        pStmt,
+                                 SQLCHAR*        pPKCtlgName,
+                                 SQLSMALLINT     pPKCtlgNameLen,
+                                 SQLCHAR*        pPKSchemaName,
+                                 SQLSMALLINT     pPKSchemaNameLen,
+                                 SQLCHAR*        pPKTableName,
+                                 SQLSMALLINT     pPKTableNameLen,
+                                 SQLCHAR*        pFKCtlgName,
+                                 SQLSMALLINT     pFKCtlgNameLen,
+                                 SQLCHAR*        pFKSchemaName,
+                                 SQLSMALLINT     pFKSchemaNameLen,
+                                 SQLCHAR*        pFKTableName,
+                                 SQLSMALLINT     pFKTableNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "SQLForeignKeys called pPKCtlgName: %s, pPKSchemaName : %s, pPKTableName: %s, pFKCtlgName: %s, pFKSchemaName: %s, pFKTableName: %s",
+                              pPKCtlgName, pPKSchemaName, pPKTableName, pFKCtlgName, pFKSchemaName, pFKTableName ) );
+    std::unique_ptr<SQLResponse> p ( new SQLResponse() );
+    
+    if ( PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) {
+        return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a list of tables and the privileges associated with each table
+// ------------------------------------------------------------------------
+
+RETCODE SQL_API SQLTablePrivileges ( SQLHSTMT        pStmt,
+                                     SQLCHAR*        pCtlgName,
+                                     SQLSMALLINT     pCtlgNameLen,
+                                     SQLCHAR*        pSchemaName,
+                                     SQLSMALLINT     pSchemaNameLen,
+                                     SQLCHAR*        pTableName,
+                                     SQLSMALLINT     pTableNameLen )
+
+{
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLTablePrivileges called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLTablePrivileges not implemented" ) );
+    return SQL_ERROR;
+}
+
+// -----------------------------------------------------------------------
+// to get a list of columns and associated privileges for the specified table
+// ------------------------------------------------------------------------
+
+RETCODE SQL_API SQLColumnPrivileges ( SQLHSTMT        pStmt,
+                                      SQLCHAR*        pCtlgName,
+                                      SQLSMALLINT     pCtlgNameLen,
+                                      SQLCHAR*        pSchemaName,
+                                      SQLSMALLINT     pSchemaNameLen,
+                                      SQLCHAR*        pTableName,
+                                      SQLSMALLINT     pTableNameLen,
+                                      SQLCHAR*        pColumnName,
+                                      SQLSMALLINT     pColumnNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColumnPrivileges called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLColumnPrivileges not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a list of procedure names stored in a specific data source
+// ------------------------------------------------------------------------
+
+
+RETCODE SQL_API SQLProcedures ( SQLHSTMT        pStmt,
+                                SQLCHAR*        pCtlgName,
+                                SQLSMALLINT     pCtlgNameLen,
+                                SQLCHAR*        pSchemaName,
+                                SQLSMALLINT     pSchemaNameLen,
+                                SQLCHAR*        pProcName,
+                                SQLSMALLINT     pProcNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLProcedures called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLProcedures not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to get a list of procedure names stored in a specific data source
+// ------------------------------------------------------------------------
+
+RETCODE SQL_API SQLProcedureColumns ( SQLHSTMT        pStmt,
+                                      SQLCHAR*        pCtlgName,
+                                      SQLSMALLINT     pCtlgNameLen,
+                                      SQLCHAR*        pSchemaName,
+                                      SQLSMALLINT     pSchemaNameLen,
+                                      SQLCHAR*        pProcName,
+                                      SQLSMALLINT     pProcNameLen,
+                                      SQLCHAR*        pColumnName,
+                                      SQLSMALLINT     pColumnNameLen ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLProceduresColumns called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLProceduresColumns not implemented" ) );
+    return SQL_ERROR;
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_Config.cpp
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_Config.cpp b/odbc/Driver/KO_Config.cpp
new file mode 100644
index 0000000..4fa2773
--- /dev/null
+++ b/odbc/Driver/KO_Config.cpp
@@ -0,0 +1,677 @@
+#include "stdafx.h"
+
+#include "StringUtils.h"
+
+#include <stdio.h>
+#include <resource.h>
+#include <REST.h>
+
+#define SERVERKEY "SERVER"
+#define PORTKEY "PORT"
+#define UIDKEY "UID"
+#define PWDKEY "PWD"
+#define PROJECTKEY "PROJECT"
+
+#define BUFFERSIZE 256
+
+#define INITFILE "ODBC.INI"
+#define INSTINIFILE "ODBCINST.INI"
+
+#define DRIVER_NAME "KylinODBCDriver"
+#define DRIVER_DEFAULT_LOCATION "C:\\Program Files (x86)\\kylinolap\\KylinODBCDriver\\driver.dll"
+
+static char currentDSN[BUFFERSIZE];
+
+static int GetValueFromODBCINI ( char* section, char* key, char* defaultValue, char* buffer, int bufferSize,
+                                 char* initFileName ) {
+    return SQLGetPrivateProfileString ( section, key, defaultValue, buffer, bufferSize, initFileName );
+}
+
+static BOOL SetValueInODBCINI ( char* section, char* key, char* newValue, char* initFileName ) {
+    return SQLWritePrivateProfileString ( section, key, newValue, initFileName );
+}
+
+static BOOL AddDSN ( char* dsnName ) {
+    return SQLWritePrivateProfileString ( "ODBC Data Sources", dsnName, "KylinODBCDriver", INITFILE );
+}
+
+static BOOL RemoveDSN ( char* dsnName ) {
+    BOOL temp = true;
+    temp = SQLWritePrivateProfileString ( dsnName, NULL, NULL, INITFILE );
+    return SQLWritePrivateProfileString ( "ODBC Data Sources", dsnName, NULL, INITFILE ) && temp;
+}
+
+void SetCurrentDSN ( char* connStr, char* logFunc ) {
+    currentDSN[0] = '\0';
+    Word pairCount = 0;
+    Word index = 0 ;
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s  : lparam: %s", logFunc, connStr ) );
+    ODBCKV* pKV = NULL;
+    
+    if ( connStr == NULL || CvtStrToKeyValues ( connStr, -1, &pairCount, &pKV ) != GOOD ) {
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s: failed to parse the attribute string %s", logFunc, connStr ) );
+    }
+    
+    else {
+        if ( FindInKeyValues ( "DSN", NULL, pKV, pairCount, &index ) != true ) {
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s: failed to find the DSN attribute in %s", logFunc, connStr ) );
+        }
+        
+        else {
+            strcpy ( currentDSN, pKV[index].value );
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s: success to set the currentDSN: %s", logFunc, currentDSN ) );
+        }
+        
+        FreeGenODBCKeyValues ( pKV, pairCount );
+        delete[] pKV;
+    }
+}
+
+static eGoodBad LoadODBCINIDataToDlgDSNCfg2 ( HWND hDlg ) {
+    BOOL    x;
+    char buffer[BUFFERSIZE];
+    
+    // precaution
+    if ( !hDlg ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "LoadODBCINIDataToDlgDSNCfg2 - Bad params: hDlg is NULL" ) );
+        return BAD;
+    }
+    
+    // DSN name
+    x = SetDlgItemText ( hDlg, IDC_DSNNAME, currentDSN );
+    
+    if ( !x )  { return BAD; }
+    
+    // server name/IP
+    GetValueFromODBCINI ( currentDSN, SERVERKEY, "", buffer, BUFFERSIZE, INITFILE );
+    x = SetDlgItemText ( hDlg, IDC_SERVER, buffer );
+    
+    if ( !x )  { return BAD; }
+    
+    // server port
+    GetValueFromODBCINI ( currentDSN, PORTKEY, "443", buffer, BUFFERSIZE, INITFILE );
+    int portTemp = atoi ( buffer );
+    
+    if ( portTemp == 0 )
+    { portTemp = 443; }
+    
+    x = SetDlgItemInt ( hDlg, IDC_PORT, portTemp, FALSE );
+    
+    if ( !x )  { return BAD; }
+    
+    // user name
+    GetValueFromODBCINI ( currentDSN, UIDKEY, "", buffer, BUFFERSIZE, INITFILE );
+    x = SetDlgItemText ( hDlg, IDC_UID, buffer );
+    
+    if ( !x )  { return BAD; }
+    
+    // password
+    GetValueFromODBCINI ( currentDSN, PWDKEY, "", buffer, BUFFERSIZE, INITFILE );
+    x = SetDlgItemText ( hDlg, IDC_PWD, buffer );
+    
+    if ( !x )  { return BAD; }
+    
+    return GOOD;
+}
+
+static eGoodBad RetriveDlgData ( HWND hDlg, char* newDSN, char* serverStr, char* uidStr, char* pwdStr, long* port ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Start retrieving the configs..." ) );
+    Long x;
+    
+    if ( !hDlg ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "RetriveDlgData - Bad params: hDlg is NULL" ) );
+        return BAD;
+    }
+    
+    x = SendDlgItemMessage ( hDlg, IDC_DSNNAME, EM_LINELENGTH, 0, 0 );       // get text from dialog
+    
+    if ( x > 0 ) {
+        GetDlgItemText ( hDlg, IDC_DSNNAME, newDSN, BUFFERSIZE );        // get text from dialog
+    }
+    
+    else {
+        newDSN[0] = '\0';
+    }
+    
+    ////// server name/IP
+    // get length of input text
+    x = SendDlgItemMessage ( hDlg, IDC_SERVER, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        GetDlgItemText ( hDlg, IDC_SERVER, serverStr, BUFFERSIZE );        // get text from dialog
+    }
+    
+    else {
+        serverStr[0] = '\0';
+    }
+    
+    /////  Port
+    // get value
+    *port = GetDlgItemInt ( hDlg, IDC_PORT, NULL, FALSE );
+    ////// User name
+    // get length
+    x = SendDlgItemMessage ( hDlg, IDC_UID, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        // allocate space
+        GetDlgItemText ( hDlg, IDC_UID, uidStr, BUFFERSIZE );
+    }
+    
+    else {
+        uidStr[0] = '\0';
+    }
+    
+    ////// Password
+    // get length
+    x = SendDlgItemMessage ( hDlg, IDC_PWD, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        GetDlgItemText ( hDlg, IDC_PWD, pwdStr, BUFFERSIZE );
+    }
+    
+    else {
+        pwdStr[0] = '\0';
+    }
+    
+    trimwhitespace ( newDSN );
+    trimwhitespace ( serverStr );
+    trimwhitespace ( uidStr );
+    trimwhitespace ( pwdStr );
+    
+    if ( strlen ( newDSN ) == 0 ) {
+        __ODBCPopMsg ( "DSN name cannot be empty" );
+        return BAD;
+    }
+    
+    if ( strlen ( serverStr ) == 0 ) {
+        __ODBCPopMsg ( "Server cannot be empty" );
+        return BAD;
+    }
+    
+    if ( strlen ( uidStr ) == 0 ) {
+        __ODBCPopMsg ( "Username cannot be empty" );
+        return BAD;
+    }
+    
+    if ( strlen ( pwdStr ) == 0 ) {
+        __ODBCPopMsg ( "Password cannot be empty" );
+        return BAD;
+    }
+    
+    if ( port == 0 ) {
+        __ODBCPopMsg ( "Port cannot be 0" );
+        return BAD;
+    }
+    
+    return GOOD;
+}
+
+static pODBCConn createConn() {
+    pODBCConn    conn;
+    // allocate a conn
+    conn = new ODBCConn;
+    // clear the conn attributes
+    memset ( conn, 0, sizeof ( ODBCConn ) );
+    // set the handle signature
+    ( ( pODBCConn ) conn )->Sign = SQL_HANDLE_DBC;
+    // default values
+    ( ( pODBCConn ) conn )->AccessMode      = SQL_MODE_READ_ONLY;
+    ( ( pODBCConn ) conn )->AutoIPD         = SQL_FALSE;
+    ( ( pODBCConn ) conn )->AsyncEnable     = SQL_ASYNC_ENABLE_OFF;
+    ( ( pODBCConn ) conn )->AutoCommit      = SQL_AUTOCOMMIT_ON;
+    ( ( pODBCConn ) conn )->TimeOut         = 0;
+    ( ( pODBCConn ) conn )->LoginTimeOut    = 0;
+    ( ( pODBCConn ) conn )->MetaDataID      = SQL_FALSE;
+    ( ( pODBCConn ) conn )->ODBCCursors     = SQL_CUR_USE_DRIVER;
+    ( ( pODBCConn ) conn )->Window          = NULL;
+    ( ( pODBCConn ) conn )->TxnIsolation    = 0;
+    ( ( pODBCConn ) conn )->MaxRows         = 0;
+    ( ( pODBCConn ) conn )->QueryTimeout    = 0;
+    ( ( pODBCConn ) conn )->Server = new char[BUFFERSIZE];
+    ( ( pODBCConn ) conn )->UserName = new char[BUFFERSIZE];
+    ( ( pODBCConn ) conn )->Password = new char[BUFFERSIZE];
+    ( ( pODBCConn ) conn )->Project = new char[BUFFERSIZE];
+    return conn;
+}
+
+static eGoodBad testGetMetadata ( char* serverStr, char* uidStr, char* pwdStr, long port, char* project ) {
+    pODBCConn    conn = createConn();
+    strcpy ( ( ( pODBCConn ) conn )->Server, serverStr );
+    strcpy ( ( ( pODBCConn ) conn )->UserName, uidStr );
+    strcpy ( ( ( pODBCConn ) conn )->Password, pwdStr );
+    strcpy ( ( ( pODBCConn ) conn )->Project, project );
+    ( ( pODBCConn ) conn )->ServerPort = port;
+    RETCODE ret = TryFetchMetadata ( conn );
+    _SQLFreeDiag ( _DIAGCONN ( conn ) );
+    // disconnect
+    _SQLDisconnect ( conn );
+    // now free the structure itself
+    delete conn;
+    
+    if ( ret == SQL_ERROR ) {
+        //validation of data & other prompts goes here
+        __ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
+        return BAD;
+    }
+    
+    return GOOD;
+}
+
+static eGoodBad testConnection ( char* serverStr, char* uidStr, char* pwdStr, long port ) {
+    pODBCConn    conn = createConn();
+    strcpy ( ( ( pODBCConn ) conn )->Server, serverStr );
+    strcpy ( ( ( pODBCConn ) conn )->UserName, uidStr );
+    strcpy ( ( ( pODBCConn ) conn )->Password, pwdStr );
+    ( ( pODBCConn ) conn )->ServerPort = port;
+    RETCODE ret = TryAuthenticate ( conn );
+    _SQLFreeDiag ( _DIAGCONN ( conn ) );
+    // disconnect
+    _SQLDisconnect ( conn );
+    // now free the structure itself
+    delete conn;
+    
+    if ( ret == SQL_ERROR ) {
+        //validation of data & other prompts goes here
+        __ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
+        return BAD;
+    }
+    
+    return GOOD;
+}
+
+static eGoodBad SaveConfigToODBCINI ( char* newDSN, char* serverStr, char* uidStr, char* pwdStr, long port,
+                                      char* projectStr ) {
+    char portStrBuffer[BUFFERSIZE];
+    SetValueInODBCINI ( newDSN, SERVERKEY, serverStr, INITFILE );
+    SetValueInODBCINI ( newDSN, PORTKEY, _itoa ( port, portStrBuffer, 10 ), INITFILE );
+    SetValueInODBCINI ( newDSN, UIDKEY, uidStr, INITFILE );
+    SetValueInODBCINI ( newDSN, PWDKEY, pwdStr, INITFILE );
+    SetValueInODBCINI ( newDSN, PROJECTKEY, projectStr, INITFILE );
+    
+    //If a new dsn name comes, add a new entry in regedit
+    if ( _stricmp ( newDSN, currentDSN ) != 0 ) {
+        AddDSN ( newDSN );
+        
+        //it is a dsn renaming
+        if ( strlen ( currentDSN ) != 0 ) {
+            RemoveDSN ( currentDSN );
+        }
+    }
+    
+    strcpy ( currentDSN, newDSN );
+    char temp[BUFFERSIZE];
+    GetValueFromODBCINI ( DRIVER_NAME, "Driver", DRIVER_DEFAULT_LOCATION, temp, BUFFERSIZE, INSTINIFILE );
+    SetValueInODBCINI ( currentDSN, "Driver", temp, INITFILE );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Finish saving the configurations to ODBC INI" ) );
+    return GOOD;
+}
+
+static eGoodBad RetriveDlgDataToODBCINI ( HWND hDlg, bool onlyTest ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Start retrieving the configurations to ODBC INI" ) );
+    Long x, port;
+    char newDSN[BUFFERSIZE];
+    char serverStr[BUFFERSIZE];
+    char uidStr[BUFFERSIZE];
+    char pwdStr[BUFFERSIZE];
+    char portStrBuffer[BUFFERSIZE];
+    
+    if ( !hDlg ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "RetriveDlgDataToODBCINI - Bad params: hDlg is NULL" ) );
+        return BAD;
+    }
+    
+    x = SendDlgItemMessage ( hDlg, IDC_DSNNAME, EM_LINELENGTH, 0, 0 );       // get text from dialog
+    
+    if ( x > 0 ) {
+        GetDlgItemText ( hDlg, IDC_DSNNAME, newDSN, BUFFERSIZE );        // get text from dialog
+    }
+    
+    else {
+        newDSN[0] = '\0';
+    }
+    
+    ////// server name/IP
+    // get length of input text
+    x = SendDlgItemMessage ( hDlg, IDC_SERVER, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        GetDlgItemText ( hDlg, IDC_SERVER, serverStr, BUFFERSIZE );        // get text from dialog
+    }
+    
+    else {
+        serverStr[0] = '\0';
+    }
+    
+    /////  Port
+    // get value
+    port = GetDlgItemInt ( hDlg, IDC_PORT, NULL, FALSE );
+    ////// User name
+    // get length
+    x = SendDlgItemMessage ( hDlg, IDC_UID, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        // allocate space
+        GetDlgItemText ( hDlg, IDC_UID, uidStr, BUFFERSIZE );
+    }
+    
+    else {
+        uidStr[0] = '\0';
+    }
+    
+    ////// Password
+    // get length
+    x = SendDlgItemMessage ( hDlg, IDC_PWD, EM_LINELENGTH, 0, 0 );
+    
+    if ( x > 0 ) {
+        GetDlgItemText ( hDlg, IDC_PWD, pwdStr, BUFFERSIZE );
+    }
+    
+    else {
+        pwdStr[0] = '\0';
+    }
+    
+    trimwhitespace ( newDSN );
+    trimwhitespace ( serverStr );
+    trimwhitespace ( uidStr );
+    trimwhitespace ( pwdStr );
+    
+    if ( strlen ( newDSN ) == 0 ) {
+        __ODBCPopMsg ( "DSN name cannot be empty" );
+        return BAD;
+    }
+    
+    if ( strlen ( serverStr ) == 0 ) {
+        __ODBCPopMsg ( "Server cannot be empty" );
+        return BAD;
+    }
+    
+    if ( strlen ( uidStr ) == 0 ) {
+        __ODBCPopMsg ( "Username cannot be empty" );
+        return BAD;
+    }
+    
+    if ( strlen ( pwdStr ) == 0 ) {
+        __ODBCPopMsg ( "Password cannot be empty" );
+        return BAD;
+    }
+    
+    if ( port == 0 ) {
+        __ODBCPopMsg ( "Port cannot be 0" );
+        return BAD;
+    }
+    
+    if ( onlyTest ) {
+        pODBCConn    conn;
+        // allocate a conn
+        conn = new ODBCConn;
+        // clear the conn attributes
+        memset ( conn, 0, sizeof ( ODBCConn ) );
+        // set the handle signature
+        ( ( pODBCConn ) conn )->Sign = SQL_HANDLE_DBC;
+        // default values
+        ( ( pODBCConn ) conn )->AccessMode      = SQL_MODE_READ_ONLY;
+        ( ( pODBCConn ) conn )->AutoIPD         = SQL_FALSE;
+        ( ( pODBCConn ) conn )->AsyncEnable     = SQL_ASYNC_ENABLE_OFF;
+        ( ( pODBCConn ) conn )->AutoCommit      = SQL_AUTOCOMMIT_ON;
+        ( ( pODBCConn ) conn )->TimeOut         = 0;
+        ( ( pODBCConn ) conn )->LoginTimeOut    = 0;
+        ( ( pODBCConn ) conn )->MetaDataID      = SQL_FALSE;
+        ( ( pODBCConn ) conn )->ODBCCursors     = SQL_CUR_USE_DRIVER;
+        ( ( pODBCConn ) conn )->Window          = NULL;
+        ( ( pODBCConn ) conn )->TxnIsolation    = 0;
+        ( ( pODBCConn ) conn )->MaxRows         = 0;
+        ( ( pODBCConn ) conn )->QueryTimeout    = 0;
+        ( ( pODBCConn ) conn )->Server = new char[BUFFERSIZE];
+        ( ( pODBCConn ) conn )->UserName = new char[BUFFERSIZE];
+        ( ( pODBCConn ) conn )->Password = new char[BUFFERSIZE];
+        strcpy ( ( ( pODBCConn ) conn )->Server, serverStr );
+        strcpy ( ( ( pODBCConn ) conn )->UserName, uidStr );
+        strcpy ( ( ( pODBCConn ) conn )->Password, pwdStr );
+        ( ( pODBCConn ) conn )->ServerPort = port;
+        RETCODE ret = TryAuthenticate ( conn );
+        _SQLFreeDiag ( _DIAGCONN ( conn ) );
+        // disconnect
+        _SQLDisconnect ( conn );
+        // now free the structure itself
+        delete conn;
+        
+        if ( ret == SQL_ERROR ) {
+            //validation of data & other prompts goes here
+            __ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
+            return BAD;
+        }
+        
+        return GOOD;
+    }
+    
+    SetValueInODBCINI ( newDSN, SERVERKEY, serverStr, INITFILE );
+    SetValueInODBCINI ( newDSN, PORTKEY, _itoa ( port, portStrBuffer, 10 ), INITFILE );
+    SetValueInODBCINI ( newDSN, UIDKEY, uidStr, INITFILE );
+    SetValueInODBCINI ( newDSN, PWDKEY, pwdStr, INITFILE );
+    
+    //If a new dsn name comes, add a new entry in regedit
+    if ( _stricmp ( newDSN, currentDSN ) != 0 ) {
+        AddDSN ( newDSN );
+        
+        //it is a dsn renaming
+        if ( strlen ( currentDSN ) != 0 ) {
+            RemoveDSN ( currentDSN );
+        }
+    }
+    
+    strcpy ( currentDSN, newDSN );
+    char temp[BUFFERSIZE];
+    GetValueFromODBCINI ( DRIVER_NAME, "Driver", DRIVER_DEFAULT_LOCATION, temp, BUFFERSIZE, INSTINIFILE );
+    SetValueInODBCINI ( currentDSN, "Driver", temp, INITFILE );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Finish saving the configurations to ODBC INI" ) );
+    return GOOD;
+}
+
+
+eGoodBad  LoadODBCINIDataToConn ( pODBCConn pConn ) {
+    Long    x;
+    char buffer[BUFFERSIZE];
+    int c;
+    
+    // note
+    // no error handling is currently being done for
+    // GetDlgItemText/GetDlgItemInt/SetConnProp
+    // generally should not be a problem
+    
+    // precaution
+    if ( !pConn ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "GetDataFromDlgDSNCfg1 - Bad params: pConn is NULL" ) );
+        return BAD;
+    }
+    
+    ////// server name/IP
+    c = GetValueFromODBCINI ( currentDSN, SERVERKEY, "", buffer, BUFFERSIZE, INITFILE );
+    
+    if ( c <= 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
+        return BAD;
+    }
+    
+    // set value in struct
+    SetConnProp ( pConn, CONN_PROP_SERVER, buffer );
+    /////  Port
+    c = GetValueFromODBCINI ( currentDSN, PORTKEY, "", buffer, BUFFERSIZE, INITFILE );
+    
+    if ( c <= 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
+        return BAD;
+    }
+    
+    x = atoi ( buffer );
+    // set value in struct
+    SetConnProp ( pConn, CONN_PROP_PORT, &x );
+    ////// User name
+    c = GetValueFromODBCINI ( currentDSN, UIDKEY, "", buffer, BUFFERSIZE, INITFILE );
+    
+    if ( c <= 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
+        return BAD;
+    }
+    
+    // set value in struct
+    SetConnProp ( pConn, CONN_PROP_UID, buffer );
+    ////// Password
+    c = GetValueFromODBCINI ( currentDSN, PWDKEY, "", buffer, BUFFERSIZE, INITFILE );
+    
+    if ( c <= 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
+        return BAD;
+    }
+    
+    // set value in struct
+    SetConnProp ( pConn, CONN_PROP_PWD, buffer );
+    ////// Project
+    c = GetValueFromODBCINI ( currentDSN, PROJECTKEY, "", buffer, BUFFERSIZE, INITFILE );
+    
+    if ( c <= 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
+        return BAD;
+    }
+    
+    // set value in struct
+    SetConnProp ( pConn, CONN_PROP_PROJECT, buffer );
+    return GOOD;
+}
+
+INT_PTR CALLBACK DlgDSNCfg2Proc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
+    char* attributes = ( char* ) lParam;
+    Long                      port;
+    char        newDSN[BUFFERSIZE];
+    char     serverStr[BUFFERSIZE];
+    char        uidStr[BUFFERSIZE];
+    char        pwdStr[BUFFERSIZE];
+    
+    switch ( uMsg ) {
+        case WM_INITDIALOG:
+            SetCurrentDSN ( attributes, "DlgDSNCfg2Proc" );
+            // store the structure for future use
+            SetWindowLongPtr ( hDlg, DWLP_USER, lParam );
+            
+            // initialize the dialog with data from REGEDIT
+            if ( LoadODBCINIDataToDlgDSNCfg2 ( hDlg ) != GOOD )
+            { return false; }
+            
+            // set focus automatically
+            return TRUE;
+            
+        case WM_COMMAND:
+            switch ( LOWORD ( wParam ) ) {
+                case IDC_BTEST: {
+                        if ( RetriveDlgData ( hDlg, newDSN, serverStr, uidStr, pwdStr, &port ) == GOOD ) {
+                            if ( testConnection ( serverStr, uidStr, pwdStr, port ) == GOOD ) {
+                                HWND hwndCombo = GetDlgItem ( hDlg, IDC_COMBO1 );
+                                HWND hwndOK = GetDlgItem ( hDlg, IDOK );
+                                //passed verification
+                                EnableWindow ( hwndCombo, TRUE );
+                                
+                                try {
+                                    std::vector<string> projects;
+                                    restListProjects ( serverStr, port, uidStr, pwdStr, projects );
+                                    
+                                    for ( unsigned int i = 0 ; i < projects.size(); ++i ) {
+                                        SendMessage ( hwndCombo, ( UINT ) CB_ADDSTRING, ( WPARAM ) 0, ( LPARAM ) projects.at ( i ).c_str() );
+                                    }
+                                    
+                                    SendMessage ( hwndCombo, CB_SETCURSEL, ( WPARAM ) 0, ( LPARAM ) 0 );
+                                }
+                                
+                                catch ( exception& e ) {
+                                    stringstream ss;
+                                    ss << "Getting project list failed with error: " << e.what();
+                                    __ODBCPopMsg ( ss.str().c_str() );
+                                    return FALSE;
+                                }
+                                
+                                EnableWindow ( hwndOK, TRUE );
+                                return TRUE;
+                            }
+                            
+                            else {
+                                __ODBCPopMsg ( "testConnection failed." );
+                            }
+                        }
+                        
+                        else {
+                            __ODBCPopMsg ( "RetriveDlgData failed." );
+                        }
+                        
+                        return FALSE;
+                    }
+                    
+                case IDOK: {
+                        HWND hwndCombo = GetDlgItem ( hDlg, IDC_COMBO1 );
+                        int ItemIndex = SendMessage ( ( HWND ) hwndCombo, ( UINT ) CB_GETCURSEL,
+                                                      ( WPARAM ) 0, ( LPARAM ) 0 );
+                        TCHAR  projectName[256];
+                        ( TCHAR ) SendMessage ( ( HWND ) hwndCombo, ( UINT ) CB_GETLBTEXT,
+                                                ( WPARAM ) ItemIndex, ( LPARAM ) projectName );
+                                                
+                        if ( RetriveDlgData ( hDlg, newDSN, serverStr, uidStr, pwdStr, &port ) == GOOD ) {
+                            if ( testGetMetadata ( serverStr, uidStr, pwdStr, port, projectName ) == GOOD ) {
+                                SaveConfigToODBCINI ( newDSN, serverStr, uidStr, pwdStr, port, projectName );
+                                EndDialog ( hDlg, wParam );
+                                return TRUE;
+                            }
+                        }
+                        
+                        return FALSE;
+                    }
+                    
+                case IDCANCEL:
+                    // indicate end with control id as return value
+                    EndDialog ( hDlg, wParam );
+                    return TRUE;
+            }
+    }
+    
+    return FALSE;
+}
+
+
+BOOL INSTAPI ConfigDSN ( HWND    hwndParent, WORD    fRequest, LPCSTR  lpszDriver, LPCSTR  lpszAttributes ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ConfigDSN %s is called %s, the fRequest is: %d", lpszDriver, lpszAttributes,
+                              fRequest ) );
+                              
+    if ( fRequest == ODBC_REMOVE_DSN ) {
+        SetCurrentDSN ( ( char* ) lpszAttributes, "ConfigDSN" );
+        
+        if ( strlen ( currentDSN ) <= 0 ) {
+            __ODBCPOPMSG ( _ODBCPopMsg ( "The DSN name is not defined in the connection string!" ) );
+            return false;
+        }
+        
+        BOOL ret = TRUE;
+        ret = RemoveDSN ( currentDSN );
+        
+        if ( !ret ) {
+            __ODBCPOPMSG ( _ODBCPopMsg ( "The DSN is not found, removal failed!" ) );
+            return false;
+        }
+        
+        return true;
+    }
+    
+    //else is ODBC_CONFIG_DSN or ODBC_ADD_DSN
+    int     i;
+    i = DialogBoxParam ( ghInstDLL, MAKEINTRESOURCE ( IDD_DSN_CFG2 ), NULL, DlgDSNCfg2Proc, ( LPARAM ) lpszAttributes );
+    
+    // check status
+    switch ( i ) {
+        case IDOK:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "User click OK button on DSN config" ) );
+            return true;           // complete
+            
+        default:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "User click Cancel button on DSN config" ) );
+            return false;           // user-cancelled
+    }
+    
+    return true;
+}
+
+


[08/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_INFO.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_INFO.CPP b/odbc/Driver/KO_INFO.CPP
new file mode 100644
index 0000000..cc8356d
--- /dev/null
+++ b/odbc/Driver/KO_INFO.CPP
@@ -0,0 +1,1152 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_INFO.CPP
+//
+// Purpose: This file is dedicated to the single function SQLGetInfo.
+//          Almost all information about your driver, server
+//          and current state required by the client is obtained
+//          using this function. Most of the values need to be
+//          changed to values as per your server. I believe
+//          that you will not require to query your server for
+//          most information, but u can do that if u like your
+//          driver to be more flexible.
+//
+//          Some info like current database ofcourse needs to be
+//          queried live from the server. Clients like MS Word,
+//          SQL server use a whole bunch of info from this function.
+//          You have to go thru each attribute and provide
+//          the info.
+//
+//          Another function SQLGetTypeInfo is implemented in this
+//          file. This function is a catalog function used to obtain
+//          the data types supported by the server and the associated
+//          details required by the client to interpret them correctly.
+//          This function does an Rest call to the server to obtain the
+//          details at the very beginning of SQLConnect
+//
+//
+// Exported functions:
+//                       SQLGetInfo
+//                       SQLGetTypeInfo
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+// -----------------------------------------------------------------------
+// to get driver related information
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetInfoW ( SQLHDBC                    pConn,
+                              SQLUSMALLINT                pInfoType,
+                              SQLPOINTER                  pInfoValuePtr,
+                              SQLSMALLINT                 pBufferLength,
+                              SQLSMALLINT*                pStringLengthPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetInfoW called: Field: %d, Length: %d", pInfoType, pBufferLength ) );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    // check the info required
+    // check this page for detailed http://msdn.microsoft.com/en-us/library/ms711681(v=vs.85).aspx
+    switch ( pInfoType ) {
+        case SQL_COLUMN_ALIAS://87 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_CONVERT_FUNCTIONS ://48 called
+            break;
+            
+        case SQL_MAX_IDENTIFIER_LEN : //10005 called
+            break;
+            
+        case SQL_ODBC_INTERFACE_CONFORMANCE://152 called
+            break;
+            
+        case SQL_SQL_CONFORMANCE: //118 called
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the SQL-92 datetime literals supported by the data source. Note that these are the datetime literals listed in the SQL-92 specification and are separate from the datetime literal escape clauses defined by ODBC. For more information about the ODBC datetime literal escape clauses, see Date, Time, and Timestamp Literals.
+            A FIPS Transitional level�Cconformant driver will always return the "1" value in the bitmask for the bits in the following list. A value of "0" means that SQL-92 datetime literals are not supported.
+            The following bitmasks are used to determine which literals are supported:
+            SQL_DL_SQL92_DATESQL_DL_SQL92_TIMESQL_DL_SQL92_TIMESTAMPSQL_DL_SQL92_INTERVAL_YEARSQL_DL_SQL92_INTERVAL_MONTHSQL_DL_SQL92_INTERVAL_DAYSQL_DL_SQL92_INTERVAL_HOURSQL_DL_SQL92_INTERVAL_MINUTESQL_DL_SQL92_INTERVAL_SECONDSQL_DL_SQL92_INTERVAL_YEAR_TO_MONTHSQL_DL_SQL92_INTERVAL_DAY_TO_HOUR
+            SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTESQL_DL_SQL92_INTERVAL_DAY_TO_SECONDSQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTESQL_DL_SQL92_INTERVAL_HOUR_TO_SECONDSQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND
+        */
+        case SQL_DATETIME_LITERALS: //119 called
+            //assuming all datetime literals are supported
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_DL_SQL92_DATE                       |
+                SQL_DL_SQL92_TIME                       |
+                SQL_DL_SQL92_TIMESTAMP                  |
+                SQL_DL_SQL92_INTERVAL_YEAR              |
+                SQL_DL_SQL92_INTERVAL_MONTH             |
+                SQL_DL_SQL92_INTERVAL_DAY               |
+                SQL_DL_SQL92_INTERVAL_HOUR              |
+                SQL_DL_SQL92_INTERVAL_MINUTE            |
+                SQL_DL_SQL92_INTERVAL_SECOND            |
+                SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR       |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND     |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE    |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND    |
+                SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND  ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPADD scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.SQL_DATETIME_LITERALS(ODBC 3.0)
+        */
+        case SQL_TIMEDATE_ADD_INTERVALS : // 109 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPDIFF scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.
+        */
+        case SQL_TIMEDATE_DIFF_INTERVALS : //110 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        case SQL_AGGREGATE_FUNCTIONS: //169 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_AF_ALL | SQL_AF_AVG | SQL_AF_COUNT | SQL_AF_DISTINCT | SQL_AF_MAX | SQL_AF_MIN |
+                                            SQL_AF_SUM ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the datetime scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+            The following bitmasks are used to determine which datetime functions are supported:
+            SQL_SDF_CURRENT_DATESQL_SDF_CURRENT_TIMESQL_SDF_CURRENT_TIMESTAMP
+        */
+        case SQL_SQL92_DATETIME_FUNCTIONS: //155 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_SDF_CURRENT_DATE                |
+                SQL_SDF_CURRENT_TIME                |
+                SQL_SDF_CURRENT_TIMESTAMP           ;
+            break;
+            
+        case SQL_SQL92_VALUE_EXPRESSIONS: //165 called
+            break;
+            
+        case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS: //159 called
+            break;
+            
+        case SQL_SQL92_STRING_FUNCTIONS: //164 called
+            break;
+            
+        case SQL_SQL92_PREDICATES                    : //160 called
+            break;
+            
+        case SQL_SQL92_RELATIONAL_JOIN_OPERATORS   : //161 called
+            break;
+            
+        case SQL_DRIVER_ODBC_VER:                           // 77 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "03.00", -1 );
+            //*pStringLengthPtr = *pStringLengthPtr *2;
+            break;
+            
+        case SQL_CURSOR_COMMIT_BEHAVIOR:  //23 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_COMMIT_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_CORRELATION_NAME:  //74
+            //MessageBox ( GetDesktopWindow(), "SQL_CORRELATION_NAME", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CN_ANY;
+            break;
+            
+        case SQL_MAX_CONCURRENT_ACTIVITIES:                     // 1
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_MAX_CONCURRENT_ACTIVITIES", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = 2; }
+            
+            break;
+            
+        case SQL_ODBC_API_CONFORMANCE:                          // 9
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_ODBC_API_CONFORMANCE", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = SQL_OAC_NONE; }    // for MS Access
+            
+            break;
+            
+        case SQL_DATA_SOURCE_READ_ONLY:                         // 25
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_READ_ONLY", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_DRIVER_NAME:                                   // 6 //called by tb
+            //MessageBox ( GetDesktopWindow(), "SQL_DRIVER_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "driver.DLL", -1 );
+            break;
+            
+        case SQL_SEARCH_PATTERN_ESCAPE:                         // 14
+            //MessageBox ( GetDesktopWindow(), "SQL_SEARCH_PATTERN_ESCAPE", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\\", -1 );
+            break;
+            
+        case SQL_NON_NULLABLE_COLUMNS:                          // 75
+            //MessageBox ( GetDesktopWindow(), "SQL_NON_NULLABLE_COLUMNS", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_NNC_NULL;
+            break;
+            
+        case SQL_QUALIFIER_NAME_SEPARATOR:                      // 41 called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_NAME_SEPARATOR", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, ".", -1 );
+            break;
+            
+        case SQL_FILE_USAGE:                                    // 84
+            //MessageBox ( GetDesktopWindow(), "SQL_FILE_USAGE", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_FILE_NOT_SUPPORTED;
+            break;
+            
+        case SQL_QUALIFIER_TERM:                                // 42  // SQL_CATALOG_TERM: called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_TERM", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "database", -1 );
+            break;
+            
+        case SQL_OWNER_TERM:                                    // 39 //called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "owner", -1 );
+            break;
+            
+        case SQL_TABLE_TERM:                                    // 45 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "table", -1 );
+            break;
+            
+        case SQL_CURSOR_ROLLBACK_BEHAVIOR:                      // 24 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_ROLLBACK_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_DATA_SOURCE_NAME:                              // 2
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "GODBC", -1 );
+            break;
+            
+        case 16:
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_PROCEDURES:                                    // 21
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_IDENTIFIER_QUOTE_CHAR:                         // 29  //called by tb
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\"", -1 );
+            break;
+            
+        case SQL_MAX_SCHEMA_NAME_LEN:
+            * ( ( short* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_USER_NAME:
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_POS_OPERATIONS:                                // 79
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_POS_POSITION;
+            break;
+            
+        case SQL_STATIC_SENSITIVITY:                            // 83
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SS_ADDITIONS;
+            break;
+            
+        case SQL_LOCK_TYPES:                                    // 78
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_LCK_NO_CHANGE;
+            break;
+            
+        case SQL_GETDATA_EXTENSIONS:                            // 81 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_GD_ANY_COLUMN;
+            break;
+            
+        case SQL_TXN_ISOLATION_OPTION:                          // 72
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_SERIALIZABLE;
+            break;
+            
+        case SQL_BOOKMARK_PERSISTENCE:                          // 82
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            break;
+            
+        case SQL_SCROLL_OPTIONS:                                // 44
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SO_FORWARD_ONLY;
+            break;
+            
+        case SQL_SCROLL_CONCURRENCY:                            // 43
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SCCO_READ_ONLY;
+            break;
+            
+        case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:                    // 144
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES1:                     // 150
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES1:                     // 167
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:               // 146
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES2:                     // 151
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES2:                     // 168
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_NEED_LONG_DATA_LEN:                            // 111
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_TXN_CAPABLE:                                   // 46 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_TC_NONE;
+            break;
+            
+        case SQL_DEFAULT_TXN_ISOLATION:                         // 26
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_READ_COMMITTED;
+            break;
+            
+        case SQL_DBMS_NAME:                                     // 17 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Gen ODBC Server", -1 );
+            break;
+            
+        case SQL_ODBC_SQL_CONFORMANCE:                          // 15
+            // deprecated
+            * ( ( Word* ) pInfoValuePtr ) = SQL_OSC_MINIMUM;
+            break;
+            
+        case SQL_INTEGRITY:                                     // 73
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_QUALIFIER_USAGE:                               // 92 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CU_DML_STATEMENTS | SQL_CU_PROCEDURE_INVOCATION | SQL_CU_TABLE_DEFINITION;
+            break;
+            
+        case SQL_DBMS_VER:                                      // 18 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            break;
+            
+        case SQL_QUOTED_IDENTIFIER_CASE:                        // 93 called
+            //*(( Word* )pInfoValuePtr) = SQL_IC_SENSITIVE;
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_UPPER;
+            break;
+            
+        case SQL_MAX_CATALOG_NAME_LEN:                          // 34
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_MAX_TABLE_NAME_LEN:                            // 35
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_ACTIVE_CONNECTIONS:                            // 0
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACTIVE_CONNECTIONS" ));
+            break;
+            
+        case SQL_CATALOG_LOCATION:                              // 114
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CL_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CATALOG_LOCATION" ));
+            break;
+            
+        case SQL_CONCAT_NULL_BEHAVIOR:                           // 22
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CB_NULL;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CONCAT_NULL_BEHAVIOR" ));
+            break;
+            
+        case SQL_GROUP_BY:                                      // 88
+            * ( ( Word* ) pInfoValuePtr ) = SQL_GB_GROUP_BY_EQUALS_SELECT;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_GROUP_BY" ));
+            break;
+            
+        case SQL_IDENTIFIER_CASE:                               // 28
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_MIXED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_IDENTIFIER_CASE" ));
+            break;
+            
+        case SQL_MAX_INDEX_SIZE:                                // 102
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_INDEX_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE:                                  // 104
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:                    // 103
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE_INCLUDES_LONG" ));
+            break;
+            
+        case SQL_MAX_TABLES_IN_SELECT:                          // 106
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_TABLES_IN_SELECT" ));
+            break;
+            
+        case SQL_NULL_COLLATION:                                // 85
+            * ( ( Word* ) pInfoValuePtr ) = SQL_NC_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NULL_COLLATION" ));
+            break;
+            
+        case SQL_ORDER_BY_COLUMNS_IN_SELECT:                    // 90
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ORDER_BY_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_PROCEDURE_TERM:                                // 40
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "procedure", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_PROCEDURE_TERM" ));
+            break;
+            
+        case SQL_OWNER_USAGE:                                   // 91 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_SU_DML_STATEMENTS | SQL_SU_TABLE_DEFINITION | SQL_SU_PRIVILEGE_DEFINITION;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OWNER_USAGE" ));
+            break;
+            
+        case SQL_SUBQUERIES:                                    // 95
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SQ_CORRELATED_SUBQUERIES |
+                                            SQL_SQ_COMPARISON |
+                                            SQL_SQ_EXISTS |
+                                            SQL_SQ_IN |
+                                            SQL_SQ_QUANTIFIED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SUBQUERIES" ));
+            break;
+            
+        case SQL_MULT_RESULT_SETS:                              // 36:
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MULT_RESULT_SETS" ));
+            break;
+            
+        case SQL_SERVER_NAME:                                   // 13
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16,
+                                ( ( pODBCConn ) pConn )->Server ? ( ( pODBCConn ) pConn )->Server : "", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SERVER_NAME" ));
+            break;
+            
+        case SQL_ACCESSIBLE_PROCEDURES:                         // 20
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_PROCEDURES" ));
+            break;
+            
+        case SQL_ACCESSIBLE_TABLES:                             // 19
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_TABLES" ));
+            break;
+            
+        case SQL_OJ_CAPABILITIES:                               // 115 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_OJ_LEFT |
+                                            SQL_OJ_RIGHT |
+                                            SQL_OJ_FULL |
+                                            SQL_OJ_NESTED |
+                                            SQL_OJ_NOT_ORDERED |
+                                            SQL_OJ_INNER |
+                                            SQL_OJ_ALL_COMPARISON_OPS;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OJ_CAPABILITIES" ));
+            break;
+            
+        case SQL_DRIVER_VER:                                    // 7 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_DRIVER_VER" ));
+            break;
+            
+        case SQL_LIKE_ESCAPE_CLAUSE:                            // 113
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_LIKE_ESCAPE_CLAUSE" ));
+            break;
+            
+        case SQL_SPECIAL_CHARACTERS:                            // 94 //called by tb
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "$_", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SPECIAL_CHARACTERS" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_GROUP_BY:                       // 97
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_GROUP_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_INDEX:                          // 98
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_INDEX" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_ORDER_BY:                       // 99
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_ORDER_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_SELECT:                         // 100
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_TABLE:                          // 101
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_TABLE" ));
+            break;
+            
+        case SQL_NUMERIC_FUNCTIONS:                             // 49 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard numeric functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NUMERIC_FUNCTIONS" ));
+            break;
+            
+        case SQL_OUTER_JOINS:                                   // 38
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            // __ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OUTER_JOINS" ));
+            break;
+            
+        case SQL_STRING_FUNCTIONS:                              // 50 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard string functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_STRING_FUNCTIONS" ));
+            break;
+            
+        case SQL_SYSTEM_FUNCTIONS:                              // 51 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SYSTEM_FUNCTIONS" ));
+            break;
+            
+        /*
+            Note: The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.
+            An SQLUINTEGER bitmask enumerating the scalar date and time functions supported by the driver and associated data source.
+            The following bitmasks are used to determine which date and time functions are supported:
+            SQL_FN_TD_CURRENT_DATE ODBC 3.0)SQL_FN_TD_CURRENT_TIME (ODBC 3.0)SQL_FN_TD_CURRENT_TIMESTAMP (ODBC 3.0)SQL_FN_TD_CURDATE (ODBC 1.0)SQL_FN_TD_CURTIME (ODBC 1.0) SQL_FN_TD_DAYNAME (ODBC 2.0)SQL_FN_TD_DAYOFMONTH (ODBC 1.0)SQL_FN_TD_DAYOFWEEK (ODBC 1.0)SQL_FN_TD_DAYOFYEAR (ODBC 1.0) SQL_FN_TD_EXTRACT (ODBC 3.0)SQL_FN_TD_HOUR (ODBC 1.0)SQL_FN_TD_MINUTE (ODBC 1.0)SQL_FN_TD_MONTH (ODBC 1.0)SQL_FN_TD_MONTHNAME (ODBC 2.0)SQL_FN_TD_NOW (ODBC 1.0)SQL_FN_TD_QUARTER (ODBC 1.0)SQL_FN_TD_SECOND (ODBC 1.0)SQL_FN_TD_TIMESTAMPADD (ODBC 2.0)SQL_FN_TD_TIMESTAMPDIFF (ODBC 2.0)SQL_FN_TD_WEEK (ODBC 1.0)SQL_FN_TD_YEAR (ODBC 1.0)
+        */
+        case SQL_TIMEDATE_FUNCTIONS:                            // 52 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                //SQL_FN_TD_CURRENT_DATE |
+                //SQL_FN_TD_CURRENT_TIME |
+                SQL_FN_TD_CURRENT_TIMESTAMP |
+                SQL_FN_TD_CURDATE |
+                SQL_FN_TD_CURTIME |
+                //SQL_FN_TD_DAYNAME |
+                //SQL_FN_TD_DAYOFMONTH |
+                //SQL_FN_TD_DAYOFWEEK |
+                //SQL_FN_TD_DAYOFYEAR |
+                SQL_FN_TD_EXTRACT
+                //SQL_FN_TD_HOUR |
+                //SQL_FN_TD_MINUTE |
+                //SQL_FN_TD_MONTH |
+                //SQL_FN_TD_MONTHNAME |
+                //SQL_FN_TD_NOW |
+                //SQL_FN_TD_QUARTER |
+                //SQL_FN_TD_SECOND |
+                //SQL_FN_TD_TIMESTAMPADD |
+                //SQL_FN_TD_TIMESTAMPDIFF |
+                //SQL_FN_TD_WEEK |
+                //SQL_FN_TD_YEAR
+                ;
+            break;
+            
+        default:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR,
+                                      "Function Missing!!! SQLGetInfoW, Field: %d, DataPtr: %d, BufLen: %d, SizePtr: %d\n",  pInfoType, pInfoValuePtr,
+                                      pBufferLength, pStringLengthPtr ) );
+    }
+    
+    if ( pStringLengthPtr ) {
+        *pStringLengthPtr = ( *pStringLengthPtr ) * 2;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+RETCODE SQL_API SQLGetInfo ( SQLHDBC         pConn,
+                             SQLUSMALLINT    pInfoType,
+                             SQLPOINTER      pInfoValuePtr,
+                             SQLSMALLINT     pBufferLength,
+                             SQLSMALLINT*    pStringLengthPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetInfo called: Field: %d, Length: %d", pInfoType, pBufferLength ) );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    // check the info required
+    switch ( pInfoType ) {
+        case SQL_COLUMN_ALIAS://87 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_CONVERT_FUNCTIONS ://48 called
+            break;
+            
+        case SQL_MAX_IDENTIFIER_LEN : //10005 called
+            break;
+            
+        case SQL_ODBC_INTERFACE_CONFORMANCE://152 called
+            break;
+            
+        case SQL_SQL_CONFORMANCE: //118 called
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the SQL-92 datetime literals supported by the data source. Note that these are the datetime literals listed in the SQL-92 specification and are separate from the datetime literal escape clauses defined by ODBC. For more information about the ODBC datetime literal escape clauses, see Date, Time, and Timestamp Literals.
+            A FIPS Transitional level�Cconformant driver will always return the "1" value in the bitmask for the bits in the following list. A value of "0" means that SQL-92 datetime literals are not supported.
+            The following bitmasks are used to determine which literals are supported:
+            SQL_DL_SQL92_DATESQL_DL_SQL92_TIMESQL_DL_SQL92_TIMESTAMPSQL_DL_SQL92_INTERVAL_YEARSQL_DL_SQL92_INTERVAL_MONTHSQL_DL_SQL92_INTERVAL_DAYSQL_DL_SQL92_INTERVAL_HOURSQL_DL_SQL92_INTERVAL_MINUTESQL_DL_SQL92_INTERVAL_SECONDSQL_DL_SQL92_INTERVAL_YEAR_TO_MONTHSQL_DL_SQL92_INTERVAL_DAY_TO_HOUR
+            SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTESQL_DL_SQL92_INTERVAL_DAY_TO_SECONDSQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTESQL_DL_SQL92_INTERVAL_HOUR_TO_SECONDSQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND
+        */
+        case SQL_DATETIME_LITERALS: //119 called
+            //assuming all datetime literals are supported
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_DL_SQL92_DATE                       |
+                SQL_DL_SQL92_TIME                       |
+                SQL_DL_SQL92_TIMESTAMP                  |
+                SQL_DL_SQL92_INTERVAL_YEAR              |
+                SQL_DL_SQL92_INTERVAL_MONTH             |
+                SQL_DL_SQL92_INTERVAL_DAY               |
+                SQL_DL_SQL92_INTERVAL_HOUR              |
+                SQL_DL_SQL92_INTERVAL_MINUTE            |
+                SQL_DL_SQL92_INTERVAL_SECOND            |
+                SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR       |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND     |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE    |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND    |
+                SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND  ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPADD scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.SQL_DATETIME_LITERALS(ODBC 3.0)
+        */
+        case SQL_TIMEDATE_ADD_INTERVALS : // 109 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPDIFF scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.
+        */
+        case SQL_TIMEDATE_DIFF_INTERVALS : //110 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        case SQL_AGGREGATE_FUNCTIONS: //169 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_AF_ALL | SQL_AF_AVG | SQL_AF_COUNT | SQL_AF_DISTINCT | SQL_AF_MAX | SQL_AF_MIN |
+                                            SQL_AF_SUM ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the datetime scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+            The following bitmasks are used to determine which datetime functions are supported:
+            SQL_SDF_CURRENT_DATESQL_SDF_CURRENT_TIMESQL_SDF_CURRENT_TIMESTAMP
+        */
+        case SQL_SQL92_DATETIME_FUNCTIONS: //155 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_SDF_CURRENT_DATE                |
+                SQL_SDF_CURRENT_TIME                |
+                SQL_SDF_CURRENT_TIMESTAMP           ;
+            break;
+            
+        case SQL_SQL92_VALUE_EXPRESSIONS: //165 called
+            break;
+            
+        case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS: //159 called
+            break;
+            
+        case SQL_SQL92_STRING_FUNCTIONS: //164 called
+            break;
+            
+        case SQL_SQL92_PREDICATES                    : //160 called
+            break;
+            
+        case SQL_SQL92_RELATIONAL_JOIN_OPERATORS   : //161 called
+            break;
+            
+        case SQL_DRIVER_ODBC_VER:                           // 77 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "03.00", -1 );
+            break;
+            
+        case SQL_CURSOR_COMMIT_BEHAVIOR:  //23 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_COMMIT_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_CORRELATION_NAME:  //74
+            //MessageBox ( GetDesktopWindow(), "SQL_CORRELATION_NAME", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CN_ANY;
+            break;
+            
+        case SQL_MAX_CONCURRENT_ACTIVITIES:                     // 1
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_MAX_CONCURRENT_ACTIVITIES", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = 2; }
+            
+            break;
+            
+        case SQL_ODBC_API_CONFORMANCE:                          // 9
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_ODBC_API_CONFORMANCE", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = SQL_OAC_NONE; }    // for MS Access
+            
+            break;
+            
+        case SQL_DATA_SOURCE_READ_ONLY:                         // 25
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_READ_ONLY", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_DRIVER_NAME:                                   // 6 //called by tb
+            //MessageBox ( GetDesktopWindow(), "SQL_DRIVER_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "driver.DLL", -1 );
+            break;
+            
+        case SQL_SEARCH_PATTERN_ESCAPE:                         // 14
+            //MessageBox ( GetDesktopWindow(), "SQL_SEARCH_PATTERN_ESCAPE", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\\", -1 );
+            break;
+            
+        case SQL_NON_NULLABLE_COLUMNS:                          // 75
+            //MessageBox ( GetDesktopWindow(), "SQL_NON_NULLABLE_COLUMNS", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_NNC_NULL;
+            break;
+            
+        case SQL_QUALIFIER_NAME_SEPARATOR:                      // 41 called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_NAME_SEPARATOR", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, ".", -1 );
+            break;
+            
+        case SQL_FILE_USAGE:                                    // 84
+            //MessageBox ( GetDesktopWindow(), "SQL_FILE_USAGE", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_FILE_NOT_SUPPORTED;
+            break;
+            
+        case SQL_QUALIFIER_TERM:                                // 42  // SQL_CATALOG_TERM: called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_TERM", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "database", -1 );
+            break;
+            
+        case SQL_OWNER_TERM:                                    // 39 //called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "owner", -1 );
+            break;
+            
+        case SQL_TABLE_TERM:                                    // 45 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "table", -1 );
+            break;
+            
+        case SQL_CURSOR_ROLLBACK_BEHAVIOR:                      // 24 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_ROLLBACK_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_DATA_SOURCE_NAME:                              // 2
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "GODBC", -1 );
+            break;
+            
+        case 16:
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_PROCEDURES:                                    // 21
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_IDENTIFIER_QUOTE_CHAR:                         // 29  //called by tb
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\"", -1 );
+            break;
+            
+        case SQL_MAX_SCHEMA_NAME_LEN:
+            * ( ( short* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_USER_NAME:
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_POS_OPERATIONS:                                // 79
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_POS_POSITION;
+            break;
+            
+        case SQL_STATIC_SENSITIVITY:                            // 83
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SS_ADDITIONS;
+            break;
+            
+        case SQL_LOCK_TYPES:                                    // 78
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_LCK_NO_CHANGE;
+            break;
+            
+        case SQL_GETDATA_EXTENSIONS:                            // 81 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_GD_ANY_COLUMN;
+            break;
+            
+        case SQL_TXN_ISOLATION_OPTION:                          // 72
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_SERIALIZABLE;
+            break;
+            
+        case SQL_BOOKMARK_PERSISTENCE:                          // 82
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            break;
+            
+        case SQL_SCROLL_OPTIONS:                                // 44
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SO_FORWARD_ONLY;
+            break;
+            
+        case SQL_SCROLL_CONCURRENCY:                            // 43
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SCCO_READ_ONLY;
+            break;
+            
+        case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:                    // 144
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES1:                     // 150
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES1:                     // 167
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:               // 146
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES2:                     // 151
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES2:                     // 168
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_NEED_LONG_DATA_LEN:                            // 111
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_TXN_CAPABLE:                                   // 46 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_TC_NONE;
+            break;
+            
+        case SQL_DEFAULT_TXN_ISOLATION:                         // 26
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_READ_COMMITTED;
+            break;
+            
+        case SQL_DBMS_NAME:                                     // 17 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Gen ODBC Server", -1 );
+            break;
+            
+        case SQL_ODBC_SQL_CONFORMANCE:                          // 15
+            // deprecated
+            * ( ( Word* ) pInfoValuePtr ) = SQL_OSC_MINIMUM;
+            break;
+            
+        case SQL_INTEGRITY:                                     // 73
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_QUALIFIER_USAGE:                               // 92 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CU_DML_STATEMENTS | SQL_CU_PROCEDURE_INVOCATION | SQL_CU_TABLE_DEFINITION;
+            break;
+            
+        case SQL_DBMS_VER:                                      // 18 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            break;
+            
+        case SQL_QUOTED_IDENTIFIER_CASE:                        // 93 called
+            //*(( Word* )pInfoValuePtr) = SQL_IC_SENSITIVE;
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_UPPER;
+            break;
+            
+        case SQL_MAX_CATALOG_NAME_LEN:                          // 34
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_MAX_TABLE_NAME_LEN:                            // 35
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_ACTIVE_CONNECTIONS:                            // 0
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACTIVE_CONNECTIONS" ));
+            break;
+            
+        case SQL_CATALOG_LOCATION:                              // 114
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CL_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CATALOG_LOCATION" ));
+            break;
+            
+        case SQL_CONCAT_NULL_BEHAVIOR:                           // 22
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CB_NULL;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CONCAT_NULL_BEHAVIOR" ));
+            break;
+            
+        case SQL_GROUP_BY:                                      // 88
+            * ( ( Word* ) pInfoValuePtr ) = SQL_GB_GROUP_BY_EQUALS_SELECT;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_GROUP_BY" ));
+            break;
+            
+        case SQL_IDENTIFIER_CASE:                               // 28
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_MIXED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_IDENTIFIER_CASE" ));
+            break;
+            
+        case SQL_MAX_INDEX_SIZE:                                // 102
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_INDEX_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE:                                  // 104
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:                    // 103
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE_INCLUDES_LONG" ));
+            break;
+            
+        case SQL_MAX_TABLES_IN_SELECT:                          // 106
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_TABLES_IN_SELECT" ));
+            break;
+            
+        case SQL_NULL_COLLATION:                                // 85
+            * ( ( Word* ) pInfoValuePtr ) = SQL_NC_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NULL_COLLATION" ));
+            break;
+            
+        case SQL_ORDER_BY_COLUMNS_IN_SELECT:                    // 90
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ORDER_BY_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_PROCEDURE_TERM:                                // 40
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "procedure", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_PROCEDURE_TERM" ));
+            break;
+            
+        case SQL_OWNER_USAGE:                                   // 91 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_SU_DML_STATEMENTS | SQL_SU_TABLE_DEFINITION | SQL_SU_PRIVILEGE_DEFINITION;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OWNER_USAGE" ));
+            break;
+            
+        case SQL_SUBQUERIES:                                    // 95
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SQ_CORRELATED_SUBQUERIES |
+                                            SQL_SQ_COMPARISON |
+                                            SQL_SQ_EXISTS |
+                                            SQL_SQ_IN |
+                                            SQL_SQ_QUANTIFIED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SUBQUERIES" ));
+            break;
+            
+        case SQL_MULT_RESULT_SETS:                              // 36:
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MULT_RESULT_SETS" ));
+            break;
+            
+        case SQL_SERVER_NAME:                                   // 13
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16,
+                               ( ( pODBCConn ) pConn )->Server ? ( ( pODBCConn ) pConn )->Server : "", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SERVER_NAME" ));
+            break;
+            
+        case SQL_ACCESSIBLE_PROCEDURES:                         // 20
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_PROCEDURES" ));
+            break;
+            
+        case SQL_ACCESSIBLE_TABLES:                             // 19
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_TABLES" ));
+            break;
+            
+        case SQL_OJ_CAPABILITIES:                               // 115 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_OJ_LEFT |
+                                            SQL_OJ_RIGHT |
+                                            SQL_OJ_FULL |
+                                            SQL_OJ_NESTED |
+                                            SQL_OJ_NOT_ORDERED |
+                                            SQL_OJ_INNER |
+                                            SQL_OJ_ALL_COMPARISON_OPS;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OJ_CAPABILITIES" ));
+            break;
+            
+        case SQL_DRIVER_VER:                                    // 7 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_DRIVER_VER" ));
+            break;
+            
+        case SQL_LIKE_ESCAPE_CLAUSE:                            // 113
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_LIKE_ESCAPE_CLAUSE" ));
+            break;
+            
+        case SQL_SPECIAL_CHARACTERS:                            // 94 //called by tb
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "$_", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SPECIAL_CHARACTERS" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_GROUP_BY:                       // 97
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_GROUP_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_INDEX:                          // 98
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_INDEX" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_ORDER_BY:                       // 99
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_ORDER_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_SELECT:                         // 100
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_TABLE:                          // 101
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_TABLE" ));
+            break;
+            
+        case SQL_NUMERIC_FUNCTIONS:                             // 49 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard numeric functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NUMERIC_FUNCTIONS" ));
+            break;
+            
+        case SQL_OUTER_JOINS:                                   // 38
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            // __ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OUTER_JOINS" ));
+            break;
+            
+        case SQL_STRING_FUNCTIONS:                              // 50 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard string functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_STRING_FUNCTIONS" ));
+            break;
+            
+        case SQL_SYSTEM_FUNCTIONS:                              // 51 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SYSTEM_FUNCTIONS" ));
+            break;
+            
+        /*
+            Note: The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.
+            An SQLUINTEGER bitmask enumerating the scalar date and time functions supported by the driver and associated data source.
+            The following bitmasks are used to determine which date and time functions are supported:
+            SQL_FN_TD_CURRENT_DATE ODBC 3.0)SQL_FN_TD_CURRENT_TIME (ODBC 3.0)SQL_FN_TD_CURRENT_TIMESTAMP (ODBC 3.0)SQL_FN_TD_CURDATE (ODBC 1.0)SQL_FN_TD_CURTIME (ODBC 1.0) SQL_FN_TD_DAYNAME (ODBC 2.0)SQL_FN_TD_DAYOFMONTH (ODBC 1.0)SQL_FN_TD_DAYOFWEEK (ODBC 1.0)SQL_FN_TD_DAYOFYEAR (ODBC 1.0) SQL_FN_TD_EXTRACT (ODBC 3.0)SQL_FN_TD_HOUR (ODBC 1.0)SQL_FN_TD_MINUTE (ODBC 1.0)SQL_FN_TD_MONTH (ODBC 1.0)SQL_FN_TD_MONTHNAME (ODBC 2.0)SQL_FN_TD_NOW (ODBC 1.0)SQL_FN_TD_QUARTER (ODBC 1.0)SQL_FN_TD_SECOND (ODBC 1.0)SQL_FN_TD_TIMESTAMPADD (ODBC 2.0)SQL_FN_TD_TIMESTAMPDIFF (ODBC 2.0)SQL_FN_TD_WEEK (ODBC 1.0)SQL_FN_TD_YEAR (ODBC 1.0)
+        */
+        case SQL_TIMEDATE_FUNCTIONS:                            // 52 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TD_CURRENT_DATE |
+                SQL_FN_TD_CURRENT_TIME |
+                SQL_FN_TD_CURRENT_TIMESTAMP |
+                SQL_FN_TD_CURDATE |
+                SQL_FN_TD_CURTIME |
+                SQL_FN_TD_DAYNAME |
+                SQL_FN_TD_DAYOFMONTH |
+                SQL_FN_TD_DAYOFWEEK |
+                SQL_FN_TD_DAYOFYEAR |
+                SQL_FN_TD_EXTRACT |
+                SQL_FN_TD_HOUR |
+                SQL_FN_TD_MINUTE |
+                SQL_FN_TD_MONTH |
+                SQL_FN_TD_MONTHNAME |
+                SQL_FN_TD_NOW |
+                SQL_FN_TD_QUARTER |
+                SQL_FN_TD_SECOND |
+                SQL_FN_TD_TIMESTAMPADD |
+                SQL_FN_TD_TIMESTAMPDIFF |
+                SQL_FN_TD_WEEK |
+                SQL_FN_TD_YEAR ;
+            break;
+            
+        default:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR,
+                                      "Function Missing!!! SQLGetInfo, Field: %d, DataPtr: %d, BufLen: %d, SizePtr: %d\n",  pInfoType, pInfoValuePtr,
+                                      pBufferLength, pStringLengthPtr ) );
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get type related information, this communicates with the server
+// -----------------------------------------------------------------------
+
+//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" ) );
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get function related information
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetFunctions ( SQLHDBC pConn, SQLUSMALLINT  pFuncID, SQLUSMALLINT*  pOutput ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetFunctions called" ) );
+    // the functions is currently not being exported
+    // bcoz of implemenation difficulties for
+    // SQL_API_ODBC3_ALL_FUNCTIONS param
+    // which requires an array to be built
+    // to satisfy the functioning of the macro  SQL_FUNC_EXISTS.
+    // in any case the driver manager provides for a proper
+    // stub
+    // SQLFUNCEXISTS ---- ( ( *(((UWORD*) (pfExists)) + ((uwAPI) >> 4)) & (1 << ((uwAPI) & 0x000F))) ? SQL_TRUE : SQL_FALSE )
+    return SQL_SUCCESS;
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_PARAM.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_PARAM.CPP b/odbc/Driver/KO_PARAM.CPP
new file mode 100644
index 0000000..8df4fe5
--- /dev/null
+++ b/odbc/Driver/KO_PARAM.CPP
@@ -0,0 +1,85 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_PARAM.CPP
+//
+// Purpose: This file contains functions for implementing
+//          parameterized queries. Since I have not shown
+//          implementation of params in the sample, all the
+//          functions r just placeholders. Params work
+//          thru APD and IPD just like actual results
+//          work thru ARD and IRD
+//
+// Exported functions:
+//                       SQLBindParameter
+//                       SQLDescribeParam
+//                       SQLNumParams
+//                       SQLParamData
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+
+
+// -----------------------------------------------------------------------
+// to bind a buffer to a parameter marker in an SQL statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLBindParameter ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pParamNum,
+                                   SQLSMALLINT     pIOType,
+                                   SQLSMALLINT     pValueType,
+                                   SQLSMALLINT     pParamType,
+                                   SQLUINTEGER     pColSize,
+                                   SQLSMALLINT     pDecimalDigits,
+                                   SQLPOINTER      pParamValuePtr,
+                                   SQLINTEGER      pParamValueSize,
+                                   SQLINTEGER*     pParamValueSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBindParameter called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLBindParameter not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+
+// -----------------------------------------------------------------------
+// to get param descriptions for a specified bound param
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLDescribeParam ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pParamNum,
+                                   SQLSMALLINT*    pDataTypePtr,
+                                   SQLUINTEGER*    pParamSizePtr,
+                                   SQLSMALLINT*    pDecimalDigitsPtr,
+                                   SQLSMALLINT*    pNullablePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDescribeParam called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLDescribeParam not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to get the number of parameters in a statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLNumParams ( SQLHSTMT pStmt, SQLSMALLINT* pParamCountPtr ) {
+    // since the concept of parameters has not been implemented
+    // this function returns zero in the number of params to
+    // make sure that the calle does not proceed forward on this issue
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumParams called" ) );
+    
+    if ( pParamCountPtr )
+    { *pParamCountPtr = 0; }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to be used wth SQLPutData to provide param data at execution time
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLParamData ( SQLHSTMT pStmt, SQLPOINTER* pValuePtrPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLParamData called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLParamData not implemented" ) );
+    return SQL_ERROR;
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_UTILS.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_UTILS.CPP b/odbc/Driver/KO_UTILS.CPP
new file mode 100644
index 0000000..9962a6a
--- /dev/null
+++ b/odbc/Driver/KO_UTILS.CPP
@@ -0,0 +1,566 @@
+
+// ---------------------------------------------------------------------------------
+//
+// File:    KO_UTILS.CPP
+//
+// Notes:   contains generic utility functions used across files/modules.
+//          Data conversion and copying functions w.r.t ODBC type params
+//          like its type, size, its size pointer, src data and src size etc.
+//
+//          As explained in the article ODBC specifies a way in which
+//          buffers r laid out along with their size and return length
+//          placeholders. The functions _SQLCopyCharData, _SQLCopyNumData
+//          and _SQLCopyDateTimeData have been designed to copy char, numeric
+//          and date time data from src ( buffer,size,type ) to tgt ( buffer,
+//          size, type ) whichever params r applicable.
+//
+// ----------------------------------------------------------------------------------
+#include "stdafx.h"
+
+// ------------------------- local functions ----------------------------
+eGoodBad    GetDateFromString ( const char* pDateStr, struct tagDATE_STRUCT* pDateStruct );
+eGoodBad    GetTimestampFromString ( const char* pDateStr, struct tagTIMESTAMP_STRUCT* pTimestampStruct );
+
+
+// ----------------------------------------------------------------------
+// to extract date from string assuming server format to be yyyy-mm-dd or yyyymmdd
+// ----------------------------------------------------------------------
+
+eGoodBad GetDateFromString ( const char* pDateStr, struct tagDATE_STRUCT* pDateStruct ) {
+    char    val[5];
+    short   x;
+    short   day, month;
+    // length of source
+    x = strlen ( pDateStr );
+    
+    // 10 byte date yyyy-mm-dd, 8 byte date yyyymmdd
+    if ( x == 8 || x == 10 ) {
+        // calc  pos of day and month in string
+        if ( x == 8 ) {
+            day     = 6;
+            month   = 4;
+        }
+        
+        else {
+            day     = 8;
+            month   = 5;
+        }
+        
+        // convert day value
+        pDateStruct->day = atoi ( pDateStr + day );
+        // copy and convert month
+        strncpy ( val, pDateStr + month, 2 ); val[2] = 0;
+        pDateStruct->month  = atoi ( val );
+        strncpy ( val, pDateStr, 4 ); val[4] = 0;
+        pDateStruct->year   = atoi ( val );
+        return GOOD;
+    }
+    
+    else {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Invalid date string for conversion: %s", pDateStr ) );
+        return BAD;
+    }
+}
+
+//Timestamps in text files have to use the format yyyy-mm-dd hh:mm:ss[.f...]
+eGoodBad    GetTimestampFromString ( const char* pStr, struct tagTIMESTAMP_STRUCT* pTimestampStruct ) {
+    char    val[10];
+    short   x;
+    short   day, month, hour, minute, second, frag;
+    // length of source
+    x = strlen ( pStr );
+    const char* p = pStr;
+    
+    while ( ( *p != ' ' ) && ( p < pStr + x ) ) {
+        p++;
+    }
+    
+    if ( ( p - pStr ) != 10 || ( x < 19 ) ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Invalid timestamp string for conversion: %s", pStr ) );
+        return BAD;
+    }
+    
+    month   = 5;
+    day     = 8;
+    hour = 11;
+    minute = 14;
+    second = 17;
+    frag = 20;
+    // convert day value
+    strncpy ( val, pStr + day, 2 );
+    val[2] = 0;
+    pTimestampStruct->day = atoi ( val );
+    // copy and convert month
+    strncpy ( val, pStr + month, 2 );
+    val[2] = 0;
+    pTimestampStruct->month  = atoi ( val );
+    //convert year
+    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 >= 21 ) {
+        pTimestampStruct->fraction = atoi ( pStr + frag );
+    }
+    
+    else {
+        pTimestampStruct->fraction = 0;
+    }
+    
+    return GOOD;
+}
+
+// ----------------------------------------------------------------------
+// to create a copy of char data to specified tgt buffer
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLCopyCharData ( pODBCDiag pDiag, void* pTgtDataPtr, Long pDataBufSize, void* pSizePtr,
+                                   Word pSizePtrSize, CStrPtr pSrcData, Long pSrcDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLCopyCharData called,pDataBufSize %d, the src is %s, strlen(src) %d, pSrcDataSize %d", pDataBufSize, pSrcData,
+                              strlen ( pSrcData ), pSrcDataSize ) );
+    Long    n;
+    
+    // caller safe
+    if ( pTgtDataPtr )
+    { * ( ( StrPtr ) pTgtDataPtr ) = 0; }
+    
+    // DATA SIZE
+    
+    // check source data to compute size
+    if ( pSrcData && _stricmp ( ( StrPtr ) pSrcData, "NULL" ) != 0 )
+    { n = ( pSrcDataSize < 0 ) ? strlen ( ( StrPtr ) pSrcData ) : pSrcDataSize; }        // compute length based on whether null terminated
+    
+    else
+    { n = 0; }
+    
+    // check if there is a holder for size
+    if ( pSizePtr ) {
+        // set size as per ptr type 16-bt or 32-bit
+        if ( pSizePtrSize == 16 )
+        { * ( ( Word* ) pSizePtr ) = ( Word ) n; }
+        
+        else
+        { * ( ( Long* ) pSizePtr ) = n; }
+    }
+    
+    // check if src data but no size holder
+    else if ( pSrcData ) {
+        // check if diag to be set
+        if ( pDiag )
+        { _SQLPutDiagRow ( pDiag, "_SQLCopyCharData", "01000", -1, "No holder for data size", NULL ); }
+        
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLCopyCharData - No holder for data size" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if there is a target holder
+    if ( pTgtDataPtr ) {
+        // check if there is a source pointer
+        if ( pSrcData ) {
+            // does all of it fit with null char
+            if ( pDataBufSize >= n + 1 ) {
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, n );
+                ( ( StrPtr ) pTgtDataPtr ) [n] = 0;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyCharData has been called, the string(not truncated) is %s",
+                                          pTgtDataPtr ) );
+                return SQL_SUCCESS;
+            }
+            
+            // all of it does not fit
+            else {
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, pDataBufSize - 1 );
+                ( ( StrPtr ) pTgtDataPtr ) [pDataBufSize - 1] = 0;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_WARN, "_SQLCopyCharData has been called, the target string is (truncated) %s",
+                                          pTgtDataPtr ) );
+                //return SQL_SUCCESS_WITH_INFO may cause error in tableau
+                //if ( pDiag )
+                //  _SQLPutDiagRow ( pDiag, "_SQLCopyCharData", "01000", -1, "string data truncated", NULL );
+                //return SQL_SUCCESS_WITH_INFO;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_WARN, "string data truncated" ) );
+                return SQL_SUCCESS;
+            }
+        }
+        
+        // tgt data but no src data
+        else {
+            // clear tgt
+            * ( ( Char* ) pTgtDataPtr ) = 0;
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyCharData has been called, the string is (empty) %s", pTgtDataPtr ) );
+        }
+    }
+    
+    return SQL_SUCCESS;
+}
+
+RETCODE SQL_API _SQLCopyWCharData ( pODBCDiag pDiag, void* pTgtDataPtr, Long pDataBufSize, void* pSizePtr,
+                                    Word pSizePtrSize, CStrPtr pSrcData, Long pSrcDataSize ) {
+    unique_ptr<wchar_t[]> pWCS ( char2wchar ( pSrcData ) );
+    return _SQLCopyWCharDataW ( pDiag,  pTgtDataPtr,  pDataBufSize,  pSizePtr,  pSizePtrSize,  pWCS.get(),  pSrcDataSize );
+}
+//mhb added, for those ard that accept wchar
+RETCODE SQL_API _SQLCopyWCharDataW ( pODBCDiag pDiag, void* pTgtDataPtr, Long pDataBufSize, void* pSizePtr,
+                                     Word pSizePtrSize, const wchar_t* pSrcData, Long pSrcDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyWCharDataW called, pTgtDataPtr is null? %d, pSizePtr == null? %d",
+                              pTgtDataPtr == NULL, pSizePtr == NULL ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyWCharDataW called, the src string is :" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, pSrcData ) );
+    Long    n;
+    
+    // caller safe
+    if ( pTgtDataPtr )
+    { * ( ( wchar_t* ) pTgtDataPtr ) = 0; }
+    
+    // DATA SIZE
+    
+    // check source data to compute size
+    if ( pSrcData && _wcsicmp ( pSrcData, L"NULL" ) != 0 )
+    { n = ( pSrcDataSize < 0 ) ?  wcslen ( pSrcData ) : pSrcDataSize; }         // compute length based on whether null terminated
+    
+    else
+    { n = 0; }
+    
+    // check if there is a holder for size
+    if ( pSizePtr ) {
+        // set size as per ptr type 16-bt or 32-bit
+        
+        //should be number of characters
+        if ( pSizePtrSize == 16 )
+        { * ( ( Word* ) pSizePtr ) = ( Word ) ( 2 * n ); }
+        
+        else
+        { * ( ( Long* ) pSizePtr ) = ( 2 * n ); }
+        
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pSizePtr is set to %d", n ) );
+    }
+    
+    // check if src data but no size holder
+    else if ( pSrcData ) {
+        // check if diag to be set
+        if ( pDiag )
+        { _SQLPutDiagRow ( pDiag, "_SQLCopyWCharDataW", "01000", -1, "No holder for data size", NULL ); }
+        
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLCopyWCharDataW - No holder for data size" ) );
+        return SQL_ERROR;
+    }
+    
+    // DATA
+    
+    // check if there is a target holder
+    if ( pTgtDataPtr ) {
+        // check if there is a source pointer
+        if ( pSrcData ) {
+            // does all of it fit with null char
+            if ( pDataBufSize >= ( n + 1 ) ) {
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, 2 * ( n + 1 ) );
+                ( ( wchar_t* ) pTgtDataPtr ) [n] = '\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()));
+                return SQL_SUCCESS;
+            }
+            
+            // all of it does not fit
+            else {
+                //if(pDataBufSize % 2 == 1)
+                //  pDataBufSize -= 1;
+                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 ) );
+                //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG, temp.get()));
+                //return SQL_SUCCESS_WITH_INFO may cause error in tableau
+                //if ( pDiag )
+                //  _SQLPutDiagRow ( pDiag, "_SQLCopyWCharDataW", "01000", -1, "string data truncated", NULL );
+                //return SQL_SUCCESS_WITH_INFO;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_WARN, "string data truncated" ) );
+                return SQL_SUCCESS;
+            }
+        }
+        
+        // tgt data but no src data
+        else {
+            // clear tgt
+            * ( ( wchar_t* ) pTgtDataPtr ) = 0;
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyWCharDataW has been called, the string is (empty) %s",
+                                      pTgtDataPtr ) );
+        }
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// ----------------------------------------------------------------------
+// to create a copy of numeric data to specified tgt buffer
+// ----------------------------------------------------------------------
+
+
+//TODO: it seems that the unsigned values are not treated specially
+Word _SQLCopyNumData ( pODBCDiag pDiag, void* pTgtDataPtr, Word pTgtDataType, CStrPtr pSrcData, Word pSrcDataType ,
+                       Long* pTgtDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyNumData called" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The src is %s", pSrcData ) );
+    // note
+    // source data is received as character string
+    // target data size indicates the type of int - 8bit, 16bit, 32bit, float, double etc
+    // source data type is also recd. but is not being checked right now
+    // this can be used to detrmine if the conversion is possible at all
+    bool    isnull;
+    // check if source data is NULL
+    isnull = ( !pSrcData || _stricmp ( pSrcData, "NULL" ) == 0 ) ? TRUE : 0;
+    
+    // check if target is there
+    if ( pTgtDataPtr ) {
+        // check the data type
+        switch ( pTgtDataType ) {
+            case SQL_C_UTINYINT:
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( unsigned char* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( char ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( char );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d (unsigned char)",
+                                          * ( ( unsigned char* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_STINYINT:
+            case SQL_C_TINYINT:
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( char* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( char ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( char );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d  (signed char)", * ( ( char* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_USHORT:             // unsigned short
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( Word* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( Word ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( Word );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %u (signed short)",
+                                          * ( ( unsigned short* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_SHORT:             // case i2
+            case SQL_C_SSHORT:             // signed short
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( Word* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( Word ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( Word );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d (signed short)", * ( ( Word* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_ULONG:               // unsigned long
+                if ( !isnull ) {
+                    unsigned long ui32;
+                    ui32 = strtoul ( pSrcData , NULL, 10 );
+                    * ( ( unsigned long* ) pTgtDataPtr ) = ui32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( unsigned long ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( unsigned long );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %u (unsigned int)",
+                                          * ( ( unsigned long* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_LONG:               // case i4
+            case SQL_C_SLONG:               // signed long
+            
+                // ???? check src type
+                if ( !isnull ) {
+                    long i32;
+                    i32 = atol ( pSrcData );
+                    * ( ( Long* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( Long ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( Long );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d (signed int)", * ( ( Long* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_UBIGINT:
+                if ( !isnull ) {
+                    unsigned __int64 x64;
+                    x64 = _strtoui64 ( pSrcData, NULL, 10 );
+                    * ( ( unsigned __int64* ) pTgtDataPtr ) = x64;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( unsigned __int64 ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( unsigned __int64 );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %I64u (unsigned big int)",
+                                          * ( ( unsigned __int64* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_BIGINT:
+            case SQL_C_SBIGINT:
+                if ( !isnull ) {
+                    __int64 x64;
+                    x64 = _strtoi64 ( pSrcData, NULL, 10 );
+                    * ( ( __int64* ) pTgtDataPtr ) = x64;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( __int64 ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( __int64 );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %I64d (signed big int)",
+                                          * ( ( __int64* ) pTgtDataPtr ) ) );
+                break;
+                
+            //case SQL_DECIMAL: //decimal type has a special struct
+            case SQL_FLOAT:
+            case SQL_C_FLOAT:
+                if ( !isnull ) {
+                    // ???? check src type
+                    double f;
+                    f = atof ( pSrcData );
+                    * ( ( float* ) pTgtDataPtr ) = ( float ) f;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( float ) ); }
+                
+                *pTgtDataSizePtr  = sizeof ( float );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %9.9f (float)", * ( ( float* ) pTgtDataPtr ) ) );
+                break;
+                
+            //case SQL_REAL:
+            //case SQL_NUMERIC:                           // case float
+            
+            case SQL_C_DOUBLE:
+                if ( !isnull ) {
+                    // ???? check src type
+                    char*   e;
+                    double  d;
+                    
+                    if ( pSrcDataType == SQL_BIT )
+                    { d = 1; }
+                    
+                    else
+                    { d = strtod ( pSrcData, &e ); }
+                    
+                    * ( ( double* ) pTgtDataPtr ) = d;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( double ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( double );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %9.9f (double), with the pTgtDataSizePtr %d",
+                                          * ( ( double* ) pTgtDataPtr ), *pTgtDataSizePtr ) );
+                break;
+                
+            default:
+                return 1;               // data type not understood
+        }
+        
+        return 0;                       // successful, at least data type recognized
+    }
+    
+    else
+    { return -1; }                      // should not typically happen
+}
+
+
+// ----------------------------------------------------------------------
+// to create a copy of date/time data to specified tgt buffer
+// ----------------------------------------------------------------------
+
+Word _SQLCopyDateTimeData ( pODBCDiag pDiag, void* pTgtDataPtr, Word pTgtDataType, CStrPtr pSrcData,
+                            Word pSrcDataType ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyDateTimeData called, with the src : %s", pSrcData ) );
+    // note
+    // source data is received as character string
+    // source data type is also recd. but is not being checked right now
+    // this can be used to detrmine if the conversion is possible at all
+    bool    isnull;
+    // check if source data is NULL
+    isnull = ( !pSrcData || _stricmp ( pSrcData, "NULL" ) == 0 ) ? TRUE : 0;
+    
+    // check if target is there
+    if ( pTgtDataPtr ) {
+        // check the data size
+        switch ( pTgtDataType ) {
+            case SQL_C_TYPE_DATE:                     // 91
+            case SQL_C_DATE:
+            
+                // ???? check src type
+                if ( !isnull ) {
+                    memset ( pTgtDataPtr, 0, sizeof ( struct tagDATE_STRUCT ) );
+                    GetDateFromString ( pSrcData, ( struct tagDATE_STRUCT* ) pTgtDataPtr );
+                }
+                
+                break;
+                
+            case SQL_C_TYPE_TIME:                     // 92
+            case SQL_C_TIME:
+                //not suppporting Time
+                return 1;
+                
+            case SQL_C_TYPE_TIMESTAMP:                // 93
+            case SQL_C_TIMESTAMP:
+            
+                // ???? check src type
+                if ( !isnull ) {
+                    memset ( pTgtDataPtr, 0, sizeof ( struct tagTIMESTAMP_STRUCT ) );
+                    GetTimestampFromString ( pSrcData, ( struct tagTIMESTAMP_STRUCT* ) pTgtDataPtr );
+                }
+                
+                break;
+                
+            default:
+                return 1;               // data type not understood
+        }
+        
+        return 0;                       // successful, at least data type recognized
+    }
+    
+    else
+    { return -1; }                      // should not typically happen
+}
+
+
+
+



[13/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/ReadMe.txt
----------------------------------------------------------------------
diff --git a/odbc/Common/ReadMe.txt b/odbc/Common/ReadMe.txt
new file mode 100644
index 0000000..514fbd1
--- /dev/null
+++ b/odbc/Common/ReadMe.txt
@@ -0,0 +1,29 @@
+========================================================================
+    STATIC LIBRARY : Common Project Overview
+========================================================================
+
+AppWizard has created this Common library project for you.
+
+No source files were created as part of your project.
+
+
+Common.vcxproj
+    This is the main project file for VC++ projects generated using an Application Wizard.
+    It contains information about the version of Visual C++ that generated the file, and
+    information about the platforms, configurations, and project features selected with the
+    Application Wizard.
+
+Common.vcxproj.filters
+    This is the filters file for VC++ projects generated using an Application Wizard. 
+    It contains information about the association between the files in your project 
+    and the filters. This association is used in the IDE to show grouping of files with
+    similar extensions under a specific node (for e.g. ".cpp" files are associated with the
+    "Source Files" filter).
+
+/////////////////////////////////////////////////////////////////////////////
+Other notes:
+
+AppWizard uses "TODO:" comments to indicate parts of the source code you
+should add to or customize.
+
+/////////////////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/StringUtils.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/StringUtils.cpp b/odbc/Common/StringUtils.cpp
new file mode 100644
index 0000000..4dd336b
--- /dev/null
+++ b/odbc/Common/StringUtils.cpp
@@ -0,0 +1,165 @@
+#include <iostream>
+#include <stdlib.h>
+#include <string>
+
+#include "atlbase.h"
+#include "atlstr.h"
+#include "comutil.h"
+
+
+#include "StringUtils.h"
+#include "Base64.h"
+
+using namespace std;
+
+std::unique_ptr<char[]> str_base64_encode ( char* raw ) {
+    trimwhitespace ( raw );
+    string encStr = base64_encode ( ( const unsigned char* ) raw, strlen ( raw ) );
+    std::unique_ptr<char[]> temp ( new char[encStr.length() + 1] );
+    strcpy ( temp.get(), encStr.c_str() );
+    return temp;
+}
+
+std::unique_ptr<char[]> str_base64_decode ( char* enc ) {
+    string s ( enc );
+    string decStr = base64_decode ( s );
+    std::unique_ptr<char[]> temp ( new char[decStr.length() + 1] );
+    strcpy ( temp.get(), decStr.c_str() );
+    return temp;
+}
+
+void trimwhitespace ( char* str ) {
+    if ( str == NULL || strlen ( str ) == 0 )
+    { return; }
+    
+    char* start = str;
+    char* end;
+    
+    // Trim leading space
+    while ( isspace ( *start ) ) { start++; }
+    
+    if ( *start == 0 ) { // All spaces?
+        str[0] = '\0';
+        return;
+    }
+    
+    // Trim trailing space
+    end = start + strlen ( start ) - 1;
+    
+    while ( end > start && isspace ( *end ) ) { end--; }
+    
+    // Write new null terminator
+    * ( end + 1 ) = 0;
+    memmove ( str, start, end - start + 2 );
+}
+
+void copyTrimmed ( char** dest, char* src ) {
+    // check if previous value exists
+    if ( *dest ) {
+        delete[] ( *dest );
+        *dest = NULL;
+    }
+    
+    *dest = new char[strlen ( src ) + 1];
+    strcpy ( *dest, src );
+    trimwhitespace ( *dest );
+}
+
+std::unique_ptr<wchar_t[]> char2wchar ( char* orig ) {
+    if ( orig == NULL )
+    { return NULL; }
+    
+    size_t newsize = strlen ( orig ) + 1;
+    std::unique_ptr<wchar_t[]> wcstring ( new wchar_t[newsize] );
+    size_t convertedChars = 0;
+    mbstowcs_s ( &convertedChars, wcstring.get(), newsize, orig, _TRUNCATE );
+    return wcstring;
+}
+
+std::unique_ptr<wchar_t[]>  char2wchar ( const char* orig ) {
+    if ( orig == NULL )
+    { return NULL; }
+    
+    size_t newsize = strlen ( orig ) + 1;
+    std::unique_ptr<wchar_t[]> wcstring ( new wchar_t[newsize] );
+    size_t convertedChars = 0;
+    mbstowcs_s ( &convertedChars, wcstring.get(), newsize, orig, _TRUNCATE );
+    return wcstring;
+}
+
+//specifying the destination
+void char2wchar ( char* orig, wchar_t* dest, int destBufferLength ) {
+    if ( orig == NULL )
+    { return; }
+    
+    if ( destBufferLength > 0 ) {
+        if ( destBufferLength <= ( int ) strlen ( orig ) ) {
+            throw - 1;
+        }
+    }
+    
+    size_t newsize = strlen ( orig ) + 1;
+    size_t convertedChars = 0;
+    mbstowcs_s ( &convertedChars, dest, newsize, orig, _TRUNCATE );
+}
+
+std::unique_ptr<char[]> wchar2char ( wchar_t* orig ) {
+    if ( orig == NULL )
+    { return NULL; }
+    
+    size_t origsize = wcslen ( orig ) + 1;
+    size_t convertedChars = 0;
+    const size_t newsize = origsize;
+    std::unique_ptr<char[]> nstring ( new char[newsize] );
+    wcstombs_s ( &convertedChars, nstring.get(), newsize, orig, _TRUNCATE );
+    return nstring;
+}
+
+std::unique_ptr<char[]>  wchar2char ( const wchar_t* orig ) {
+    if ( orig == NULL )
+    { return NULL; }
+    
+    size_t origsize = wcslen ( orig ) + 1;
+    size_t convertedChars = 0;
+    const size_t newsize = origsize;
+    std::unique_ptr<char[]> nstring ( new char[newsize] );
+    wcstombs_s ( &convertedChars, nstring.get(), newsize, orig, _TRUNCATE );
+    return nstring;
+}
+
+void wchar2char ( wchar_t* orig, char* dest, int destBufferLength ) {
+    if ( orig == NULL )
+    { return; }
+    
+    if ( destBufferLength > 0 ) {
+        if ( destBufferLength <= ( int ) wcslen ( orig ) ) {
+            throw - 1;
+        }
+    }
+    
+    size_t origsize = wcslen ( orig ) + 1;
+    size_t convertedChars = 0;
+    const size_t newsize = origsize;
+    wcstombs_s ( &convertedChars, dest, newsize, orig, _TRUNCATE );
+}
+
+
+std::wstring string2wstring ( std::string& orig ) {
+    std::wstring ws;
+    ws.assign ( orig.begin(), orig.end() );
+    return ws;
+}
+
+std::string wstring2string ( std::wstring& orig ) {
+    std::string s;
+    s.assign ( orig.begin(), orig.end() );
+    return s;
+}
+
+std::unique_ptr<char[]> make_unique_str ( int size ) {
+    return std::unique_ptr<char[]> ( new char[size + 1] );
+}
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/StringUtils.h
----------------------------------------------------------------------
diff --git a/odbc/Common/StringUtils.h b/odbc/Common/StringUtils.h
new file mode 100644
index 0000000..154f06b
--- /dev/null
+++ b/odbc/Common/StringUtils.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <memory>
+#include <string>
+
+
+//UTIL
+std::unique_ptr<wchar_t[]> char2wchar ( char* orig );
+std::unique_ptr<wchar_t[]> char2wchar ( const char* orig );
+void char2wchar ( char* orig, wchar_t* dest, int destLength );
+
+std::unique_ptr<char[]> wchar2char ( wchar_t* orig );
+std::unique_ptr<char[]> wchar2char ( const wchar_t* orig );
+void wchar2char ( wchar_t* orig, char* dest, int destLength );
+
+std::wstring string2wstring ( std::string& orig );
+std::string wstring2string ( std::wstring& orig );
+
+void trimwhitespace ( char* str );
+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

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/Win32/Release/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Common/Win32/Release/.gitignore b/odbc/Common/Win32/Release/.gitignore
new file mode 100644
index 0000000..7fa2b99
--- /dev/null
+++ b/odbc/Common/Win32/Release/.gitignore
@@ -0,0 +1 @@
+*.lastbuildstate

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/base64.cpp
----------------------------------------------------------------------
diff --git a/odbc/Common/base64.cpp b/odbc/Common/base64.cpp
new file mode 100644
index 0000000..e5f2427
--- /dev/null
+++ b/odbc/Common/base64.cpp
@@ -0,0 +1,97 @@
+#include "Base64.h"
+#include <iostream>
+
+static const std::string base64_chars =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "abcdefghijklmnopqrstuvwxyz"
+    "0123456789+/";
+
+
+static inline bool is_base64 ( unsigned char c ) {
+    return ( isalnum ( c ) || ( c == '+' ) || ( c == '/' ) );
+}
+
+std::string base64_encode ( unsigned char const* bytes_to_encode, unsigned int in_len ) {
+    std::string ret;
+    int i = 0;
+    int j = 0;
+    unsigned char char_array_3[3];
+    unsigned char char_array_4[4];
+    
+    while ( in_len-- ) {
+        char_array_3[i++] = * ( bytes_to_encode++ );
+        
+        if ( i == 3 ) {
+            char_array_4[0] = ( char_array_3[0] & 0xfc ) >> 2;
+            char_array_4[1] = ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 );
+            char_array_4[2] = ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 );
+            char_array_4[3] = char_array_3[2] & 0x3f;
+            
+            for ( i = 0; ( i < 4 ) ; i++ )
+            { ret += base64_chars[char_array_4[i]]; }
+            
+            i = 0;
+        }
+    }
+    
+    if ( i ) {
+        for ( j = i; j < 3; j++ )
+        { char_array_3[j] = '\0'; }
+        
+        char_array_4[0] = ( char_array_3[0] & 0xfc ) >> 2;
+        char_array_4[1] = ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 );
+        char_array_4[2] = ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 );
+        char_array_4[3] = char_array_3[2] & 0x3f;
+        
+        for ( j = 0; ( j < i + 1 ); j++ )
+        { ret += base64_chars[char_array_4[j]]; }
+        
+        while ( ( i++ < 3 ) )
+        { ret += '='; }
+    }
+    
+    return ret;
+}
+
+std::string base64_decode ( std::string const& encoded_string ) {
+    int in_len = encoded_string.size();
+    int i = 0;
+    int j = 0;
+    int in_ = 0;
+    unsigned char char_array_4[4], char_array_3[3];
+    std::string ret;
+    
+    while ( in_len-- && ( encoded_string[in_] != '=' ) && is_base64 ( encoded_string[in_] ) ) {
+        char_array_4[i++] = encoded_string[in_]; in_++;
+        
+        if ( i == 4 ) {
+            for ( i = 0; i < 4; i++ )
+            { char_array_4[i] = base64_chars.find ( char_array_4[i] ); }
+            
+            char_array_3[0] = ( char_array_4[0] << 2 ) + ( ( char_array_4[1] & 0x30 ) >> 4 );
+            char_array_3[1] = ( ( char_array_4[1] & 0xf ) << 4 ) + ( ( char_array_4[2] & 0x3c ) >> 2 );
+            char_array_3[2] = ( ( char_array_4[2] & 0x3 ) << 6 ) + char_array_4[3];
+            
+            for ( i = 0; ( i < 3 ); i++ )
+            { ret += char_array_3[i]; }
+            
+            i = 0;
+        }
+    }
+    
+    if ( i ) {
+        for ( j = i; j < 4; j++ )
+        { char_array_4[j] = 0; }
+        
+        for ( j = 0; j < 4; j++ )
+        { char_array_4[j] = base64_chars.find ( char_array_4[j] ); }
+        
+        char_array_3[0] = ( char_array_4[0] << 2 ) + ( ( char_array_4[1] & 0x30 ) >> 4 );
+        char_array_3[1] = ( ( char_array_4[1] & 0xf ) << 4 ) + ( ( char_array_4[2] & 0x3c ) >> 2 );
+        char_array_3[2] = ( ( char_array_4[2] & 0x3 ) << 6 ) + char_array_4[3];
+        
+        for ( j = 0; ( j < i - 1 ); j++ ) { ret += char_array_3[j]; }
+    }
+    
+    return ret;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/base64.h
----------------------------------------------------------------------
diff --git a/odbc/Common/base64.h b/odbc/Common/base64.h
new file mode 100644
index 0000000..b10860f
--- /dev/null
+++ b/odbc/Common/base64.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include <string>
+
+std::string base64_encode ( unsigned char const*, unsigned int len );
+std::string base64_decode ( std::string const& s );
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Common/x64/Release/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Common/x64/Release/.gitignore b/odbc/Common/x64/Release/.gitignore
new file mode 100644
index 0000000..7fa2b99
--- /dev/null
+++ b/odbc/Common/x64/Release/.gitignore
@@ -0,0 +1 @@
+*.lastbuildstate

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Driver/.gitignore b/odbc/Driver/.gitignore
new file mode 100644
index 0000000..6e84b00
--- /dev/null
+++ b/odbc/Driver/.gitignore
@@ -0,0 +1,2 @@
+*.lib
+*.exp

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/GODBC.RC
----------------------------------------------------------------------
diff --git a/odbc/Driver/GODBC.RC b/odbc/Driver/GODBC.RC
new file mode 100644
index 0000000..da9a478
--- /dev/null
+++ b/odbc/Driver/GODBC.RC
@@ -0,0 +1,177 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+"resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+"#include ""afxres.h""\r\n"
+"\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+"\r\n"
+"\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 1, 0, 0, 1
+PRODUCTVERSION 1, 0, 0, 1
+FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+FILEFLAGS 0x1L
+#else
+FILEFLAGS 0x0L
+#endif
+FILEOS 0x40004L
+FILETYPE 0x2L
+FILESUBTYPE 0x0L
+BEGIN
+BLOCK "StringFileInfo"
+BEGIN
+BLOCK "040904b0"
+BEGIN
+VALUE "CompanyName", "kylinolap"
+VALUE "FileDescription", "Kylin ODBC Driver"
+VALUE "FileVersion", "1, 0, 0, 1"
+VALUE "InternalName", "KylinODBC"
+VALUE "LegalCopyright", "Copyright ?2014"
+VALUE "OriginalFilename", "driver.dll"
+VALUE "ProductName", "Kylin ODBC Driver"
+VALUE "ProductVersion", "1, 0, 0, 1"
+END
+END
+BLOCK "VarFileInfo"
+BEGIN
+VALUE "Translation", 0x409, 1200
+END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_DSN_CFG1 DIALOGEX 0, 0, 263, 162
+STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
+CAPTION "Kylin Driver Connect Dialog"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+PUSHBUTTON      "Cancel", IDCANCEL, 152, 138, 50, 14
+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           "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
+END
+
+IDD_DSN_CFG2 DIALOGEX 0, 0, 263, 204
+STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
+CAPTION "Kylin DSN Configuration Dialog"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+PUSHBUTTON      "Cancel", IDCANCEL, 145, 167, 50, 14
+LTEXT           "Server Host", IDC_STATIC, 48, 35, 38, 8
+LTEXT           "Port", IDC_STATIC, 72, 52, 14, 8
+EDITTEXT        IDC_SERVER, 93, 33, 102, 12, ES_AUTOHSCROLL
+EDITTEXT        IDC_PORT, 93, 50, 30, 12, ES_AUTOHSCROLL
+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
+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
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+IDD_DSN_CFG1, DIALOG
+BEGIN
+LEFTMARGIN, 7
+RIGHTMARGIN, 256
+TOPMARGIN, 7
+BOTTOMMARGIN, 155
+END
+
+IDD_DSN_CFG2, DIALOG
+BEGIN
+LEFTMARGIN, 7
+RIGHTMARGIN, 256
+TOPMARGIN, 7
+BOTTOMMARGIN, 197
+END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_ALLOC.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_ALLOC.CPP b/odbc/Driver/KO_ALLOC.CPP
new file mode 100644
index 0000000..6176e5c
--- /dev/null
+++ b/odbc/Driver/KO_ALLOC.CPP
@@ -0,0 +1,608 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_ALLOC.CPP
+//
+// Notes:   Contains function for managing allocation and release
+//          of the three structures/handles - Environment,
+//          Connection and Statement. Statements r
+//          encapsulated inside connection while all connections
+//          inside environment
+//
+// Exported functions:
+//                       SQLAllocEnv
+//                       SQLAllocConnect
+//                       SQLAllocConnect
+//                       SQLAllocStmt
+//                       SQLAllocHandle
+//                       SQLFreeStmt
+//                       SQLDisconnect
+//                       SQLFreeConnect
+//                       SQLFreeHandle
+//                       SQLFreeEnv
+// ----------------------------------------------------------------------------
+
+#include "stdafx.h"
+
+// --------------------------- local functions --------------------------------
+static eGoodBad         _SQLAttachStmt ( pODBCConn pConn, pODBCStmt pStmt );
+static eGoodBad         _SQLDetachStmt ( pODBCConn pConn, pODBCStmt pStmt );
+
+static RETCODE SQL_API _SQLFreeStmtResult ( pODBCStmt pHandle );
+static RETCODE SQL_API _SQLFreeStmtCols ( pODBCStmt pHandle );
+static RETCODE SQL_API _SQLFreeStmtParams ( pODBCStmt pHandle );
+static RETCODE SQL_API _SQLFreeStmtAll ( pODBCStmt pHandle );
+static RETCODE SQL_API _SQLFreeStmts ( pODBCStmt pHandle );
+
+static eGoodBad         _SQLAttachConn ( pODBCEnv pEnv, pODBCConn pConn );
+static eGoodBad         _SQLDetachConn ( pODBCEnv pEnv, pODBCConn pConn );
+
+
+static RETCODE SQL_API _SQLFreeConnect ( pODBCConn pHandle );
+static RETCODE SQL_API _SQLFreeConnects ( pODBCConn pHandle );
+
+static RETCODE SQL_API _SQLFreeEnv ( pODBCEnv pHandle );
+
+
+// -----------------------------------------------------------------------
+// to allocate a environment
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLAllocEnv ( HENV* pOutputHandlePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLAllocEnv called" ) );
+    pODBCEnv     env = NULL;
+    
+    // precaution
+    if ( pOutputHandlePtr == 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLAllocEnv - bad params" ) );
+        return SQL_ERROR;
+    }
+    
+    // initializations
+    *pOutputHandlePtr = 0;
+    // allocate an env
+    env = new ODBCEnv;
+    // clear the env attributes
+    memset ( env, 0, sizeof ( ODBCEnv ) );
+    // set the handle signature
+    ( ( pODBCEnv ) env )->Sign = SQL_HANDLE_ENV;
+    // default values
+    ( ( pODBCEnv ) env )->AttrODBCVersion =
+        SQL_OV_ODBC3;                        // SQL_ATTR_ODBC_VERSION                200
+    ( ( pODBCEnv ) env )->AttrConnPooling =
+        SQL_CP_OFF;                          // SQL_ATTR_CONNECTION_POOLING          201
+    ( ( pODBCEnv ) env )->AttrCPMatch     =
+        SQL_CP_STRICT_MATCH;                 // SQL_ATTR_CP_MATCH                    202
+    ( ( pODBCEnv ) env )->AttrOutputNTS   = SQL_TRUE;                            // SQL_ATTR_OUTPUT_NTS
+    // pass back to caller
+    *pOutputHandlePtr = ( HENV ) env;
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to allocate a connection
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLAllocConnect ( HENV pEnvHandle, HDBC* pOutputHandlePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLAllocConnect called" ) );
+    pODBCConn    conn;
+    __CHK_HANDLE ( pEnvHandle, SQL_HANDLE_ENV, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGENV ( pEnvHandle ) );
+    
+    // precaution
+    if ( pOutputHandlePtr == 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLAllocConnect - bad params" ) );
+        return SQL_ERROR;
+    }
+    
+    // initializations
+    *pOutputHandlePtr = 0;
+    // allocate a conn
+    conn = new ODBCConn;
+    // clear the conn attributes
+    memset ( conn, 0, sizeof ( ODBCConn ) );
+    // set the handle signature
+    ( ( pODBCConn ) conn )->Sign = SQL_HANDLE_DBC;
+    // default values
+    ( ( pODBCConn ) conn )->AccessMode      = SQL_MODE_READ_ONLY;
+    ( ( pODBCConn ) conn )->AutoIPD         = SQL_FALSE;
+    ( ( pODBCConn ) conn )->AsyncEnable     = SQL_ASYNC_ENABLE_OFF;
+    ( ( pODBCConn ) conn )->AutoCommit      = SQL_AUTOCOMMIT_ON;
+    ( ( pODBCConn ) conn )->TimeOut         = 0;
+    ( ( pODBCConn ) conn )->LoginTimeOut    = 0;
+    ( ( pODBCConn ) conn )->MetaDataID      = SQL_FALSE;
+    ( ( pODBCConn ) conn )->ODBCCursors     = SQL_CUR_USE_DRIVER;
+    ( ( pODBCConn ) conn )->Window          = NULL;
+    ( ( pODBCConn ) conn )->TxnIsolation    = 0;
+    ( ( pODBCConn ) conn )->MaxRows         = 0;
+    ( ( pODBCConn ) conn )->QueryTimeout    = 0;
+    // attach it to link list
+    _SQLAttachConn ( ( pODBCEnv ) pEnvHandle, conn );
+    // pass back conn to caller
+    *pOutputHandlePtr = ( HDBC ) conn;
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to allocate a statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLAllocStmt ( HDBC pConnHandle, HSTMT* pOutputHandlePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLAllocStmt called" ) );
+    pODBCStmt    stmt = NULL;
+    __CHK_HANDLE ( pConnHandle, SQL_HANDLE_DBC, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGCONN ( pConnHandle ) );
+    
+    // precaution
+    if ( pOutputHandlePtr == 0 ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "SQLAllocStmt - bad params" ) );
+        return SQL_ERROR;
+    }
+    
+    // initializations
+    *pOutputHandlePtr = 0;
+    // allocate a stmt
+    stmt = new ODBCStmt;
+    // clear the stmt attributes
+    memset ( stmt, 0, sizeof ( ODBCStmt ) );
+    // set the handle signature
+    ( ( pODBCStmt ) stmt )->Sign = SQL_HANDLE_STMT;
+    // default values
+    ( ( pODBCStmt ) stmt )->AsyncEnable         = SQL_ASYNC_ENABLE_OFF;
+    ( ( pODBCStmt ) stmt )->Concurrency         = SQL_CONCUR_READ_ONLY;
+    ( ( pODBCStmt ) stmt )->CursorScroll        = SQL_NONSCROLLABLE;
+    ( ( pODBCStmt ) stmt )->CursorSensitivity   = SQL_UNSPECIFIED;
+    ( ( pODBCStmt ) stmt )->CursorType          = SQL_CURSOR_FORWARD_ONLY;
+    ( ( pODBCStmt ) stmt )->AutoIPD             = SQL_FALSE;
+    ( ( pODBCStmt ) stmt )->KeysetSize          = 0;
+    ( ( pODBCStmt ) stmt )->MetaDataID          = SQL_FALSE;
+    ( ( pODBCStmt ) stmt )->NoScan              = SQL_NOSCAN_OFF;
+    ( ( pODBCStmt ) stmt )->QryTimeout          = 0;
+    ( ( pODBCStmt ) stmt )->RetrieveData        = SQL_RD_DEFAULT;
+    // set descriptor defaults
+    _SQLSetARDFieldsDefault ( & ( ( ( pODBCStmt ) stmt )->ARD ), ( pODBCStmt ) stmt );
+    _SQLSetAPDFieldsDefault ( & ( ( ( pODBCStmt ) stmt )->APD ), ( pODBCStmt ) stmt );
+    _SQLSetIRDFieldsDefault ( & ( ( ( pODBCStmt ) stmt )->IRD ), ( pODBCStmt ) stmt );
+    _SQLSetIPDFieldsDefault ( & ( ( ( pODBCStmt ) stmt )->IPD ), ( pODBCStmt ) stmt );
+    // attach it to link list
+    _SQLAttachStmt ( ( pODBCConn ) pConnHandle, stmt );
+    // pass back to caller
+    *pOutputHandlePtr = ( HSTMT ) stmt;
+    // ???? debug log message
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "New stmt: %d", stmt ) );
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to allocate a handle for env, conn or stmt
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLAllocHandle ( SQLSMALLINT pHandleType, SQLHANDLE pInputHandle, SQLHANDLE*  pOutputHandlePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLAllocHandle called" ) );
+    
+    switch ( pHandleType ) {
+        case SQL_HANDLE_ENV:
+            return SQLAllocEnv ( pOutputHandlePtr );                        // allocate environment
+            
+        case SQL_HANDLE_DBC:
+            return SQLAllocConnect ( pInputHandle, pOutputHandlePtr );      // allocate connection
+            
+        case SQL_HANDLE_STMT:
+            return SQLAllocStmt ( pInputHandle, pOutputHandlePtr );         // allocate statement
+            
+        case SQL_HANDLE_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLAllocHandle - Explicit descriptor requested - not supported" ) );
+            return SQL_ERROR;                                             // allocate a descriptor
+    }
+    
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to free an existing statement handle
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLFreeStmt ( SQLHSTMT pStmt, SQLUSMALLINT pOption ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "SQLFreeStmt called, %d with option %d", pStmt, pOption ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    // check the operation to perform
+    switch ( pOption ) {
+        case SQL_UNBIND:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFreeStmt called for Col bindings" ) );
+            return _SQLFreeStmtCols ( ( pODBCStmt ) pStmt );
+            
+        case SQL_RESET_PARAMS:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFreeStmt called for params" ) );
+            return _SQLFreeStmtParams ( ( pODBCStmt ) pStmt );
+            
+        default:            // include SQL_CLOSE:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFreeStmt called for Result" ) );
+            return _SQLFreeStmtResult ( ( pODBCStmt ) pStmt );
+    }
+}
+
+
+// -----------------------------------------------------------------------
+// to disconnect from sever is a state is maintained on a connection
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLDisconnect ( HDBC pHandle ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "SQLDisconnect called" ) );
+    __CHK_HANDLE ( pHandle, SQL_HANDLE_DBC, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGCONN ( pHandle ) );
+    // free the connection
+    RETCODE code =  _SQLDisconnect ( ( pODBCConn ) pHandle );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDisconnect exited" ) );
+    return code;
+}
+
+// -----------------------------------------------------------------------
+// to free an existing connection handle
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLFreeConnect ( HDBC pHandle ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "SQLFreeConnect called" ) );
+    __CHK_HANDLE ( pHandle, SQL_HANDLE_DBC, SQL_ERROR );
+    // free the connection
+    RETCODE code =  _SQLFreeConnect ( ( pODBCConn ) pHandle );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFreeConnect Exited" ) );
+    return code;
+}
+
+
+// -----------------------------------------------------------------------
+// to free an existing environment handle
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLFreeEnv ( HENV pHandle ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "SQLFreeEnv called" ) );
+    __CHK_HANDLE ( pHandle, SQL_HANDLE_ENV, SQL_ERROR );
+    // free the env
+    return _SQLFreeEnv ( ( pODBCEnv ) pHandle );
+}
+
+// -----------------------------------------------------------------------
+// to free an environment, connection or stmt
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLFreeHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "SQLFreeHandle called, Handle Type: %d, Handle: %d", pHandleType,
+                              ( Long ) pHandle ) );
+    __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR );
+    
+    // as per the handle type
+    switch ( pHandleType ) {
+        case SQL_HANDLE_ENV:
+            return _SQLFreeEnv ( ( pODBCEnv ) pHandle );                 // free environment
+            
+        case SQL_HANDLE_DBC:
+            return _SQLFreeConnect ( ( pODBCConn ) pHandle );            // free conenction
+            
+        case SQL_HANDLE_STMT:
+            return _SQLFreeStmtAll ( ( pODBCStmt ) pHandle );            // free statement
+            
+        case SQL_HANDLE_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLFreeHandle called for descriptor" ) );
+            return SQL_ERROR;                             // free descriptor
+    }
+    
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to attach a new stmt to STMT link list in CONN
+// -----------------------------------------------------------------------
+
+static eGoodBad _SQLAttachStmt ( pODBCConn pConn, pODBCStmt pStmt ) {
+    pODBCStmt     l;
+    
+    // precaution
+    if ( pConn == NULL || pStmt == NULL )
+    { return BAD; }
+    
+    // set conn as stmt container
+    pStmt->Conn = pConn;
+    
+    // check if this is the first item
+    if ( pConn->Stmts == NULL ) {
+        // set as first and only item
+        pConn->Stmts  = pStmt;
+        pStmt->Prev   = NULL;
+        pStmt->Next   = NULL;
+        return GOOD;
+    }
+    
+    // move to tail item
+    for ( l = pConn->Stmts; l->Next != NULL; l = l->Next );
+    
+    // attach to tail
+    l->Next         = pStmt;
+    pStmt->Prev     = l;
+    pStmt->Next     = NULL;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to detach an existing stmt from link list
+// -----------------------------------------------------------------------
+
+static eGoodBad _SQLDetachStmt ( pODBCConn pConn, pODBCStmt pStmt ) {
+    // precaution
+    if ( pConn == NULL || pStmt == NULL )
+    { return BAD; }
+    
+    if ( pStmt->Prev )
+    { ( pStmt->Prev )->Next = pStmt->Next; }        // attach prev to next
+    
+    else
+    { pConn->Stmts = pStmt->Next; }                 // set head to next if any
+    
+    if ( pStmt->Next )
+    { ( pStmt->Next )->Prev = pStmt->Prev; }        // set next to prev if any
+    
+    return GOOD;
+}
+
+
+// -----------------------------------------------------------------------
+// free the cursor/results associated with the specified stmt
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeStmtResult ( pODBCStmt pHandle ) {
+    // note
+    // assumes handle already checked
+    
+    // basic stmt
+    if ( pHandle->Stmt ) {
+        delete[] pHandle->Stmt;
+        pHandle->Stmt = NULL;
+    }
+    
+    // basic stmt
+    pHandle->StmtLen    = 0;
+    pHandle->Prepared   = FALSE;
+    pHandle->CurRowsetStartRow      = NULL;                         // start of current rowset
+    pHandle->CurRowsetStartRowPos   = 0;                            // absolute position
+    pHandle->CurRowsetEndRow        = NULL;                         // end of current rowset
+    pHandle->CurRowsetEndRowPos     = 0;                            // absolute position
+    pHandle->RowCount       = 0;
+    _SQLFreeIRDContent ( & ( pHandle->IRD ) );
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// free all the cols bound to a specified stmt
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeStmtCols ( pODBCStmt pHandle ) {
+    // note
+    // assumes handle already checked
+    return _SQLFreeARDContent ( & ( pHandle->ARD ) );
+}
+
+
+// -----------------------------------------------------------------------
+// free all the params bound to a particular stmt
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeStmtParams ( pODBCStmt pHandle ) {
+    // note always called as a sub-function so no diag reset
+    // to be implemented along with
+    // other details of parms
+    return _SQLFreeAPDContent ( & ( pHandle->APD ) );
+}
+
+
+// -----------------------------------------------------------------------
+// to free the stmt itself  & others associated items like ARD, APD etc
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeStmtAll ( pODBCStmt pHandle ) {
+    _SQLFreeDiag ( _DIAGSTMT ( pHandle ) );
+    // note always called as a sub-function so no diag reset
+    pODBCConn    conn;
+    // extract the container connection
+    conn = pHandle->Conn;
+    
+    // check if valid
+    if ( conn == NULL )
+    { return SQL_ERROR; }
+    
+    // pluck from link-list
+    _SQLDetachStmt ( conn, pHandle );
+    // clear/free results
+    _SQLFreeStmtResult ( pHandle );
+    // clear/free col bindings
+    _SQLFreeStmtCols ( pHandle );
+    // clear/free parms bindings
+    _SQLFreeStmtParams ( pHandle );
+    // now free the structure itself
+    delete pHandle;
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to all the stmts starting from the specified stmt
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeStmts ( pODBCStmt pHandle ) {
+    pODBCStmt    t, n;
+    
+    // loop to iterate the list
+    for ( n = pHandle; n != NULL; ) {
+        t = n;
+        n = n->Next;
+        _SQLFreeStmtAll ( t );
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to attach a new conn to CONN link list in ENV
+// -----------------------------------------------------------------------
+
+static eGoodBad _SQLAttachConn ( pODBCEnv pEnv, pODBCConn pConn ) {
+    pODBCConn     l;
+    
+    // precaution
+    if ( pEnv == NULL || pConn == NULL )
+    { return BAD; }
+    
+    // set env as container for conn
+    pConn->Env = pEnv;
+    
+    // check if this is the first item
+    if ( pEnv->Conns == NULL ) {
+        // set as first and only item
+        pEnv->Conns   = pConn;
+        pConn->Prev   = NULL;
+        pConn->Next   = NULL;
+        return GOOD;
+    }
+    
+    // move to tail item
+    for ( l = pEnv->Conns; l->Next != NULL; l = l->Next );
+    
+    // attach to tail
+    l->Next         = pConn;
+    pConn->Prev     = l;
+    pConn->Next     = NULL;
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to detach an existing item from ARD link-list
+// -----------------------------------------------------------------------
+
+static eGoodBad _SQLDetachConn ( pODBCEnv pEnv, pODBCConn pConn ) {
+    // precaution
+    if ( pEnv == NULL || pConn == NULL )
+    { return BAD; }
+    
+    if ( pConn->Prev )
+    { ( pConn->Prev )->Next = pConn->Next; }        // attach prev to next
+    
+    else
+    { pEnv->Conns = pConn->Next; }                 // set head to next if any
+    
+    if ( pConn->Next )
+    { ( pConn->Next )->Prev = pConn->Prev; }        // set next to prev if any
+    
+    return GOOD;
+}
+
+// -----------------------------------------------------------------------
+// to free all info associated with a connection but not the conenction itself
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLDisconnect ( pODBCConn pHandle ) {
+    pHandle->IsConnected = FALSE;
+    
+    if ( pHandle->ConnectStr ) {
+        delete[] pHandle->ConnectStr;
+        pHandle->ConnectStr = NULL;
+    }
+    
+    if ( pHandle->Server ) {
+        delete[] pHandle->Server;
+        pHandle->Server = NULL;
+    }
+    
+    if ( pHandle->Project ) {
+        delete[] pHandle->Project;
+        pHandle->Project = NULL;
+    }
+    
+    if ( pHandle->UserName ) {
+        delete[] pHandle->UserName;
+        pHandle->UserName = NULL;
+    }
+    
+    if ( pHandle->Password ) {
+        delete[] pHandle->Password;
+        pHandle->Password = NULL;
+    }
+    
+    // free all associated statements
+    if ( pHandle->Stmts ) {                                 // all stmts within connection
+        _SQLFreeStmts ( pHandle->Stmts );
+        pHandle->Stmts = NULL;
+    }
+    
+    //free meta
+    if ( pHandle->meta ) {
+        pHandle->meta = NULL;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to free a specifed connection, plucks from parent/list AND FREEs it
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeConnect ( pODBCConn pHandle ) {
+    _SQLFreeDiag ( _DIAGCONN ( pHandle ) );
+    pODBCEnv     env;
+    // disconnect
+    _SQLDisconnect ( pHandle );
+    // extract the container environment
+    env = pHandle->Env;
+    
+    // check if valid
+    if ( env == NULL ) { return SQL_ERROR; }
+    
+    // detach from link list
+    _SQLDetachConn ( env, pHandle );
+    // now free the structure itself
+    delete pHandle;
+    // reset
+    pHandle = NULL;
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to all the connections starting from the specified connection
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeConnects ( pODBCConn pHandle ) {
+    pODBCConn    t, n;
+    
+    // loop to iterate the list of connections
+    for ( n = pHandle; n != NULL; ) {
+        t = n;                      // save
+        n = n->Next;                // get next
+        _SQLFreeConnect ( t );      // free saved
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to free the specified env
+// -----------------------------------------------------------------------
+
+static RETCODE SQL_API _SQLFreeEnv ( pODBCEnv pHandle ) {
+    // free diags if any
+    _SQLFreeDiag ( _DIAGENV ( pHandle ) );
+    
+    // check if any connections are allocated
+    if ( pHandle->Conns ) {
+        //_SQLFreeConnects ( pHandle->Conns );                    // relase all connections
+    }
+    
+    delete pHandle;
+    return SQL_SUCCESS;
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_ATTR.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_ATTR.CPP b/odbc/Driver/KO_ATTR.CPP
new file mode 100644
index 0000000..e9016b4
--- /dev/null
+++ b/odbc/Driver/KO_ATTR.CPP
@@ -0,0 +1,897 @@
+// ----------------------------------------------------------------------------
+//
+// File:    KO_ATTR.CPP
+//
+// Notes:   Contains the attribute/option set/get functions
+//          for environment, connection and statement
+//          also contains some other functions like setting of
+//          cursor name etc.
+//
+// Exported functions:
+//                       SQLSetEnvAttr
+//                       SQLGetEnvAttr
+//                       SQLSetConnectAttr
+//                       SQLGetConnectAttr
+//                       SQLSetStmtAttr
+//                       SQLGetStmtAttr
+//                       SQLGetCursorName
+//                       SQLSetCursorName
+// ----------------------------------------------------------------------------
+
+#include "stdafx.h"
+
+
+// -----------------------------------------------------------------------
+// to set environment specific attributes
+// -----------------------------------------------------------------------
+
+
+RETCODE SQL_API SQLSetEnvAttr ( SQLHENV pEnv, SQLINTEGER pAttr, SQLPOINTER pDataPtr, SQLINTEGER pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetEnvAttr called" ) );
+    __CHK_HANDLE ( pEnv, SQL_HANDLE_ENV, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGENV ( pEnv ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_ODBC_VERSION:
+            ( ( pODBCEnv ) pEnv )->AttrODBCVersion = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CONNECTION_POOLING:
+            ( ( pODBCEnv ) pEnv )->AttrConnPooling = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CP_MATCH:
+            ( ( pODBCEnv ) pEnv )->AttrCPMatch = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_OUTPUT_NTS:
+            ( ( pODBCEnv ) pEnv )->AttrOutputNTS = ( ULong ) pDataPtr;
+            break;
+            
+        default:
+            return SQL_ERROR;                   // unknown attribute
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get current value of specified env attribute
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetEnvAttr ( SQLHENV     pEnv,
+                                SQLINTEGER  pAttr,
+                                SQLPOINTER  pDataPtr,
+                                SQLINTEGER  pDataSize,
+                                SQLINTEGER* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetEnvAttr called" ) );
+    __CHK_HANDLE ( pEnv, SQL_HANDLE_ENV, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGENV ( pEnv ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_ODBC_VERSION:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv )->AttrODBCVersion;
+            break;
+            
+        case SQL_ATTR_CONNECTION_POOLING:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv )->AttrConnPooling;
+            break;
+            
+        case SQL_ATTR_CP_MATCH:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv )->AttrCPMatch;
+            break;
+            
+        case SQL_ATTR_OUTPUT_NTS:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv )->AttrOutputNTS;
+            break;
+            
+        default:
+            return SQL_ERROR;                   // unknown attribute
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// --------------------------------------------------------------------
+// to set attributes specific to a connection
+// --------------------------------------------------------------------
+RETCODE SQL_API SQLSetConnectAttrW ( SQLHDBC            hdbc,
+                                     SQLINTEGER         fAttribute,
+                                     SQLPOINTER         rgbValue,
+                                     SQLINTEGER         cbValue ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetConnectAttrW, Attr: %d, DataPtr: %d, DataSize: %d", fAttribute,
+                              rgbValue, cbValue ) );
+    RETCODE code = SQLSetConnectAttr ( hdbc, fAttribute, rgbValue, cbValue );
+    return code;
+}
+
+
+RETCODE SQL_API SQLSetConnectAttr ( SQLHDBC pConn, SQLINTEGER pAttr, SQLPOINTER pDataPtr, SQLINTEGER pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetConnectAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    __CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_ANSI_APP:
+            return  SQL_ERROR;
+            
+        case SQL_ATTR_ACCESS_MODE:
+            ( ( pODBCConn ) pConn )->AccessMode = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_ASYNC_ENABLE:
+            ( ( pODBCConn ) pConn )->AsyncEnable = ( ULong ) pDataPtr;
+            break;
+            
+        //case SQL_ATTR_AUTO_IPD:  read-only
+        
+        case SQL_ATTR_AUTOCOMMIT:
+            ( ( pODBCConn ) pConn )->AutoCommit = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CONNECTION_DEAD:
+            // (( pODBCConn )pConn)->AutoCommit = ( ULong )pDataPtr;
+            break;
+            
+        case SQL_ATTR_CONNECTION_TIMEOUT:
+            //(( pODBCConn )pConn)->TimeOut = *(( ULong* )pDataPtr );
+            break;
+            
+        case SQL_ATTR_CURRENT_CATALOG:          // current database
+            // assumes that current database is what it should be
+            // return _SQLCopyCharData ( _DIAGCONN(pConn), (( pODBCConn )pConn)->CurrDB, 32, NULL, 16, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_LOGIN_TIMEOUT:
+            // (( pODBCConn )pConn)->LoginTimeOut = *(( ULong* )pDataPtr );
+            break;
+            
+        case SQL_ATTR_METADATA_ID:
+            ( ( pODBCConn ) pConn )->MetaDataID = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_ODBC_CURSORS:
+            ( ( pODBCConn ) pConn )->ODBCCursors = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_PACKET_SIZE:
+            // not a typical option
+            return SQL_ERROR;
+            
+        case SQL_ATTR_QUIET_MODE:
+            ( ( pODBCConn ) pConn )->Window = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_TRACE:
+            // only for driver manager
+            break;
+            
+        case SQL_ATTR_TRACEFILE:
+            // only for driver manager
+            break;
+            
+        case SQL_ATTR_TRANSLATE_LIB:
+            // translation still not implemented
+            break;
+            
+        case SQL_ATTR_TRANSLATE_OPTION:
+            // translation still not implemented
+            break;
+            
+        case SQL_ATTR_TXN_ISOLATION:
+            ( ( pODBCConn ) pConn )->TxnIsolation = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_MAX_ROWS:
+            ( ( pODBCConn ) pConn )->MaxRows = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_QUERY_TIMEOUT:
+            ( ( pODBCConn ) pConn )->QueryTimeout = ( ULong ) pDataPtr;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetConnectAttr is not recognized, Attr: %d, DataPtr: %d, DataSize: %d", pAttr,
+                                         pDataPtr, pDataSize ) );
+            return SQL_SUCCESS;
+    }
+    
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetConnectAttr, Attr: %d, DataPtr: %d, DataSize: %d is done!", pAttr,
+                              pDataPtr, pDataSize ) );
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get current value of specified conn attribute
+// -----------------------------------------------------------------------
+RETCODE SQL_API SQLGetConnectAttrW ( SQLHDBC     pConn,
+                                     SQLINTEGER  pAttr,
+                                     SQLPOINTER  pDataPtr,
+                                     SQLINTEGER  pDataSize,
+                                     SQLINTEGER* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetConnectAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    __CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_ACCESS_MODE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AccessMode;
+            break;
+            
+        case SQL_ATTR_ASYNC_ENABLE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AsyncEnable;
+            break;
+            
+        case SQL_ATTR_AUTO_IPD:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AutoIPD;
+            break;
+            
+        case SQL_ATTR_AUTOCOMMIT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AutoCommit;
+            break;
+            
+        case SQL_ATTR_CONNECTION_DEAD:
+            * ( ( ULong* ) pDataPtr ) = SQL_CD_TRUE;
+            break;
+            
+        case SQL_ATTR_CONNECTION_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->TimeOut;
+            break;
+            
+        case SQL_ATTR_CURRENT_CATALOG:          // current database
+            return _SQLCopyWCharData ( _DIAGCONN ( pConn ), pDataPtr, pDataSize, pDataSizePtr, 32, "default", -1 );
+            
+        case SQL_ATTR_LOGIN_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->LoginTimeOut;
+            break;
+            
+        case SQL_ATTR_METADATA_ID:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->MetaDataID;
+            break;
+            
+        case SQL_ATTR_ODBC_CURSORS:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->ODBCCursors;
+            break;
+            
+        case SQL_ATTR_PACKET_SIZE:
+            return SQL_ERROR;                       // not a typical option
+            
+        case SQL_ATTR_QUIET_MODE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->Window;
+            break;
+            
+        case SQL_ATTR_TRACE:
+            // basically for driver manager
+            break;
+            
+        case SQL_ATTR_TRACEFILE:
+            // basically for driver manager
+            break;
+            
+        case SQL_ATTR_TRANSLATE_LIB:
+            // not implemented
+            break;
+            
+        case SQL_ATTR_TRANSLATE_OPTION:
+            // not implemented
+            break;
+            
+        case SQL_ATTR_TXN_ISOLATION:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->TxnIsolation;
+            break;
+            
+        case SQL_ATTR_MAX_ROWS:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->MaxRows;
+            break;
+            
+        case SQL_ATTR_QUERY_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->QueryTimeout;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetConnectAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr, pDataSize ) );
+            return SQL_SUCCESS;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+RETCODE SQL_API SQLGetConnectAttr ( SQLHDBC     pConn,
+                                    SQLINTEGER  pAttr,
+                                    SQLPOINTER  pDataPtr,
+                                    SQLINTEGER  pDataSize,
+                                    SQLINTEGER* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetConnectAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    __CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_ACCESS_MODE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AccessMode;
+            break;
+            
+        case SQL_ATTR_ASYNC_ENABLE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AsyncEnable;
+            break;
+            
+        case SQL_ATTR_AUTO_IPD:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AutoIPD;
+            break;
+            
+        case SQL_ATTR_AUTOCOMMIT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->AutoCommit;
+            break;
+            
+        case SQL_ATTR_CONNECTION_DEAD:
+            * ( ( ULong* ) pDataPtr ) = SQL_CD_TRUE;
+            break;
+            
+        case SQL_ATTR_CONNECTION_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->TimeOut;
+            break;
+            
+        case SQL_ATTR_CURRENT_CATALOG:          // current database
+            return _SQLCopyCharData ( _DIAGCONN ( pConn ), pDataPtr, pDataSize, pDataSizePtr, 32, "default", -1 );
+            
+        case SQL_ATTR_LOGIN_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->LoginTimeOut;
+            break;
+            
+        case SQL_ATTR_METADATA_ID:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->MetaDataID;
+            break;
+            
+        case SQL_ATTR_ODBC_CURSORS:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->ODBCCursors;
+            break;
+            
+        case SQL_ATTR_PACKET_SIZE:
+            return SQL_ERROR;                       // not a typical option
+            
+        case SQL_ATTR_QUIET_MODE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->Window;
+            break;
+            
+        case SQL_ATTR_TRACE:
+            // basically for driver manager
+            break;
+            
+        case SQL_ATTR_TRACEFILE:
+            // basically for driver manager
+            break;
+            
+        case SQL_ATTR_TRANSLATE_LIB:
+            // not implemented
+            break;
+            
+        case SQL_ATTR_TRANSLATE_OPTION:
+            // not implemented
+            break;
+            
+        case SQL_ATTR_TXN_ISOLATION:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->TxnIsolation;
+            break;
+            
+        case SQL_ATTR_MAX_ROWS:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->MaxRows;
+            break;
+            
+        case SQL_ATTR_QUERY_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn )->QueryTimeout;
+            break;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetConnectAttr not recognized, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                                         pDataSize ) );
+            return SQL_SUCCESS;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// --------------------------------------------------------------------
+// to set attributes specific to a statement
+// --------------------------------------------------------------------
+
+
+RETCODE SQL_API SQLSetStmtAttrW ( SQLHSTMT       pStmt,
+                                  SQLINTEGER     pAttr,
+                                  SQLPOINTER     pDataPtr,
+                                  SQLINTEGER     pDataSize )
+
+{
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetStmtAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_APP_PARAM_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_PARAM_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_APP_ROW_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_ROW_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_ASYNC_ENABLE:
+            ( ( pODBCStmt ) pStmt )->AsyncEnable = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CONCURRENCY:
+            ( ( pODBCStmt ) pStmt )->Concurrency = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CURSOR_SCROLLABLE:
+            ( ( pODBCStmt ) pStmt )->CursorScroll = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CURSOR_SENSITIVITY:
+            ( ( pODBCStmt ) pStmt )->CursorSensitivity = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CURSOR_TYPE:
+            ( ( pODBCStmt ) pStmt )->CursorType = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_ENABLE_AUTO_IPD:
+            ( ( pODBCStmt ) pStmt )->AutoIPD = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_FETCH_BOOKMARK_PTR:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_FETCH_BOOKMARK_PTR - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_IMP_PARAM_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_PARAM_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_IMP_ROW_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_ROW_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_KEYSET_SIZE:
+            ( ( pODBCStmt ) pStmt )->KeysetSize = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_MAX_LENGTH:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_LENGTH - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_MAX_ROWS:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_ROWS - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_METADATA_ID:
+            ( ( pODBCStmt ) pStmt )->MetaDataID = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_NOSCAN:
+            ( ( pODBCStmt ) pStmt )->NoScan = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_PARAM_BIND_TYPE:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAM_BIND_OFFSET_PTR:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAM_OPERATION_PTR:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAM_STATUS_PTR:
+            _SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt )->IPD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAMS_PROCESSED_PTR:
+            // ???? note there is an error in MSDN on SQLSetDescField which says ARD/APD instead of IRD/IPD for this option
+            _SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt )->IPD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAMSET_SIZE:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_QUERY_TIMEOUT:
+            if ( pDataPtr != NULL )
+            { ( ( pODBCStmt ) pStmt )->QryTimeout = ( ( ULong ) pDataPtr ); }
+            
+            break;
+            
+        case SQL_ATTR_RETRIEVE_DATA:
+            ( ( pODBCStmt ) pStmt )->RetrieveData = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ROWSET_SIZE:
+        case SQL_ATTR_ROW_ARRAY_SIZE:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_BIND_OFFSET_PTR:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_BIND_TYPE:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_OPERATION_PTR:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_STATUS_PTR:
+            _SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROWS_FETCHED_PTR:
+            _SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_SIMULATE_CURSOR:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_SIMULATE_CURSOR - option not implemented" ) );
+            return SQL_ERROR;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetStmtAttrW : Stmt attr - unknown %d", pAttr ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+RETCODE SQL_API SQLSetStmtAttr ( SQLHSTMT       pStmt,
+                                 SQLINTEGER     pAttr,
+                                 SQLPOINTER     pDataPtr,
+                                 SQLINTEGER     pDataSize )
+
+{
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetStmtAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_APP_PARAM_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_PARAM_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_APP_ROW_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_ROW_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_ASYNC_ENABLE:
+            ( ( pODBCStmt ) pStmt )->AsyncEnable = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CONCURRENCY:
+            ( ( pODBCStmt ) pStmt )->Concurrency = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CURSOR_SCROLLABLE:
+            ( ( pODBCStmt ) pStmt )->CursorScroll = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CURSOR_SENSITIVITY:
+            ( ( pODBCStmt ) pStmt )->CursorSensitivity = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_CURSOR_TYPE:
+            ( ( pODBCStmt ) pStmt )->CursorType = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_ENABLE_AUTO_IPD:
+            ( ( pODBCStmt ) pStmt )->AutoIPD = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_FETCH_BOOKMARK_PTR:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_FETCH_BOOKMARK_PTR - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_IMP_PARAM_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_PARAM_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_IMP_ROW_DESC:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_ROW_DESC - Cannot set descriptor" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_KEYSET_SIZE:
+            ( ( pODBCStmt ) pStmt )->KeysetSize = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_MAX_LENGTH:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_LENGTH - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_MAX_ROWS:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_ROWS - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_METADATA_ID:
+            ( ( pODBCStmt ) pStmt )->MetaDataID = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_NOSCAN:
+            ( ( pODBCStmt ) pStmt )->NoScan = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ATTR_PARAM_BIND_TYPE:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAM_BIND_OFFSET_PTR:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAM_OPERATION_PTR:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAM_STATUS_PTR:
+            _SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt )->IPD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAMS_PROCESSED_PTR:
+            // ???? note there is an error in MSDN on SQLSetDescField which says ARD/APD instead of IRD/IPD for this option
+            _SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt )->IPD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_PARAMSET_SIZE:
+            _SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_QUERY_TIMEOUT:
+            if ( pDataPtr != NULL )
+            { ( ( pODBCStmt ) pStmt )->QryTimeout = * ( ( ULong* ) pDataPtr ); }
+            
+            break;
+            
+        case SQL_ATTR_RETRIEVE_DATA:
+            ( ( pODBCStmt ) pStmt )->RetrieveData = ( ULong ) pDataPtr;
+            break;
+            
+        case SQL_ROWSET_SIZE:
+        case SQL_ATTR_ROW_ARRAY_SIZE:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_BIND_OFFSET_PTR:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_BIND_TYPE:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_OPERATION_PTR:
+            _SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROW_STATUS_PTR:
+            _SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_ROWS_FETCHED_PTR:
+            _SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
+            break;
+            
+        case SQL_ATTR_SIMULATE_CURSOR:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_SIMULATE_CURSOR - option not implemented" ) );
+            return SQL_ERROR;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetStmtAttr: Stmt attr - unknown %d", pAttr ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+
+RETCODE SQL_API SQLGetStmtAttrW ( SQLHSTMT    pStmt,
+                                  SQLINTEGER  pAttr,
+                                  SQLPOINTER  pDataPtr,
+                                  SQLINTEGER  pDataSize,
+                                  SQLINTEGER* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetStmtAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    return SQLGetStmtAttr ( pStmt, pAttr, pDataPtr, pDataSize, pDataSizePtr );
+}
+
+
+// --------------------------------------------------------------------
+// to get attributes specific to a statement
+// --------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetStmtAttr ( SQLHSTMT    pStmt,
+                                 SQLINTEGER  pAttr,
+                                 SQLPOINTER  pDataPtr,
+                                 SQLINTEGER  pDataSize,
+                                 SQLINTEGER* pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetStmtAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
+                              pDataSize ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    
+    switch ( pAttr ) {
+        case SQL_ATTR_APP_PARAM_DESC:
+            * ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt )->APD );
+            break;
+            
+        case SQL_ATTR_APP_ROW_DESC:
+            * ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt )->ARD );
+            break;
+            
+        case SQL_ATTR_ASYNC_ENABLE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->AsyncEnable;
+            break;
+            
+        case SQL_ATTR_CONCURRENCY:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->Concurrency;
+            break;
+            
+        case SQL_ATTR_CURSOR_SCROLLABLE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->CursorScroll;
+            break;
+            
+        case SQL_ATTR_CURSOR_SENSITIVITY:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->CursorSensitivity;
+            break;
+            
+        case SQL_ATTR_CURSOR_TYPE:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->CursorType;
+            break;
+            
+        case SQL_ATTR_ENABLE_AUTO_IPD:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->AutoIPD;
+            break;
+            
+        case SQL_ATTR_FETCH_BOOKMARK_PTR:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_FETCH_BOOKMARK_PTR - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_IMP_PARAM_DESC:
+            * ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt )->IPD );
+            break;
+            
+        case SQL_ATTR_IMP_ROW_DESC:
+            * ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt )->IRD );
+            break;
+            
+        case SQL_ATTR_KEYSET_SIZE:
+            * ( ( Long* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->KeysetSize;
+            break;
+            
+        case SQL_ATTR_MAX_LENGTH:
+            * ( ( ULong* ) pDataPtr ) = 0;
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_LENGTH - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_MAX_ROWS:
+            * ( ( ULong* ) pDataPtr ) = 0;
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_ROWS - option not implemented" ) );
+            return SQL_ERROR;
+            
+        case SQL_ATTR_METADATA_ID:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->MetaDataID;
+            break;
+            
+        case SQL_ATTR_NOSCAN:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->NoScan;
+            break;
+            
+        case SQL_ATTR_PARAM_BIND_TYPE:
+            _SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_PARAM_BIND_OFFSET_PTR:
+            _SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_PARAM_OPERATION_PTR:
+            _SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_PARAM_STATUS_PTR:
+            _SQLGetIPDField ( & ( ( ( pODBCStmt ) pStmt )->IPD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_PARAMS_PROCESSED_PTR:
+            // ???? note there is an error in MSDN on SQLSetDescField which says ARD/APD instead of IRD/IPD for this option
+            _SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize,
+                              pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_PARAMSET_SIZE:
+            _SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt )->APD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_QUERY_TIMEOUT:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->QryTimeout;
+            break;
+            
+        case SQL_ATTR_RETRIEVE_DATA:
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->RetrieveData;
+            break;
+            
+        case SQL_ROWSET_SIZE:
+        case SQL_ATTR_ROW_ARRAY_SIZE:
+            _SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_ROW_BIND_OFFSET_PTR:
+            _SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_ROW_BIND_TYPE:
+            _SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_ROW_NUMBER:
+            // ??? in case of rowset being > 1, start row is being returned
+            * ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt )->CurRowsetStartRowPos;
+            break;
+            
+        case SQL_ATTR_ROW_OPERATION_PTR:
+            _SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt )->ARD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_ROW_STATUS_PTR:
+            _SQLGetIRDField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_ROWS_FETCHED_PTR:
+            _SQLGetIRDField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize,
+                              pDataSizePtr );
+            break;
+            
+        case SQL_ATTR_SIMULATE_CURSOR:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_SIMULATE_CURSOR - option not implemented" ) );
+            return SQL_ERROR;
+            
+        default:
+            __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetStmtAttr: Stmt attr - unknown %d", pAttr ) );
+            return SQL_ERROR;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+// --------------------------------------------------------------------
+// to get the name of the current cursor
+// --------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetCursorName ( SQLHSTMT        pStmt,
+                                   SQLCHAR*        pDataPtr,
+                                   SQLSMALLINT     pDataSize,
+                                   SQLSMALLINT*    pDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetCursorName called" ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pDataPtr, pDataSize, pDataSizePtr, 32, "default", -1 );
+    return SQL_SUCCESS;
+}
+
+// --------------------------------------------------------------------
+// to set the name of the current cursor
+// --------------------------------------------------------------------
+
+RETCODE SQL_API SQLSetCursorName ( SQLHSTMT    pStmt,
+                                   SQLCHAR*    pDataPtr,
+                                   SQLSMALLINT pDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetCursorName called" ) );
+    __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
+    _SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
+    return SQL_SUCCESS;
+}
+


[03/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer/Installer.isl
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer.isl b/odbc/Installer/Installer.isl
new file mode 100644
index 0000000..cc8a40f
--- /dev/null
+++ b/odbc/Installer/Installer.isl
@@ -0,0 +1,5716 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?xml-stylesheet type="text/xsl" href="is.xsl" ?>
+<!DOCTYPE msi [
+   <!ELEMENT msi   (summary,table*)>
+   <!ATTLIST msi version    CDATA #REQUIRED>
+   <!ATTLIST msi xmlns:dt   CDATA #IMPLIED
+                 codepage   CDATA #IMPLIED
+                 compression (MSZIP|LZX|none) "LZX">
+   
+   <!ELEMENT summary       (codepage?,title?,subject?,author?,keywords?,comments?,
+                            template,lastauthor?,revnumber,lastprinted?,
+                            createdtm?,lastsavedtm?,pagecount,wordcount,
+                            charcount?,appname?,security?)>
+                            
+   <!ELEMENT codepage      (#PCDATA)>
+   <!ELEMENT title         (#PCDATA)>
+   <!ELEMENT subject       (#PCDATA)>
+   <!ELEMENT author        (#PCDATA)>
+   <!ELEMENT keywords      (#PCDATA)>
+   <!ELEMENT comments      (#PCDATA)>
+   <!ELEMENT template      (#PCDATA)>
+   <!ELEMENT lastauthor    (#PCDATA)>
+   <!ELEMENT revnumber     (#PCDATA)>
+   <!ELEMENT lastprinted   (#PCDATA)>
+   <!ELEMENT createdtm     (#PCDATA)>
+   <!ELEMENT lastsavedtm   (#PCDATA)>
+   <!ELEMENT pagecount     (#PCDATA)>
+   <!ELEMENT wordcount     (#PCDATA)>
+   <!ELEMENT charcount     (#PCDATA)>
+   <!ELEMENT appname       (#PCDATA)>
+   <!ELEMENT security      (#PCDATA)>                            
+                                
+   <!ELEMENT table         (col+,row*)>
+   <!ATTLIST table
+                name        CDATA #REQUIRED>
+
+   <!ELEMENT col           (#PCDATA)>
+   <!ATTLIST col
+                 key       (yes|no) #IMPLIED
+                 def       CDATA #IMPLIED>
+                 
+   <!ELEMENT row            (td+)>
+   
+   <!ELEMENT td             (#PCDATA)>
+   <!ATTLIST td
+                 href       CDATA #IMPLIED
+                 dt:dt     (string|bin.base64) #IMPLIED
+                 md5        CDATA #IMPLIED>
+]>
+<msi version="2.0" xmlns:dt="urn:schemas-microsoft-com:datatypes" codepage="65001">
+	
+	<summary>
+		<codepage>1252</codepage>
+		<title>Installation Database</title>
+		<subject>KylinODBCDriver (x86)</subject>
+		<author>##ID_STRING2##</author>
+		<keywords>Installer,MSI,Database</keywords>
+		<comments>Contact:  Your local administrator</comments>
+		<template>Intel;1033</template>
+		<lastauthor>Administrator</lastauthor>
+		<revnumber>{199BE185-27D7-428A-8A62-F53B2B0B4DD5}</revnumber>
+		<lastprinted/>
+		<createdtm>06/21/1999 21:00</createdtm>
+		<lastsavedtm>07/15/2000 00:50</lastsavedtm>
+		<pagecount>200</pagecount>
+		<wordcount>0</wordcount>
+		<charcount/>
+		<appname>InstallShield Express</appname>
+		<security>1</security>
+	</summary>
+	
+	<table name="ActionText">
+		<col key="yes" def="s72">Action</col>
+		<col def="L64">Description</col>
+		<col def="L128">Template</col>
+		<row><td>Advertise</td><td>##IDS_ACTIONTEXT_Advertising##</td><td/></row>
+		<row><td>AllocateRegistrySpace</td><td>##IDS_ACTIONTEXT_AllocatingRegistry##</td><td>##IDS_ACTIONTEXT_FreeSpace##</td></row>
+		<row><td>AppSearch</td><td>##IDS_ACTIONTEXT_SearchInstalled##</td><td>##IDS_ACTIONTEXT_PropertySignature##</td></row>
+		<row><td>BindImage</td><td>##IDS_ACTIONTEXT_BindingExes##</td><td>##IDS_ACTIONTEXT_File##</td></row>
+		<row><td>CCPSearch</td><td>##IDS_ACTIONTEXT_UnregisterModules##</td><td/></row>
+		<row><td>CostFinalize</td><td>##IDS_ACTIONTEXT_ComputingSpace3##</td><td/></row>
+		<row><td>CostInitialize</td><td>##IDS_ACTIONTEXT_ComputingSpace##</td><td/></row>
+		<row><td>CreateFolders</td><td>##IDS_ACTIONTEXT_CreatingFolders##</td><td>##IDS_ACTIONTEXT_Folder##</td></row>
+		<row><td>CreateShortcuts</td><td>##IDS_ACTIONTEXT_CreatingShortcuts##</td><td>##IDS_ACTIONTEXT_Shortcut##</td></row>
+		<row><td>DeleteServices</td><td>##IDS_ACTIONTEXT_DeletingServices##</td><td>##IDS_ACTIONTEXT_Service##</td></row>
+		<row><td>DuplicateFiles</td><td>##IDS_ACTIONTEXT_CreatingDuplicate##</td><td>##IDS_ACTIONTEXT_FileDirectorySize##</td></row>
+		<row><td>FileCost</td><td>##IDS_ACTIONTEXT_ComputingSpace2##</td><td/></row>
+		<row><td>FindRelatedProducts</td><td>##IDS_ACTIONTEXT_SearchForRelated##</td><td>##IDS_ACTIONTEXT_FoundApp##</td></row>
+		<row><td>GenerateScript</td><td>##IDS_ACTIONTEXT_GeneratingScript##</td><td>##IDS_ACTIONTEXT_1##</td></row>
+		<row><td>ISLockPermissionsCost</td><td>##IDS_ACTIONTEXT_ISLockPermissionsCost##</td><td/></row>
+		<row><td>ISLockPermissionsInstall</td><td>##IDS_ACTIONTEXT_ISLockPermissionsInstall##</td><td/></row>
+		<row><td>InstallAdminPackage</td><td>##IDS_ACTIONTEXT_CopyingNetworkFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize##</td></row>
+		<row><td>InstallFiles</td><td>##IDS_ACTIONTEXT_CopyingNewFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize2##</td></row>
+		<row><td>InstallODBC</td><td>##IDS_ACTIONTEXT_InstallODBC##</td><td/></row>
+		<row><td>InstallSFPCatalogFile</td><td>##IDS_ACTIONTEXT_InstallingSystemCatalog##</td><td>##IDS_ACTIONTEXT_FileDependencies##</td></row>
+		<row><td>InstallServices</td><td>##IDS_ACTIONTEXT_InstallServices##</td><td>##IDS_ACTIONTEXT_Service2##</td></row>
+		<row><td>InstallValidate</td><td>##IDS_ACTIONTEXT_Validating##</td><td/></row>
+		<row><td>LaunchConditions</td><td>##IDS_ACTIONTEXT_EvaluateLaunchConditions##</td><td/></row>
+		<row><td>MigrateFeatureStates</td><td>##IDS_ACTIONTEXT_MigratingFeatureStates##</td><td>##IDS_ACTIONTEXT_Application##</td></row>
+		<row><td>MoveFiles</td><td>##IDS_ACTIONTEXT_MovingFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize3##</td></row>
+		<row><td>PatchFiles</td><td>##IDS_ACTIONTEXT_PatchingFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize4##</td></row>
+		<row><td>ProcessComponents</td><td>##IDS_ACTIONTEXT_UpdateComponentRegistration##</td><td/></row>
+		<row><td>PublishComponents</td><td>##IDS_ACTIONTEXT_PublishingQualifiedComponents##</td><td>##IDS_ACTIONTEXT_ComponentIDQualifier##</td></row>
+		<row><td>PublishFeatures</td><td>##IDS_ACTIONTEXT_PublishProductFeatures##</td><td>##IDS_ACTIONTEXT_FeatureColon##</td></row>
+		<row><td>PublishProduct</td><td>##IDS_ACTIONTEXT_PublishProductInfo##</td><td/></row>
+		<row><td>RMCCPSearch</td><td>##IDS_ACTIONTEXT_SearchingQualifyingProducts##</td><td/></row>
+		<row><td>RegisterClassInfo</td><td>##IDS_ACTIONTEXT_RegisterClassServer##</td><td>##IDS_ACTIONTEXT_ClassId##</td></row>
+		<row><td>RegisterComPlus</td><td>##IDS_ACTIONTEXT_RegisteringComPlus##</td><td>##IDS_ACTIONTEXT_AppIdAppTypeRSN##</td></row>
+		<row><td>RegisterExtensionInfo</td><td>##IDS_ACTIONTEXT_RegisterExtensionServers##</td><td>##IDS_ACTIONTEXT_Extension2##</td></row>
+		<row><td>RegisterFonts</td><td>##IDS_ACTIONTEXT_RegisterFonts##</td><td>##IDS_ACTIONTEXT_Font##</td></row>
+		<row><td>RegisterMIMEInfo</td><td>##IDS_ACTIONTEXT_RegisterMimeInfo##</td><td>##IDS_ACTIONTEXT_ContentTypeExtension##</td></row>
+		<row><td>RegisterProduct</td><td>##IDS_ACTIONTEXT_RegisteringProduct##</td><td>##IDS_ACTIONTEXT_1b##</td></row>
+		<row><td>RegisterProgIdInfo</td><td>##IDS_ACTIONTEXT_RegisteringProgIdentifiers##</td><td>##IDS_ACTIONTEXT_ProgID2##</td></row>
+		<row><td>RegisterTypeLibraries</td><td>##IDS_ACTIONTEXT_RegisterTypeLibs##</td><td>##IDS_ACTIONTEXT_LibId##</td></row>
+		<row><td>RegisterUser</td><td>##IDS_ACTIONTEXT_RegUser##</td><td>##IDS_ACTIONTEXT_1c##</td></row>
+		<row><td>RemoveDuplicateFiles</td><td>##IDS_ACTIONTEXT_RemovingDuplicates##</td><td>##IDS_ACTIONTEXT_FileDir##</td></row>
+		<row><td>RemoveEnvironmentStrings</td><td>##IDS_ACTIONTEXT_UpdateEnvironmentStrings##</td><td>##IDS_ACTIONTEXT_NameValueAction2##</td></row>
+		<row><td>RemoveExistingProducts</td><td>##IDS_ACTIONTEXT_RemoveApps##</td><td>##IDS_ACTIONTEXT_AppCommandLine##</td></row>
+		<row><td>RemoveFiles</td><td>##IDS_ACTIONTEXT_RemovingFiles##</td><td>##IDS_ACTIONTEXT_FileDir2##</td></row>
+		<row><td>RemoveFolders</td><td>##IDS_ACTIONTEXT_RemovingFolders##</td><td>##IDS_ACTIONTEXT_Folder1##</td></row>
+		<row><td>RemoveIniValues</td><td>##IDS_ACTIONTEXT_RemovingIni##</td><td>##IDS_ACTIONTEXT_FileSectionKeyValue##</td></row>
+		<row><td>RemoveODBC</td><td>##IDS_ACTIONTEXT_RemovingODBC##</td><td/></row>
+		<row><td>RemoveRegistryValues</td><td>##IDS_ACTIONTEXT_RemovingRegistry##</td><td>##IDS_ACTIONTEXT_KeyName##</td></row>
+		<row><td>RemoveShortcuts</td><td>##IDS_ACTIONTEXT_RemovingShortcuts##</td><td>##IDS_ACTIONTEXT_Shortcut1##</td></row>
+		<row><td>Rollback</td><td>##IDS_ACTIONTEXT_RollingBack##</td><td>##IDS_ACTIONTEXT_1d##</td></row>
+		<row><td>RollbackCleanup</td><td>##IDS_ACTIONTEXT_RemovingBackup##</td><td>##IDS_ACTIONTEXT_File2##</td></row>
+		<row><td>SelfRegModules</td><td>##IDS_ACTIONTEXT_RegisteringModules##</td><td>##IDS_ACTIONTEXT_FileFolder##</td></row>
+		<row><td>SelfUnregModules</td><td>##IDS_ACTIONTEXT_UnregisterModules##</td><td>##IDS_ACTIONTEXT_FileFolder2##</td></row>
+		<row><td>SetODBCFolders</td><td>##IDS_ACTIONTEXT_InitializeODBCDirs##</td><td/></row>
+		<row><td>StartServices</td><td>##IDS_ACTIONTEXT_StartingServices##</td><td>##IDS_ACTIONTEXT_Service3##</td></row>
+		<row><td>StopServices</td><td>##IDS_ACTIONTEXT_StoppingServices##</td><td>##IDS_ACTIONTEXT_Service4##</td></row>
+		<row><td>UnmoveFiles</td><td>##IDS_ACTIONTEXT_RemovingMoved##</td><td>##IDS_ACTIONTEXT_FileDir3##</td></row>
+		<row><td>UnpublishComponents</td><td>##IDS_ACTIONTEXT_UnpublishQualified##</td><td>##IDS_ACTIONTEXT_ComponentIdQualifier2##</td></row>
+		<row><td>UnpublishFeatures</td><td>##IDS_ACTIONTEXT_UnpublishProductFeatures##</td><td>##IDS_ACTIONTEXT_Feature##</td></row>
+		<row><td>UnpublishProduct</td><td>##IDS_ACTIONTEXT_UnpublishingProductInfo##</td><td/></row>
+		<row><td>UnregisterClassInfo</td><td>##IDS_ACTIONTEXT_UnregisterClassServers##</td><td>##IDS_ACTIONTEXT_ClsID##</td></row>
+		<row><td>UnregisterComPlus</td><td>##IDS_ACTIONTEXT_UnregisteringComPlus##</td><td>##IDS_ACTIONTEXT_AppId##</td></row>
+		<row><td>UnregisterExtensionInfo</td><td>##IDS_ACTIONTEXT_UnregisterExtensionServers##</td><td>##IDS_ACTIONTEXT_Extension##</td></row>
+		<row><td>UnregisterFonts</td><td>##IDS_ACTIONTEXT_UnregisteringFonts##</td><td>##IDS_ACTIONTEXT_Font2##</td></row>
+		<row><td>UnregisterMIMEInfo</td><td>##IDS_ACTIONTEXT_UnregisteringMimeInfo##</td><td>##IDS_ACTIONTEXT_ContentTypeExtension2##</td></row>
+		<row><td>UnregisterProgIdInfo</td><td>##IDS_ACTIONTEXT_UnregisteringProgramIds##</td><td>##IDS_ACTIONTEXT_ProgID##</td></row>
+		<row><td>UnregisterTypeLibraries</td><td>##IDS_ACTIONTEXT_UnregTypeLibs##</td><td>##IDS_ACTIONTEXT_Libid2##</td></row>
+		<row><td>WriteEnvironmentStrings</td><td>##IDS_ACTIONTEXT_EnvironmentStrings##</td><td>##IDS_ACTIONTEXT_NameValueAction##</td></row>
+		<row><td>WriteIniValues</td><td>##IDS_ACTIONTEXT_WritingINI##</td><td>##IDS_ACTIONTEXT_FileSectionKeyValue2##</td></row>
+		<row><td>WriteRegistryValues</td><td>##IDS_ACTIONTEXT_WritingRegistry##</td><td>##IDS_ACTIONTEXT_KeyNameValue##</td></row>
+	</table>
+
+	<table name="AdminExecuteSequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+		<row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+		<row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+		<row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+		<row><td>InstallAdminPackage</td><td/><td>3900</td><td>InstallAdminPackage</td><td/></row>
+		<row><td>InstallFiles</td><td/><td>4000</td><td>InstallFiles</td><td/></row>
+		<row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+		<row><td>InstallInitialize</td><td/><td>1500</td><td>InstallInitialize</td><td/></row>
+		<row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+		<row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>4010</td><td>ScheduleReboot</td><td/></row>
+	</table>
+
+	<table name="AdminUISequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+		<row><td>AdminWelcome</td><td/><td>1010</td><td>AdminWelcome</td><td/></row>
+		<row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+		<row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+		<row><td>ExecuteAction</td><td/><td>1300</td><td>ExecuteAction</td><td/></row>
+		<row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+		<row><td>SetupCompleteError</td><td/><td>-3</td><td>SetupCompleteError</td><td/></row>
+		<row><td>SetupCompleteSuccess</td><td/><td>-1</td><td>SetupCompleteSuccess</td><td/></row>
+		<row><td>SetupInitialization</td><td/><td>50</td><td>SetupInitialization</td><td/></row>
+		<row><td>SetupInterrupted</td><td/><td>-2</td><td>SetupInterrupted</td><td/></row>
+		<row><td>SetupProgress</td><td/><td>1020</td><td>SetupProgress</td><td/></row>
+	</table>
+
+	<table name="AdvtExecuteSequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+		<row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+		<row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+		<row><td>CreateShortcuts</td><td/><td>4500</td><td>CreateShortcuts</td><td/></row>
+		<row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+		<row><td>InstallInitialize</td><td/><td>1500</td><td>InstallInitialize</td><td/></row>
+		<row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+		<row><td>MsiPublishAssemblies</td><td/><td>6250</td><td>MsiPublishAssemblies</td><td/></row>
+		<row><td>PublishComponents</td><td/><td>6200</td><td>PublishComponents</td><td/></row>
+		<row><td>PublishFeatures</td><td/><td>6300</td><td>PublishFeatures</td><td/></row>
+		<row><td>PublishProduct</td><td/><td>6400</td><td>PublishProduct</td><td/></row>
+		<row><td>RegisterClassInfo</td><td/><td>4600</td><td>RegisterClassInfo</td><td/></row>
+		<row><td>RegisterExtensionInfo</td><td/><td>4700</td><td>RegisterExtensionInfo</td><td/></row>
+		<row><td>RegisterMIMEInfo</td><td/><td>4900</td><td>RegisterMIMEInfo</td><td/></row>
+		<row><td>RegisterProgIdInfo</td><td/><td>4800</td><td>RegisterProgIdInfo</td><td/></row>
+		<row><td>RegisterTypeLibraries</td><td/><td>4910</td><td>RegisterTypeLibraries</td><td/></row>
+		<row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>6410</td><td>ScheduleReboot</td><td/></row>
+	</table>
+
+	<table name="AdvtUISequence">
+		<col key="yes" def="s72">Action</col>
+		<col def="S255">Condition</col>
+		<col def="I2">Sequence</col>
+		<col def="S255">ISComments</col>
+		<col def="I4">ISAttributes</col>
+	</table>
+
+	<table name="AppId">
+		<col key="yes" def="s38">AppId</col>
+		<col def="S255">RemoteServerName</col>
+		<col def="S255">LocalService</col>
+		<col def="S255">ServiceParameters</col>
+		<col def="S255">DllSurrogate</col>
+		<col def="I2">ActivateAtStorage</col>
+		<col def="I2">RunAsInteractiveUser</col>
+	</table>
+
+	<table name="AppSearch">
+		<col key="yes" def="s72">Property</col>
+		<col key="yes" def="s72">Signature_</col>
+	</table>
+
+	<table name="BBControl">
+		<col key="yes" def="s50">Billboard_</col>
+		<col key="yes" def="s50">BBControl</col>
+		<col def="s50">Type</col>
+		<col def="i2">X</col>
+		<col def="i2">Y</col>
+		<col def="i2">Width</col>
+		<col def="i2">Height</col>
+		<col def="I4">Attributes</col>
+		<col def="L50">Text</col>
+	</table>
+
+	<table name="Billboard">
+		<col key="yes" def="s50">Billboard</col>
+		<col def="s38">Feature_</col>
+		<col def="S50">Action</col>
+		<col def="I2">Ordering</col>
+	</table>
+
+	<table name="Binary">
+		<col key="yes" def="s72">Name</col>
+		<col def="V0">Data</col>
+		<col def="S255">ISBuildSourcePath</col>
+		<row><td>ISExpHlp.dll</td><td/><td>&lt;ISRedistPlatformDependentFolder&gt;\ISExpHlp.dll</td></row>
+		<row><td>ISSELFREG.DLL</td><td/><td>&lt;ISRedistPlatformDependentFolder&gt;\isregsvr.dll</td></row>
+		<row><td>NewBinary1</td><td/><td>&lt;ISProductFolder&gt;\Support\Themes\InstallShield Blue Theme\banner.jpg</td></row>
+		<row><td>NewBinary10</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CompleteSetupIco.ibd</td></row>
+		<row><td>NewBinary11</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CustomSetupIco.ibd</td></row>
+		<row><td>NewBinary12</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\DestIcon.ibd</td></row>
+		<row><td>NewBinary13</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\NetworkInstall.ico</td></row>
+		<row><td>NewBinary14</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\DontInstall.ico</td></row>
+		<row><td>NewBinary15</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\Install.ico</td></row>
+		<row><td>NewBinary16</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallFirstUse.ico</td></row>
+		<row><td>NewBinary17</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallPartial.ico</td></row>
+		<row><td>NewBinary18</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallStateMenu.ico</td></row>
+		<row><td>NewBinary2</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\New.ibd</td></row>
+		<row><td>NewBinary3</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\Up.ibd</td></row>
+		<row><td>NewBinary4</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\WarningIcon.ibd</td></row>
+		<row><td>NewBinary5</td><td/><td>&lt;ISProductFolder&gt;\Support\Themes\InstallShield Blue Theme\welcome.jpg</td></row>
+		<row><td>NewBinary6</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CustomSetupIco.ibd</td></row>
+		<row><td>NewBinary7</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\ReinstIco.ibd</td></row>
+		<row><td>NewBinary8</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\RemoveIco.ibd</td></row>
+		<row><td>NewBinary9</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\SetupIcon.ibd</td></row>
+		<row><td>SetAllUsers.dll</td><td/><td>&lt;ISRedistPlatformDependentFolder&gt;\SetAllUsers.dll</td></row>
+	</table>
+
+	<table name="BindImage">
+		<col key="yes" def="s72">File_</col>
+		<col def="S255">Path</col>
+	</table>
+
+	<table name="CCPSearch">
+		<col key="yes" def="s72">Signature_</col>
+	</table>
+
+	<table name="CheckBox">
+		<col key="yes" def="s72">Property</col>
+		<col def="S64">Value</col>
+		<row><td>ISCHECKFORPRODUCTUPDATES</td><td>1</td></row>
+		<row><td>LAUNCHPROGRAM</td><td>1</td></row>
+		<row><td>LAUNCHREADME</td><td>1</td></row>
+	</table>
+
+	<table name="Class">
+		<col key="yes" def="s38">CLSID</col>
+		<col key="yes" def="s32">Context</col>
+		<col key="yes" def="s72">Component_</col>
+		<col def="S255">ProgId_Default</col>
+		<col def="L255">Description</col>
+		<col def="S38">AppId_</col>
+		<col def="S255">FileTypeMask</col>
+		<col def="S72">Icon_</col>
+		<col def="I2">IconIndex</col>
+		<col def="S32">DefInprocHandler</col>
+		<col def="S255">Argument</col>
+		<col def="s38">Feature_</col>
+		<col def="I2">Attributes</col>
+	</table>
+
+	<table name="ComboBox">
+		<col key="yes" def="s72">Property</col>
+		<col key="yes" def="i2">Order</col>
+		<col def="s64">Value</col>
+		<col def="L64">Text</col>
+	</table>
+
+	<table name="CompLocator">
+		<col key="yes" def="s72">Signature_</col>
+		<col def="s38">ComponentId</col>
+		<col def="I2">Type</col>
+	</table>
+
+	<table name="Complus">
+		<col key="yes" def="s72">Component_</col>
+		<col key="yes" def="I2">ExpType</col>
+	</table>
+
+	<table name="Component">
+		<col key="yes" def="s72">Component</col>
+		<col def="S38">ComponentId</col>
+		<col def="s72">Directory_</col>
+		<col def="i2">Attributes</col>
+		<col def="S255">Condition</col>
+		<col def="S72">KeyPath</col>
+		<col def="I4">ISAttributes</col>
+		<col def="S255">ISComments</col>
+		<col def="S255">ISScanAtBuildFile</col>
+		<col def="S255">ISRegFileToMergeAtBuild</col>
+		<col def="S0">ISDotNetInstallerArgsInstall</col>
+		<col def="S0">ISDotNetInstallerArgsCommit</col>
+		<col def="S0">ISDotNetInstallerArgsUninstall</col>
+		<col def="S0">ISDotNetInstallerArgsRollback</col>
+		<row><td>Driver.Primary_Output</td><td>{5033D0A3-753C-4AD9-9346-CF648DD83372}</td><td>INSTALLDIR</td><td>2</td><td/><td>driver.primary_output</td><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+		<row><td>ISX_DEFAULTCOMPONENT1</td><td>{5CADC1FF-1330-4DDF-B22C-1BB1FD18199D}</td><td>INSTALLDIR</td><td>2</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+	</table>
+
+	<table name="Condition">
+		<col key="yes" def="s38">Feature_</col>
+		<col key="yes" def="i2">Level</col>
+		<col def="S255">Condition</col>
+	</table>
+
+	<table name="Control">
+		<col key="yes" def="s72">Dialog_</col>
+		<col key="yes" def="s50">Control</col>
+		<col def="s20">Type</col>
+		<col def="i2">X</col>
+		<col def="i2">Y</col>
+		<col def="i2">Width</col>
+		<col def="i2">Height</col>
+		<col def="I4">Attributes</col>
+		<col def="S72">Property</col>
+		<col def="L0">Text</col>
+		<col def="S50">Control_Next</col>
+		<col def="L50">Help</col>
+		<col def="I4">ISWindowStyle</col>
+		<col def="I4">ISControlId</col>
+		<col def="S255">ISBuildSourcePath</col>
+		<col def="S72">Binary_</col>
+		<row><td>AdminChangeFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>AdminChangeFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ComboText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Combo</td><td>DirectoryCombo</td><td>21</td><td>64</td><td>277</td><td>80</td><td>458755</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_4##</td><td>Up</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>ComboText</td><td>Text</td><td>21</td><td>50</td><td>99</td><td>14</td><td>3</td><td/><td>##IDS__IsAdminInstallBrowse_LookIn##</td><td>Combo</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallBrowse_BrowseDestination##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallBrowse_ChangeDestination##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>List</td><td>DirectoryList</td><td>21</td><td>90</td><td>332</td><td>97</td><td>7</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_8##</td><td>TailText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>NewFolder</td><td>PushButton</td><td>335</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>List</td><td>##IDS__IsAdminInstallBrowse_CreateFolder##</td><td>0</td><td/><td/><td>NewBinary2</td></row>
+		<row><td>AdminChangeFolder</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Tail</td><td>PathEdit</td><td>21</td><td>207</td><td>332</td><td>17</td><td>3</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_11##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>TailText</td><td>Text</td><td>21</td><td>193</td><td>99</td><td>13</td><td>3</td><td/><td>##IDS__IsAdminInstallBrowse_FolderName##</td><td>Tail</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminChangeFolder</td><td>Up</td><td>PushButton</td><td>310</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>NewFolder</td><td>##IDS__IsAdminInstallBrowse_UpOneLevel##</td><td>0</td><td/><td/><td>NewBinary3</td></row>
+		<row><td>AdminNetworkLocation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>InstallNow</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>AdminNetworkLocation</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Browse</td><td>PushButton</td><td>286</td><td>124</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_Change##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>SetupPathEdit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallPoint_SpecifyNetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>40</td><td>131075</td><td/><td>##IDS__IsAdminInstallPoint_EnterNetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallPoint_NetworkLocationFormatted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>InstallNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_Install##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>LBBrowse</td><td>Text</td><td>21</td><td>90</td><td>100</td><td>10</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_NetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminNetworkLocation</td><td>SetupPathEdit</td><td>PathEdit</td><td>21</td><td>102</td><td>330</td><td>17</td><td>3</td><td>TARGETDIR</td><td/><td>Browse</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>AdminWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsAdminInstallPointWelcome_Wizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>AdminWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196611</td><td/><td>##IDS__IsAdminInstallPointWelcome_ServerImage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CancelSetup</td><td>Icon</td><td>Icon</td><td>15</td><td>15</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary4</td></row>
+		<row><td>CancelSetup</td><td>No</td><td>PushButton</td><td>135</td><td>57</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCancelDlg_No##</td><td>Yes</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CancelSetup</td><td>Text</td><td>Text</td><td>48</td><td>15</td><td>194</td><td>30</td><td>131075</td><td/><td>##IDS__IsCancelDlg_ConfirmCancel##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CancelSetup</td><td>Yes</td><td>PushButton</td><td>62</td><td>57</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCancelDlg_Yes##</td><td>No</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>CustomSetup</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Tree</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>203</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Change##</td><td>Help</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Details</td><td>PushButton</td><td>93</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Space##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgDesc</td><td>Text</td><td>17</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsCustomSelectionDlg_SelectFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgText</td><td>Text</td><td>9</td><td>51</td><td>360</td><td>10</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_ClickFeatureIcon##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>DlgTitle</td><td>Text</td><td>9</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsCustomSelectionDlg_CustomSetup##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>FeatureGroup</td><td>GroupBox</td><td>235</td><td>67</td><td>131</td><td>120</td><td>1</td><td/><td>##IDS__IsCustomSelectionDlg_FeatureDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Help</td><td>PushButton</td><td>22</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Help##</td><td>Details</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>InstallLabel</td><td>Text</td><td>8</td><td>190</td><td>360</td><td>10</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_InstallTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>ItemDescription</td><td>Text</td><td>241</td><td>80</td><td>120</td><td>50</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_MultilineDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Location</td><td>Text</td><td>8</td><td>203</td><td>291</td><td>20</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_FeaturePath##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Size</td><td>Text</td><td>241</td><td>133</td><td>120</td><td>50</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_FeatureSize##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetup</td><td>Tree</td><td>SelectionTree</td><td>8</td><td>70</td><td>220</td><td>118</td><td>7</td><td>_BrowseProperty</td><td/><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>CustomSetupTips</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SetupTips_CustomSetupDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SetupTips_CustomSetup##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>DontInstall</td><td>Icon</td><td>21</td><td>155</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary14</td></row>
+		<row><td>CustomSetupTips</td><td>DontInstallText</td><td>Text</td><td>60</td><td>155</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_WillNotBeInstalled##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>FirstInstallText</td><td>Text</td><td>60</td><td>180</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_Advertise##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>Install</td><td>Icon</td><td>21</td><td>105</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary15</td></row>
+		<row><td>CustomSetupTips</td><td>InstallFirstUse</td><td>Icon</td><td>21</td><td>180</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary16</td></row>
+		<row><td>CustomSetupTips</td><td>InstallPartial</td><td>Icon</td><td>21</td><td>130</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary17</td></row>
+		<row><td>CustomSetupTips</td><td>InstallStateMenu</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary18</td></row>
+		<row><td>CustomSetupTips</td><td>InstallStateText</td><td>Text</td><td>21</td><td>91</td><td>300</td><td>10</td><td>3</td><td/><td>##IDS_SetupTips_InstallState##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>InstallText</td><td>Text</td><td>60</td><td>105</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_AllInstalledLocal##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>MenuText</td><td>Text</td><td>50</td><td>52</td><td>300</td><td>36</td><td>3</td><td/><td>##IDS_SetupTips_IconInstallState##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>NetworkInstall</td><td>Icon</td><td>21</td><td>205</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary13</td></row>
+		<row><td>CustomSetupTips</td><td>NetworkInstallText</td><td>Text</td><td>60</td><td>205</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_Network##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>OK</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_SetupTips_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomSetupTips</td><td>PartialText</td><td>Text</td><td>60</td><td>130</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_SubFeaturesInstalledLocal##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>CustomerInformation</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>NameLabel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>CompanyEdit</td><td>Edit</td><td>21</td><td>100</td><td>237</td><td>17</td><td>3</td><td>COMPANYNAME</td><td>##IDS__IsRegisterUserDlg_Tahoma80##</td><td>SerialLabel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>CompanyLabel</td><td>Text</td><td>21</td><td>89</td><td>75</td><td>10</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_Organization##</td><td>CompanyEdit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsRegisterUserDlg_PleaseEnterInfo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgRadioGroupText</td><td>Text</td><td>21</td><td>161</td><td>300</td><td>14</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_InstallFor##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsRegisterUserDlg_CustomerInformation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>NameEdit</td><td>Edit</td><td>21</td><td>63</td><td>237</td><td>17</td><td>3</td><td>USERNAME</td><td>##IDS__IsRegisterUserDlg_Tahoma50##</td><td>CompanyLabel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>NameLabel</td><td>Text</td><td>21</td><td>52</td><td>75</td><td>10</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_UserName##</td><td>NameEdit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>63</td><td>170</td><td>300</td><td>50</td><td>2</td><td>ApplicationUsers</td><td>##IDS__IsRegisterUserDlg_16##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>SerialLabel</td><td>Text</td><td>21</td><td>127</td><td>109</td><td>10</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_SerialNumber##</td><td>SerialNumber</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>CustomerInformation</td><td>SerialNumber</td><td>MaskedEdit</td><td>21</td><td>138</td><td>237</td><td>17</td><td>2</td><td>ISX_SERIALNUM</td><td/><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>DatabaseFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>65</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CHANGE##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>DatabaseFolder</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary12</td></row>
+		<row><td>DatabaseFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DatabaseFolder_ChangeFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DatabaseFolder_DatabaseFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>LocLabel</td><td>Text</td><td>57</td><td>52</td><td>290</td><td>10</td><td>131075</td><td/><td>##IDS_DatabaseFolder_InstallDatabaseTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Location</td><td>Text</td><td>57</td><td>65</td><td>240</td><td>40</td><td>3</td><td>_BrowseProperty</td><td>##IDS__DatabaseFolder_DatabaseDir##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DatabaseFolder</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>DestinationFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>65</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__DestinationFolder_Change##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>DestFolder</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary12</td></row>
+		<row><td>DestinationFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DestinationFolder_ChangeFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DestinationFolder_DestinationFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>LocLabel</td><td>Text</td><td>57</td><td>52</td><td>290</td><td>10</td><td>131075</td><td/><td>##IDS__DestinationFolder_InstallTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Location</td><td>Text</td><td>57</td><td>65</td><td>240</td><td>40</td><td>3</td><td>_BrowseProperty</td><td>##IDS_INSTALLDIR##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DestinationFolder</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>DiskSpaceRequirements</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgDesc</td><td>Text</td><td>17</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFeatureDetailsDlg_SpaceRequired##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgText</td><td>Text</td><td>10</td><td>185</td><td>358</td><td>41</td><td>3</td><td/><td>##IDS__IsFeatureDetailsDlg_VolumesTooSmall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>DlgTitle</td><td>Text</td><td>9</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFeatureDetailsDlg_DiskSpaceRequirements##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>List</td><td>VolumeCostList</td><td>8</td><td>55</td><td>358</td><td>125</td><td>393223</td><td/><td>##IDS__IsFeatureDetailsDlg_Numbers##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>DiskSpaceRequirements</td><td>OK</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFeatureDetailsDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>FilesInUse</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUseMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>348</td><td>33</td><td>3</td><td/><td>##IDS__IsFilesInUse_ApplicationsUsingFiles##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUse##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Exit</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Exit##</td><td>List</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Ignore</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Ignore##</td><td>Exit</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>List</td><td>ListBox</td><td>21</td><td>87</td><td>331</td><td>135</td><td>7</td><td>FileInUseProcess</td><td/><td>Retry</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>FilesInUse</td><td>Retry</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Retry##</td><td>Ignore</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>InstallChangeFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ComboText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Combo</td><td>DirectoryCombo</td><td>21</td><td>64</td><td>277</td><td>80</td><td>4128779</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_4##</td><td>Up</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>ComboText</td><td>Text</td><td>21</td><td>50</td><td>99</td><td>14</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_LookIn##</td><td>Combo</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsBrowseFolderDlg_BrowseDestFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsBrowseFolderDlg_ChangeCurrentFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>List</td><td>DirectoryList</td><td>21</td><td>90</td><td>332</td><td>97</td><td>15</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_8##</td><td>TailText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>NewFolder</td><td>PushButton</td><td>335</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>List</td><td>##IDS__IsBrowseFolderDlg_CreateFolder##</td><td>0</td><td/><td/><td>NewBinary2</td></row>
+		<row><td>InstallChangeFolder</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Tail</td><td>PathEdit</td><td>21</td><td>207</td><td>332</td><td>17</td><td>15</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_11##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>TailText</td><td>Text</td><td>21</td><td>193</td><td>99</td><td>13</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_FolderName##</td><td>Tail</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallChangeFolder</td><td>Up</td><td>PushButton</td><td>310</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>NewFolder</td><td>##IDS__IsBrowseFolderDlg_UpOneLevel##</td><td>0</td><td/><td/><td>NewBinary3</td></row>
+		<row><td>InstallWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Copyright</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>Copyright</td><td>Text</td><td>135</td><td>144</td><td>228</td><td>73</td><td>65539</td><td/><td>##IDS__IsWelcomeDlg_WarningCopyright##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>InstallWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsWelcomeDlg_WelcomeProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>InstallWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196611</td><td/><td>##IDS__IsWelcomeDlg_InstallProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Agree</td><td>RadioButtonGroup</td><td>8</td><td>190</td><td>291</td><td>40</td><td>3</td><td>AgreeToLicense</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>LicenseAgreement</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ISPrintButton</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsLicenseDlg_ReadLicenseAgreement##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsLicenseDlg_LicenseAgreement##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>ISPrintButton</td><td>PushButton</td><td>301</td><td>188</td><td>65</td><td>17</td><td>3</td><td/><td>##IDS_PRINT_BUTTON##</td><td>Agree</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>LicenseAgreement</td><td>Memo</td><td>ScrollableText</td><td>8</td><td>55</td><td>358</td><td>130</td><td>7</td><td/><td/><td/><td/><td>0</td><td/><td>&lt;ISProductFolder&gt;\Redist\0409\Eula.rtf</td><td/></row>
+		<row><td>LicenseAgreement</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>MaintenanceType</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsMaintenanceDlg_MaitenanceOptions##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsMaintenanceDlg_ProgramMaintenance##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Ico1</td><td>Icon</td><td>35</td><td>75</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary6</td></row>
+		<row><td>MaintenanceType</td><td>Ico2</td><td>Icon</td><td>35</td><td>135</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary7</td></row>
+		<row><td>MaintenanceType</td><td>Ico3</td><td>Icon</td><td>35</td><td>195</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary8</td></row>
+		<row><td>MaintenanceType</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>21</td><td>55</td><td>290</td><td>170</td><td>3</td><td>_IsMaintenance</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Text1</td><td>Text</td><td>80</td><td>72</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_ChangeFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Text2</td><td>Text</td><td>80</td><td>135</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_RepairMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceType</td><td>Text3</td><td>Text</td><td>80</td><td>192</td><td>260</td><td>35</td><td>131075</td><td/><td>##IDS__IsMaintenanceDlg_RemoveProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>MaintenanceWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsMaintenanceWelcome_WizardWelcome##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MaintenanceWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>50</td><td>196611</td><td/><td>##IDS__IsMaintenanceWelcome_MaintenanceOptionsDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>MsiRMFilesInUse</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Restart</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUseMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>348</td><td>14</td><td>3</td><td/><td>##IDS__IsMsiRMFilesInUse_ApplicationsUsingFiles##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUse##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>List</td><td>ListBox</td><td>21</td><td>66</td><td>331</td><td>130</td><td>3</td><td>FileInUseProcess</td><td/><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>MsiRMFilesInUse</td><td>Restart</td><td>RadioButtonGroup</td><td>19</td><td>187</td><td>343</td><td>40</td><td>3</td><td>RestartManagerOption</td><td/><td>List</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>OutOfSpace</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsDiskSpaceDlg_DiskSpace##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>43</td><td>3</td><td/><td>##IDS__IsDiskSpaceDlg_HighlightedVolumes##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsDiskSpaceDlg_OutOfDiskSpace##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>List</td><td>VolumeCostList</td><td>21</td><td>95</td><td>332</td><td>120</td><td>393223</td><td/><td>##IDS__IsDiskSpaceDlg_Numbers##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>OutOfSpace</td><td>Resume</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsDiskSpaceDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>PatchWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsPatchDlg_Update##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>196611</td><td/><td>##IDS__IsPatchDlg_WelcomePatchWizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>PatchWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>54</td><td>228</td><td>45</td><td>196611</td><td/><td>##IDS__IsPatchDlg_PatchClickUpdate##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1048579</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>3</td><td/><td/><td>DlgTitle</td><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>ReadmeInformation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1048579</td><td/><td>##IDS__IsReadmeDlg_Cancel##</td><td>Readme</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>232</td><td>16</td><td>65539</td><td/><td>##IDS__IsReadmeDlg_PleaseReadInfo##</td><td>Back</td><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>3</td><td/><td/><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>193</td><td>13</td><td>65539</td><td/><td>##IDS__IsReadmeDlg_ReadMeInfo##</td><td>DlgDesc</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>1048579</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadmeInformation</td><td>Readme</td><td>ScrollableText</td><td>10</td><td>55</td><td>353</td><td>166</td><td>3</td><td/><td/><td>Banner</td><td/><td>0</td><td/><td>&lt;ISProductFolder&gt;\Redist\0409\Readme.rtf</td><td/></row>
+		<row><td>ReadyToInstall</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>GroupBox1</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>ReadyToInstall</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>CompanyNameText</td><td>Text</td><td>38</td><td>198</td><td>211</td><td>9</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Company##</td><td>SerialNumberText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>CurrentSettingsText</td><td>Text</td><td>19</td><td>80</td><td>81</td><td>10</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_CurrentSettings##</td><td>InstallNow</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyReadyDlg_WizardReady##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgText1</td><td>Text</td><td>21</td><td>54</td><td>330</td><td>24</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_BackOrCancel##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgText2</td><td>Text</td><td>21</td><td>99</td><td>330</td><td>20</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_InstallFor##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ModifyReady##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgTitle2</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ReadyRepair##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>DlgTitle3</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ReadyInstall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>GroupBox1</td><td>Text</td><td>19</td><td>92</td><td>330</td><td>133</td><td>65541</td><td/><td/><td>SetupTypeText1</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>InstallNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>8388611</td><td/><td>##IDS__IsVerifyReadyDlg_Install##</td><td>InstallPerMachine</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>InstallPerMachine</td><td>PushButton</td><td>63</td><td>123</td><td>248</td><td>17</td><td>8388610</td><td/><td>##IDS__IsRegisterUserDlg_Anyone##</td><td>InstallPerUser</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>InstallPerUser</td><td>PushButton</td><td>63</td><td>143</td><td>248</td><td>17</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_OnlyMe##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>SerialNumberText</td><td>Text</td><td>38</td><td>211</td><td>306</td><td>9</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Serial##</td><td>CurrentSettingsText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>SetupTypeText1</td><td>Text</td><td>23</td><td>97</td><td>306</td><td>13</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_SetupType##</td><td>SetupTypeText2</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>SetupTypeText2</td><td>Text</td><td>37</td><td>114</td><td>306</td><td>14</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_SelectedSetupType##</td><td>TargetFolderText1</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>TargetFolderText1</td><td>Text</td><td>24</td><td>136</td><td>306</td><td>11</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_DestFolder##</td><td>TargetFolderText2</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>TargetFolderText2</td><td>Text</td><td>37</td><td>151</td><td>306</td><td>13</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Installdir##</td><td>UserInformationText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>UserInformationText</td><td>Text</td><td>23</td><td>171</td><td>306</td><td>13</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_UserInfo##</td><td>UserNameText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToInstall</td><td>UserNameText</td><td>Text</td><td>38</td><td>184</td><td>306</td><td>9</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_UserName##</td><td>CompanyNameText</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>RemoveNow</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+		<row><td>ReadyToRemove</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ChoseRemoveProgram##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>24</td><td>131075</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ClickRemove##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgText1</td><td>Text</td><td>21</td><td>79</td><td>330</td><td>23</td><td>3</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ClickBack##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgText2</td><td>Text</td><td>21</td><td>102</td><td>330</td><td>24</td><td>3</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyRemoveAllDlg_RemoveProgram##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>ReadyToRemove</td><td>RemoveNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>8388611</td><td/><td>##IDS__IsVerifyRemoveAllDlg_Remove##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Finish</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>CheckShowMsiLog</td><td>CheckBox</td><td>151</td><td>172</td><td>10</td><td>9</td><td>2</td><td>ISSHOWMSILOG</td><td/><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Finish</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFatalError_Finish##</td><td>Image</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>FinishText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsFatalError_NotModified##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>FinishText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_ClickFinish##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td>CheckShowMsiLog</td><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>SetupCompleteError</td><td>RestContText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsFatalError_KeepOrRestore##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>RestContText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_RestoreOrContinueLater##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>ShowMsiLogText</td><td>Text</td><td>164</td><td>172</td><td>198</td><td>10</td><td>65538</td><td/><td>##IDS__IsSetupComplete_ShowMsiLog##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsFatalError_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteError</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>25</td><td>196611</td><td/><td>##IDS__IsFatalError_WizardInterrupted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td>Image</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckBoxUpdates</td><td>CheckBox</td><td>135</td><td>164</td><td>10</td><td>9</td><td>2</td><td>ISCHECKFORPRODUCTUPDATES</td><td>CheckBox1</td><td>CheckShowMsiLog</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckForUpdatesText</td><td>Text</td><td>152</td><td>162</td><td>190</td><td>30</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_YesCheckForUpdates##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckLaunchProgram</td><td>CheckBox</td><td>151</td><td>114</td><td>10</td><td>9</td><td>2</td><td>LAUNCHPROGRAM</td><td/><td>CheckLaunchReadme</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckLaunchReadme</td><td>CheckBox</td><td>151</td><td>148</td><td>10</td><td>9</td><td>2</td><td>LAUNCHREADME</td><td/><td>CheckBoxUpdates</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>CheckShowMsiLog</td><td>CheckBox</td><td>151</td><td>182</td><td>10</td><td>9</td><td>2</td><td>ISSHOWMSILOG</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td>CheckLaunchProgram</td><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+		<row><td>SetupCompleteSuccess</td><td>LaunchProgramText</td><td>Text</td><td>164</td><td>112</td><td>98</td><td>15</td><td>65538</td><td/><td>##IDS__IsExitDialog_LaunchProgram##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>LaunchReadmeText</td><td>Text</td><td>164</td><td>148</td><td>120</td><td>13</td><td>65538</td><td/><td>##IDS__IsExitDialog_ShowReadMe##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsExitDialog_Finish##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>ShowMsiLogText</td><td>Text</td><td>164</td><td>182</td><td>198</td><td>10</td><td>65538</td><td/><td>##IDS__IsSetupComplete_ShowMsiLog##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsExitDialog_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_InstallSuccess##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>TextLine3</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_UninstallSuccess##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>UpdateTextLine1</td><td>Text</td><td>135</td><td>30</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_Update_SetupFinished##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>UpdateTextLine2</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>45</td><td>196610</td><td/><td>##IDS__IsExitDialog_Update_PossibleUpdates##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupCompleteSuccess</td><td>UpdateTextLine3</td><td>Text</td><td>135</td><td>120</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_InternetConnection##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>A</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Abort##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>C</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL2##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>ErrorIcon</td><td>Icon</td><td>15</td><td>15</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary4</td></row>
+		<row><td>SetupError</td><td>ErrorText</td><td>Text</td><td>50</td><td>15</td><td>200</td><td>50</td><td>131075</td><td/><td>##IDS__IsErrorDlg_ErrorText##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>I</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Ignore##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>N</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_NO##</td><td/><td/><td>0</td><td/><td/><td/></row>
+		<row><td>SetupError</td><td>O</td><td>PushButton</td><td>192</td><td>

<TRUNCATED>


[04/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer(64bit)/Installer(64bit).isproj
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit).isproj b/odbc/Installer(64bit)/Installer(64bit).isproj
new file mode 100644
index 0000000..9e4481b
--- /dev/null
+++ b/odbc/Installer(64bit)/Installer(64bit).isproj
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+	<PropertyGroup>
+		<!-- Select a Product Configuration -->
+		<InstallShieldProductConfiguration>Express</InstallShieldProductConfiguration>
+		<!-- Select a Visual Studio Configuration / InstallShield Release -->
+		<Configuration>Debug</Configuration>
+		<InstallShieldRelease>$(Configuration)</InstallShieldRelease>
+	</PropertyGroup>
+	<ItemGroup>
+		<!-- The InstallShieldProject item selects the project to build -->
+		<InstallShieldProject Include="$(MSBuildProjectDirectory)\$(MSBuildProjectName).isl"/>
+		<!-- The InstallShieldReleaseFlags sets Release Flags -->
+		<!--<InstallShieldReleaseFlags Include=""/>-->
+		<!-- The InstallShieldMergeModulePath specifies what directories are
+		searched for Merge Modules -->
+		<!--<InstallShieldMergeModulePath Include=""/>-->
+	</ItemGroup>
+	<ItemGroup>
+		<!-- The ProjectReference items refer to any Visual Studio solutions you want to automatically probe for Project Output Groups.  -->
+	</ItemGroup>
+	<ItemGroup>
+		<!-- The TaggedOutputs items allow you to explicitly add extra files to output groups. Each item must include both Name and OutputGroup, as well as TargetPath metadata values. -->
+		<!--<TaggedOutputs Include="C:\My Test Exe.exe">
+			<Name>My Test Project</Name>
+			<OutputGroup>Primary output</OutputGroup>
+			<TargetPath>My Test Exe.exe</TargetPath>
+		</TaggedOutputs> -->
+	</ItemGroup>
+	<Import Project="$(MSBuildExtensionsPath32)\InstallShield\2013Limited\InstallShield.targets"/>
+	<ItemGroup>
+		<ProjectReference Include="..\Driver\driver.vcxproj">
+			<Name>Driver</Name>
+			<Project>{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}</Project>
+		</ProjectReference>
+	</ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer(64bit)/Installer(64bit)/Express/Interm/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit)/Express/Interm/.gitignore b/odbc/Installer(64bit)/Installer(64bit)/Express/Interm/.gitignore
new file mode 100644
index 0000000..d6fd0a4
--- /dev/null
+++ b/odbc/Installer(64bit)/Installer(64bit)/Express/Interm/.gitignore
@@ -0,0 +1 @@
+*.Exe

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/DiskImages/DISK1/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/DiskImages/DISK1/.gitignore b/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/DiskImages/DISK1/.gitignore
new file mode 100644
index 0000000..b883f1f
--- /dev/null
+++ b/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/DiskImages/DISK1/.gitignore
@@ -0,0 +1 @@
+*.exe

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/LogFiles/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/LogFiles/.gitignore b/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/LogFiles/.gitignore
new file mode 100644
index 0000000..2211df6
--- /dev/null
+++ b/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/LogFiles/.gitignore
@@ -0,0 +1 @@
+*.txt

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/Reports/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/Reports/.gitignore b/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/Reports/.gitignore
new file mode 100644
index 0000000..43d1567
--- /dev/null
+++ b/odbc/Installer(64bit)/Installer(64bit)/Express/SingleImage/Reports/.gitignore
@@ -0,0 +1 @@
+*.htm


[02/14] incubator-kylin git commit: add odbc driver to maven repository

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer/Installer.isproj
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer.isproj b/odbc/Installer/Installer.isproj
new file mode 100644
index 0000000..9e4481b
--- /dev/null
+++ b/odbc/Installer/Installer.isproj
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+	<PropertyGroup>
+		<!-- Select a Product Configuration -->
+		<InstallShieldProductConfiguration>Express</InstallShieldProductConfiguration>
+		<!-- Select a Visual Studio Configuration / InstallShield Release -->
+		<Configuration>Debug</Configuration>
+		<InstallShieldRelease>$(Configuration)</InstallShieldRelease>
+	</PropertyGroup>
+	<ItemGroup>
+		<!-- The InstallShieldProject item selects the project to build -->
+		<InstallShieldProject Include="$(MSBuildProjectDirectory)\$(MSBuildProjectName).isl"/>
+		<!-- The InstallShieldReleaseFlags sets Release Flags -->
+		<!--<InstallShieldReleaseFlags Include=""/>-->
+		<!-- The InstallShieldMergeModulePath specifies what directories are
+		searched for Merge Modules -->
+		<!--<InstallShieldMergeModulePath Include=""/>-->
+	</ItemGroup>
+	<ItemGroup>
+		<!-- The ProjectReference items refer to any Visual Studio solutions you want to automatically probe for Project Output Groups.  -->
+	</ItemGroup>
+	<ItemGroup>
+		<!-- The TaggedOutputs items allow you to explicitly add extra files to output groups. Each item must include both Name and OutputGroup, as well as TargetPath metadata values. -->
+		<!--<TaggedOutputs Include="C:\My Test Exe.exe">
+			<Name>My Test Project</Name>
+			<OutputGroup>Primary output</OutputGroup>
+			<TargetPath>My Test Exe.exe</TargetPath>
+		</TaggedOutputs> -->
+	</ItemGroup>
+	<Import Project="$(MSBuildExtensionsPath32)\InstallShield\2013Limited\InstallShield.targets"/>
+	<ItemGroup>
+		<ProjectReference Include="..\Driver\driver.vcxproj">
+			<Name>Driver</Name>
+			<Project>{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}</Project>
+		</ProjectReference>
+	</ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer/Installer/Express/Interm/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer/Express/Interm/.gitignore b/odbc/Installer/Installer/Express/Interm/.gitignore
new file mode 100644
index 0000000..d6fd0a4
--- /dev/null
+++ b/odbc/Installer/Installer/Express/Interm/.gitignore
@@ -0,0 +1 @@
+*.Exe

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer/Installer/Express/SingleImage/DiskImages/DISK1/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer/Express/SingleImage/DiskImages/DISK1/.gitignore b/odbc/Installer/Installer/Express/SingleImage/DiskImages/DISK1/.gitignore
new file mode 100644
index 0000000..b883f1f
--- /dev/null
+++ b/odbc/Installer/Installer/Express/SingleImage/DiskImages/DISK1/.gitignore
@@ -0,0 +1 @@
+*.exe

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer/Installer/Express/SingleImage/LogFiles/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer/Express/SingleImage/LogFiles/.gitignore b/odbc/Installer/Installer/Express/SingleImage/LogFiles/.gitignore
new file mode 100644
index 0000000..2211df6
--- /dev/null
+++ b/odbc/Installer/Installer/Express/SingleImage/LogFiles/.gitignore
@@ -0,0 +1 @@
+*.txt

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Installer/Installer/Express/SingleImage/Reports/.gitignore
----------------------------------------------------------------------
diff --git a/odbc/Installer/Installer/Express/SingleImage/Reports/.gitignore b/odbc/Installer/Installer/Express/SingleImage/Reports/.gitignore
new file mode 100644
index 0000000..43d1567
--- /dev/null
+++ b/odbc/Installer/Installer/Express/SingleImage/Reports/.gitignore
@@ -0,0 +1 @@
+*.htm

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/KylinODBC.sln
----------------------------------------------------------------------
diff --git a/odbc/KylinODBC.sln b/odbc/KylinODBC.sln
new file mode 100644
index 0000000..35091ac
--- /dev/null
+++ b/odbc/KylinODBC.sln
@@ -0,0 +1,296 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Common\Common.vcxproj", "{6EE1C577-1826-4EA2-86AC-FE8047D396A9}"
+EndProject
+Project("{6141683F-8A12-4E36-9623-2EB02B2C2303}") = "Installer", "Installer\Installer.isproj", "{71AB0FA7-D2B0-4731-B292-42025CB5217A}"
+	ProjectSection(ProjectDependencies) = postProject
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5} = {B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Driver", "Driver\driver.vcxproj", "{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9} = {6EE1C577-1826-4EA2-86AC-FE8047D396A9}
+	EndProjectSection
+EndProject
+Project("{6141683F-8A12-4E36-9623-2EB02B2C2303}") = "Installer(64bit)", "Installer(64bit)\Installer(64bit).isproj", "{BCCCAF23-CDB4-4833-AB48-85791D261342}"
+	ProjectSection(ProjectDependencies) = postProject
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5} = {B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tests", "TestDLL\TestDLL.vcxproj", "{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}"
+	ProjectSection(ProjectDependencies) = postProject
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5} = {B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		CD_ROM|Any CPU = CD_ROM|Any CPU
+		CD_ROM|Mixed Platforms = CD_ROM|Mixed Platforms
+		CD_ROM|Win32 = CD_ROM|Win32
+		CD_ROM|x64 = CD_ROM|x64
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		DVD-5|Any CPU = DVD-5|Any CPU
+		DVD-5|Mixed Platforms = DVD-5|Mixed Platforms
+		DVD-5|Win32 = DVD-5|Win32
+		DVD-5|x64 = DVD-5|x64
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+		SingleImage|Any CPU = SingleImage|Any CPU
+		SingleImage|Mixed Platforms = SingleImage|Mixed Platforms
+		SingleImage|Win32 = SingleImage|Win32
+		SingleImage|x64 = SingleImage|x64
+		Template|Any CPU = Template|Any CPU
+		Template|Mixed Platforms = Template|Mixed Platforms
+		Template|Win32 = Template|Win32
+		Template|x64 = Template|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Any CPU.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Mixed Platforms.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Mixed Platforms.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Win32.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Win32.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|Win32.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|x64.ActiveCfg = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.CD_ROM|x64.Build.0 = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Mixed Platforms.Deploy.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Win32.ActiveCfg = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Win32.Build.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|Win32.Deploy.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|x64.ActiveCfg = Debug|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Debug|x64.Build.0 = Debug|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Any CPU.ActiveCfg = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Mixed Platforms.Build.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Mixed Platforms.Deploy.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Win32.ActiveCfg = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Win32.Build.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|Win32.Deploy.0 = Debug|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|x64.ActiveCfg = Debug|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.DVD-5|x64.Build.0 = Debug|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Any CPU.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Mixed Platforms.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Win32.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Win32.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|Win32.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|x64.ActiveCfg = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Release|x64.Build.0 = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Any CPU.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Mixed Platforms.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Mixed Platforms.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Mixed Platforms.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Win32.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Win32.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|Win32.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|x64.ActiveCfg = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.SingleImage|x64.Build.0 = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Any CPU.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Mixed Platforms.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Mixed Platforms.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Mixed Platforms.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Win32.ActiveCfg = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Win32.Build.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|Win32.Deploy.0 = Release|Win32
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|x64.ActiveCfg = Release|x64
+		{6EE1C577-1826-4EA2-86AC-FE8047D396A9}.Template|x64.Build.0 = Release|x64
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|Any CPU.ActiveCfg = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|Any CPU.Build.0 = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|Mixed Platforms.ActiveCfg = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|Mixed Platforms.Build.0 = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|Win32.ActiveCfg = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|Win32.Build.0 = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|x64.ActiveCfg = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.CD_ROM|x64.Build.0 = CD_ROM
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|Any CPU.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|Any CPU.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|Mixed Platforms.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|Mixed Platforms.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|Win32.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|Win32.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|x64.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Debug|x64.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|Any CPU.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|Any CPU.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|Mixed Platforms.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|Mixed Platforms.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|Win32.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|Win32.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|x64.ActiveCfg = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.DVD-5|x64.Build.0 = DVD-5
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|Any CPU.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|Any CPU.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|Mixed Platforms.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|Mixed Platforms.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|Win32.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|Win32.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|x64.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Release|x64.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|Any CPU.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|Any CPU.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|Mixed Platforms.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|Mixed Platforms.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|Win32.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|Win32.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|x64.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.SingleImage|x64.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|Any CPU.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|Any CPU.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|Mixed Platforms.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|Mixed Platforms.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|Win32.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|Win32.Build.0 = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|x64.ActiveCfg = SingleImage
+		{71AB0FA7-D2B0-4731-B292-42025CB5217A}.Template|x64.Build.0 = SingleImage
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Any CPU.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Mixed Platforms.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Mixed Platforms.Build.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Mixed Platforms.Deploy.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Win32.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Win32.Build.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|Win32.Deploy.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|x64.ActiveCfg = Template|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.CD_ROM|x64.Build.0 = Template|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Mixed Platforms.Deploy.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Win32.Build.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|Win32.Deploy.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|x64.ActiveCfg = Debug|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Debug|x64.Build.0 = Debug|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Any CPU.ActiveCfg = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Mixed Platforms.Build.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Mixed Platforms.Deploy.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Win32.ActiveCfg = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Win32.Build.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|Win32.Deploy.0 = Debug|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|x64.ActiveCfg = Debug|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.DVD-5|x64.Build.0 = Debug|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|Any CPU.ActiveCfg = Release|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|Mixed Platforms.Deploy.0 = Release|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|Win32.ActiveCfg = Release|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|Win32.Build.0 = Release|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|Win32.Deploy.0 = Release|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|x64.ActiveCfg = Release|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Release|x64.Build.0 = Release|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Any CPU.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Mixed Platforms.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Mixed Platforms.Build.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Mixed Platforms.Deploy.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Win32.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Win32.Build.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|Win32.Deploy.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|x64.ActiveCfg = Template|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.SingleImage|x64.Build.0 = Template|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Any CPU.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Mixed Platforms.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Mixed Platforms.Build.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Mixed Platforms.Deploy.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Win32.ActiveCfg = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Win32.Build.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|Win32.Deploy.0 = Template|Win32
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|x64.ActiveCfg = Template|x64
+		{B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5}.Template|x64.Build.0 = Template|x64
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|Any CPU.ActiveCfg = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|Any CPU.Build.0 = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|Mixed Platforms.ActiveCfg = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|Mixed Platforms.Build.0 = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|Win32.ActiveCfg = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|Win32.Build.0 = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|x64.ActiveCfg = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.CD_ROM|x64.Build.0 = CD_ROM
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|Any CPU.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|Any CPU.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|Mixed Platforms.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|Mixed Platforms.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|Win32.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|Win32.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|x64.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Debug|x64.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|Any CPU.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|Any CPU.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|Mixed Platforms.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|Mixed Platforms.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|Win32.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|Win32.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|x64.ActiveCfg = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.DVD-5|x64.Build.0 = DVD-5
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|Any CPU.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|Any CPU.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|Mixed Platforms.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|Mixed Platforms.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|Win32.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|Win32.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Release|x64.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|Any CPU.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|Any CPU.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|Mixed Platforms.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|Mixed Platforms.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|Win32.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|Win32.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|x64.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.SingleImage|x64.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|Any CPU.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|Any CPU.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|Mixed Platforms.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|Mixed Platforms.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|Win32.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|Win32.Build.0 = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|x64.ActiveCfg = SingleImage
+		{BCCCAF23-CDB4-4833-AB48-85791D261342}.Template|x64.Build.0 = SingleImage
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.CD_ROM|Any CPU.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.CD_ROM|Mixed Platforms.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.CD_ROM|Win32.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.CD_ROM|Win32.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.CD_ROM|x64.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Debug|Win32.Build.0 = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Debug|x64.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.DVD-5|Any CPU.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.DVD-5|Mixed Platforms.Build.0 = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.DVD-5|Win32.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.DVD-5|Win32.Build.0 = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.DVD-5|x64.ActiveCfg = Debug|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Release|Any CPU.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Release|Win32.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Release|Win32.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Release|x64.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.SingleImage|Any CPU.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.SingleImage|Mixed Platforms.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.SingleImage|Mixed Platforms.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.SingleImage|Win32.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.SingleImage|Win32.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.SingleImage|x64.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Template|Any CPU.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Template|Mixed Platforms.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Template|Mixed Platforms.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Template|Win32.ActiveCfg = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Template|Win32.Build.0 = Release|Win32
+		{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}.Template|x64.ActiveCfg = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/LICENSE
----------------------------------------------------------------------
diff --git a/odbc/LICENSE b/odbc/LICENSE
new file mode 100644
index 0000000..e06d208
--- /dev/null
+++ b/odbc/LICENSE
@@ -0,0 +1,202 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/README.md
----------------------------------------------------------------------
diff --git a/odbc/README.md b/odbc/README.md
new file mode 100644
index 0000000..b5e5059
--- /dev/null
+++ b/odbc/README.md
@@ -0,0 +1,61 @@
+ODBC
+====
+
+ODBC Driver to interactive with Kylin Engine
+
+Download driver exe at https://github.com/KylinOLAP/odbc-driver/tree/master/exe
+
+
+
+Folder and their contents are listed. This will give you can an idea of what to find where. More details are available in the CPP files of the respective projects.
+
+The projects have been built using Visual Studio 2012. The entry of the project is KylinODBC.sln. Mind the VS version.
+
+Make sure you have the following header files, import libraries and DLLs on your system
+1. SQL.H
+2. SQLTYPES.H
+3. SQLEXT.H
+4. ODBCINST.H
+5. ODBC32.LIB & ODBC32.DLL
+6. ODBCCP32.LIB & ODBCCP32.DLL
+
+You can obtain these from Microsoft site as a part of Platform SDK or MDAC kit
+
+
+List of folders and description:
+================================
+
+KylinODBC                  - Root folder containing the workspace. All the projects are part of this single workspace
+
+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\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.
+
+KylinODBC\Installer  	- Contains a MSI installer for kylin odbc driver(x86)
+
+KylinODBC\Installer(64bit)  - Contains a MSI installer for kylin odbc driver(x64)
+
+KylinODBC\doc               - Totorials for ODBC development starters.
+
+How to compile
+================================
+1. Get a windows PC with Microsoft Visual Studio 2012 installed. Additionaly install Microsoft Data Access Components (MDAC, http://www.microsoft.com/en-us/download/details.aspx?id=21995) on it.
+
+2. Download source code for zlib(for compression) and Casablanca(for REST invoking), and build them to static libaries. Remember if you want to build 64 bit odbc driver, you'll have to build 64 bit dependency libaries, the same goes for 32 bit 
+
+		Compiling zlib: refer to http://www.helyar.net/2010/compiling-zlib-lib-on-windows/ or http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html(this doc is in Chineses, but it's quite clear)
+		
+		Compliling Casablanca: refer to https://katyscode.wordpress.com/2014/04/01/how-to-statically-link-the-c-rest-sdk-casablanca
+
+3. Go to "Control Panel" -> "System" -> "Advanced system settings" -> "Environment Variables" -> "System variables", add two variables "ZLIB_HOME" and "CPPREST_HOME", their value being set to the home directory of zlib and Casablanca.
+
+4. Open KylinODBC.sln, if you're building a 32 bit ODBC driver, set the profile to RELEASE|Win32, build project Installer and find the driver exe at Installer/Express/SingleImage/DiskImages/DISK1. If you're building a 64 bit driver, set the profile to RELEASE|x64, and find the exe at Installer(x64bit)/Express/SingleImage/DiskImages/DISK1.
+
+
+
+all the best
+
+Hongbin Ma
+mahongbin@apache.org

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/ReadMe.txt
----------------------------------------------------------------------
diff --git a/odbc/ReadMe.txt b/odbc/ReadMe.txt
new file mode 100644
index 0000000..e571475
--- /dev/null
+++ b/odbc/ReadMe.txt
@@ -0,0 +1,53 @@
+
+Folder and their contents are listed. This will give you can an idea of what to find where. More details are available in the CPP files of the respective projects.
+
+The projects have been built using Visual Studio 2012. The entry of the project is KylinODBC.sln. Mind the VS version.
+
+Make sure you have the following header files, import libraries and DLLs on your system
+1. SQL.H
+2. SQLTYPES.H
+3. SQLEXT.H
+4. ODBCINST.H
+5. ODBC32.LIB & ODBC32.DLL
+6. ODBCCP32.LIB & ODBCCP32.DLL
+
+You can obtain these from Microsoft site as a part of Platform SDK or MDAC kit
+
+
+List of folders and description:
+================================
+
+KylinODBC                  - Root folder containing the workspace. All the projects are part of this single workspace
+
+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\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.
+
+KylinODBC\Installer  	- Contains a MSI installer for kylin odbc driver(x86)
+
+KylinODBC\Installer(64bit)  - Contains a MSI installer for kylin odbc driver(x64)
+
+KylinODBC\doc               - Totorials for ODBC development starters.
+
+How to compile
+================================
+1. Get a windows PC with Microsoft Visual Studio 2012 installed. Additionaly install Microsoft Data Access Components (MDAC, http://www.microsoft.com/en-us/download/details.aspx?id=21995) on it.
+
+2. Download source code for zlib(for compression) and Casablanca(for REST invoking), and build them to static libaries. Remember if you want to build 64 bit odbc driver, you'll have to build 64 bit dependency libaries, the same goes for 32 bit 
+
+		Compiling zlib: refer to http://www.helyar.net/2010/compiling-zlib-lib-on-windows/ or http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html(this doc is in Chineses, but it's quite clear)
+		
+		Compliling Casablanca: refer to https://katyscode.wordpress.com/2014/04/01/how-to-statically-link-the-c-rest-sdk-casablanca
+
+3. Go to "Control Panel" -> "System" -> "Advanced system settings" -> "Environment Variables" -> "System variables", add two variables "ZLIB_HOME" and "CPPREST_HOME", their value being set to the home directory of zlib and Casablanca.
+
+4. Open KylinODBC.sln, if you're building a 32 bit ODBC driver, set the profile to RELEASE|Win32, build project Installer and find the driver exe at Installer/Express/SingleImage/DiskImages/DISK1. If you're building a 64 bit driver, set the profile to RELEASE|x64, and find the exe at Installer(x64bit)/Express/SingleImage/DiskImages/DISK1.
+
+
+
+all the best
+
+Hongbin Ma
+mahongbin@apache.org

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/ColorPrint.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/ColorPrint.cpp b/odbc/TestDLL/ColorPrint.cpp
new file mode 100644
index 0000000..77a1f0d
--- /dev/null
+++ b/odbc/TestDLL/ColorPrint.cpp
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <windows.h>
+
+#include "ColorPrint.h"
+
+CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
+WORD saved_attributes;
+bool init = false;
+
+void initLocals ( HANDLE hConsole ) {
+    /* Save current attributes */
+    GetConsoleScreenBufferInfo ( hConsole, &consoleInfo );
+    saved_attributes = consoleInfo.wAttributes;
+    init = true;
+}
+
+void setPrintColorRED() {
+    HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE );
+    
+    if ( !init ) {
+        initLocals ( hConsole );
+    }
+    
+    SetConsoleTextAttribute ( hConsole, FOREGROUND_RED );
+}
+
+void setPrintColorGreen() {
+    HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE );
+    
+    if ( !init ) {
+        initLocals ( hConsole );
+    }
+    
+    SetConsoleTextAttribute ( hConsole, FOREGROUND_GREEN );
+}
+
+void resetPrintColor() {
+    if ( !init )
+    { throw - 1; }
+    
+    HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE );
+    /* Restore original attributes */
+    SetConsoleTextAttribute ( hConsole, saved_attributes );
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/ColorPrint.h
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/ColorPrint.h b/odbc/TestDLL/ColorPrint.h
new file mode 100644
index 0000000..d907f22
--- /dev/null
+++ b/odbc/TestDLL/ColorPrint.h
@@ -0,0 +1,5 @@
+#pragma once
+
+void setPrintColorRED();
+void setPrintColorGreen();
+void resetPrintColor();

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/CompareQueryTests.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/CompareQueryTests.cpp b/odbc/TestDLL/CompareQueryTests.cpp
new file mode 100644
index 0000000..9574789
--- /dev/null
+++ b/odbc/TestDLL/CompareQueryTests.cpp
@@ -0,0 +1,530 @@
+#include "Tests.h"
+#include <vector>
+
+#include "ColorPrint.h"
+#include "fstream"
+
+// ----- whether to ask user for DSN and connection parameters OR specify -----
+//#define _CONNECT_WITH_PROMPT        1
+
+// ------------- maximum length to be displayed for a column ------------------
+#define _DISPLAY_MAX                128
+
+
+// -------------------- macro to handle error situations ----------------------
+#define ODBC_CHK_ERROR(hType,hValue,iStatus,szMsg)          \
+    {\
+        if ( status != SQL_SUCCESS ) {\
+            ShowDiagMessages ( hType, hValue, iStatus, szMsg );\
+        }\
+        if ( status == SQL_ERROR ) {\
+            goto Cleanup;\
+        }\
+    }
+
+// ---------------------------------- structure -------------------------------
+typedef struct BindColInfo {
+    SQLSMALLINT         iColTitleSize;              // size of column title
+    wchar_t*                szColTitle;                 // column title
+    SQLLEN          iColDisplaySize;            // size to display
+    void*               szColData;                  // display buffer
+    int                 iType;
+    bool                isSigned;
+    SQLLEN          indPtr;                     // size or null indicator
+    BOOL                fChar;                      // character col flag
+    struct BindColInfo* next;                       // linked list
+} BIND_COL_INFO;
+
+// -------------------------- function prototypes -----------------------------
+void        ShowDiagMessages ( SQLSMALLINT hType, SQLHANDLE hValue, SQLRETURN iStatus, char* szMsg );
+
+SQLRETURN   CheckResults ( HSTMT hStmt , wchar_t* sql );
+void        FreeBindings ( BIND_COL_INFO* pBindColInfo );
+
+int totalCount;
+int successCount;
+int failCount;
+std::vector<wstring> failedQueries;
+
+void validateOneQuery ( wchar_t* sql ) {
+    Sleep ( 1000 );
+    SQLRETURN       status;
+    SQLHANDLE       hEnv = 0;
+    SQLHANDLE       hConn = 0;
+    SQLHANDLE       hStmt = 0;
+    wchar_t szConnStrOut[1024];
+    SQLSMALLINT     x;
+    // show query to be executed
+    wprintf ( L"The query being validated: %ls \n", sql );
+    // BEFORE U CONNECT
+    // allocate ENVIRONMENT
+    status = SQLAllocHandle ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv );
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_ENV, hEnv, status, "" );
+    // set the ODBC version for behaviour expected
+    status = SQLSetEnvAttr ( hEnv,  SQL_ATTR_ODBC_VERSION, ( SQLPOINTER ) SQL_OV_ODBC3, 0 );
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_ENV, hEnv, status, "" );
+    // allocate CONNECTION
+    status = SQLAllocHandle ( SQL_HANDLE_DBC, hEnv, &hConn );
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_ENV, hEnv, status, "" );
+    #ifdef  _WIN64
+    // ----------- real connection takes place at this point
+    // ----------- option 1: user is prompted for DSN & options
+    status = SQLDriverConnect ( hConn, GetDesktopWindow(),
+                                ( unsigned char* ) "",
+                                SQL_NTS, szConnStrOut, 1024, &x,
+                                SQL_DRIVER_COMPLETE );
+    #else
+    status = SQLDriverConnectW ( hConn , GetDesktopWindow(),
+                                 //L"DSN=testDSN;",
+                                 L"DRIVER={KylinODBCDriver};PROJECT=default;UID=ADMIN;SERVER=http://localhost;PORT=80;",
+                                 SQL_NTS, szConnStrOut, 1024, &x,
+                                 SQL_DRIVER_COMPLETE );
+    #endif
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_DBC, hConn, status, "" );
+    // CONGRATUALTIONS ---- u r connected to a DBMS via an ODBC driver
+    // allocate STATEMENT
+    status = SQLAllocHandle ( SQL_HANDLE_STMT, hConn, &hStmt );
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_DBC, hConn, status, "" );
+    // execute the statement
+    //status = SQLExecDirect ( hStmt, ( unsigned char* )argv[1], SQL_NTS );
+    status = SQLExecDirectW ( hStmt, ( SQLWCHAR* ) sql, SQL_NTS );
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_STMT, hConn, status, "" );
+    // RESULTS READY
+    // show the full results row by row
+    status = CheckResults ( hStmt, sql );
+    totalCount++;
+    
+    if ( status == SQL_ERROR ) {
+        setPrintColorRED();
+        fputs ( "[FAIL]\n", stdout );
+        resetPrintColor();
+        failCount++;
+        failedQueries.push_back ( sql );
+    }
+    
+    else if ( status == SQL_SUCCESS ) {
+        setPrintColorGreen();
+        fputs ( "[SUCCESS]\n", stdout );
+        resetPrintColor();
+        successCount++;
+    }
+    
+    // check for error
+    ODBC_CHK_ERROR ( SQL_HANDLE_STMT, hStmt, status, "" );
+Cleanup:
+
+    if ( hStmt )
+    { SQLFreeHandle ( SQL_HANDLE_STMT, hStmt ); }
+    
+    if ( hConn )
+    { SQLFreeHandle ( SQL_HANDLE_DBC, hConn ); }
+    
+    if ( hEnv )
+    { SQLFreeHandle ( SQL_HANDLE_ENV, hEnv ); }
+    
+    return;
+}
+
+void validateQueries ( char* file ) {
+    std::string line;
+    std::ifstream infile ( file );
+    
+    while ( std::getline ( infile, line ) ) {
+        if ( line.size() < 5 )
+        { continue; }
+        
+        unique_ptr<wchar_t[]> p ( char2wchar ( line.c_str() ) );
+        validateOneQuery ( p.get() );
+    }
+    
+    infile.close();
+}
+
+
+bool isValueConsistent ( void* data, wstring& valueJ, int pSrcDataType, bool isSigned ) {
+    fwprintf ( stdout, L"The value from the JDBC is : %s \n", valueJ.c_str() );
+    
+    switch ( pSrcDataType ) {
+        case SQL_BIT: {
+                wstring tempW;
+                
+                if ( * ( char* ) data == 0 )
+                { tempW = L"false"; }
+                
+                else if ( * ( char* ) data == 1 )
+                { tempW = L"true"; }
+                
+                else
+                { return false; }
+                
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_CHAR:
+        case SQL_VARCHAR: {
+                string temp ( ( char* ) data );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_WCHAR:
+        case SQL_WVARCHAR: {
+                wstring tempW ( ( wchar_t* ) data );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_DECIMAL: {
+                string temp ( ( char* ) data );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_TINYINT: {
+                int v = 0;
+                
+                if ( isSigned )
+                { v = * ( char* ) data; }
+                
+                else
+                { v = * ( unsigned char* ) data; }
+                
+                char buffer[100];
+                _itoa ( v, buffer, 10 );
+                string temp ( buffer );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_SMALLINT: {
+                int v = 0;
+                
+                if ( isSigned )
+                { v = * ( short* ) data; }
+                
+                else
+                { v = * ( unsigned short* ) data; }
+                
+                char buffer[100];
+                _itoa ( v, buffer, 10 );
+                string temp ( buffer );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_INTEGER: {
+                __int64 v = 0;
+                
+                if ( isSigned )
+                { v = * ( int* ) data; }
+                
+                else
+                { v = * ( unsigned int* ) data; }
+                
+                char buffer[100];
+                _i64toa ( v, buffer, 10 );
+                string temp ( buffer );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_BIGINT: {
+                if ( isSigned ) {
+                    __int64 v = 0;
+                    v = * ( __int64* ) data;
+                    char buffer[100];
+                    _i64toa ( v, buffer, 10 );
+                    string temp ( buffer );
+                    wstring tempW = string2wstring ( temp );
+                    fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                    return tempW.compare ( valueJ ) == 0;
+                }
+                
+                else {
+                    unsigned __int64 v = 0;
+                    v = * ( unsigned __int64* ) data;
+                    char buffer[100];
+                    _ui64toa ( v, buffer, 10 );
+                    string temp ( buffer );
+                    wstring tempW = string2wstring ( temp );
+                    fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                    return tempW.compare ( valueJ ) == 0;
+                }
+            }
+            
+        case SQL_FLOAT: {
+                float v = 0;
+                v = * ( float* ) data;
+                fwprintf ( stdout, L"The value from the ODBC is (float) : %9.9f \n", v );
+                double x = ( v - _wtof ( valueJ.c_str() ) );
+                return ( x > -0.0000001 ) && ( x < 0.0000001 ); // In Kylin float is treated like double, so it might be more accurate
+            }
+            
+        case SQL_DOUBLE: {
+                double v = * ( double* ) data;
+                fwprintf ( stdout, L"The value from the ODBC is (double) : %9.9f\n ", v );
+                return v == wcstod ( valueJ.c_str(), NULL );
+            }
+            
+        case SQL_TYPE_DATE: {
+                string temp ( ( char* ) data );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        case SQL_TYPE_TIMESTAMP: {
+                string temp ( ( char* ) data );
+                wstring tempW = string2wstring ( temp );
+                fwprintf ( stdout, L"The value from the ODBC is : %s \n", tempW.c_str() );
+                return tempW.compare ( valueJ ) == 0;
+            }
+            
+        default:
+            return false;
+    }
+}
+
+// ----------------------------------------------------------------------------
+// to validate the full results row by row
+// ----------------------------------------------------------------------------
+SQLRETURN   CheckResults ( HSTMT hStmt , wchar_t* sql ) {
+    //First directly call REST to get a JDBC version result to compare against
+    std::unique_ptr<SQLResponse> response  = restQuery ( sql, "http://localhost", 80, "ADMIN", "KADMIN", "default" );
+    //Go with hStmt now
+    int                 i, iCol;
+    BIND_COL_INFO*      head;
+    BIND_COL_INFO*      last;
+    BIND_COL_INFO*      curr;
+    SQLRETURN           status;
+    SQLLEN                  cType;
+    SQLSMALLINT         iColCount;
+    // initializations
+    head = NULL;
+    
+    // ALLOCATE SPACE TO FETCH A COMPLETE ROW
+    
+    // get number of cols
+    if ( ( status = SQLNumResultCols ( hStmt, &iColCount ) ) != SQL_SUCCESS )
+    { return status; }
+    
+    // loop to allocate binding info structure
+    for ( iCol = 1; iCol <= iColCount; iCol ++ ) {
+        // alloc binding structure
+        curr = ( BIND_COL_INFO* ) calloc ( 1, sizeof ( BIND_COL_INFO ) );
+        
+        if ( curr == NULL ) {
+            fprintf ( stderr, "Out of memory!\n" );
+            return SQL_ERROR;                           // its not an ODBC error so no diags r required
+        }
+        
+        memset ( curr, 0, sizeof ( BIND_COL_INFO ) );
+        
+        // maintain link list
+        if ( iCol == 1 )
+        { head = curr; }                                // first col, therefore head of list
+        
+        else
+        { last->next = curr; }                          // attach
+        
+        last = curr;                                    // tail
+        
+        // get column title size
+        if ( ( status = SQLColAttributeW ( hStmt, iCol, SQL_DESC_NAME, NULL, 0, & ( curr->iColTitleSize ),
+                                           NULL ) ) != SQL_SUCCESS ) {
+            FreeBindings ( head );
+            return status;
+        }
+        
+        else {
+            ++ curr->iColTitleSize;                 // allow space for null char
+        }
+        
+        // allocate buffer for title
+        curr->szColTitle  = ( wchar_t* ) calloc ( 1, curr->iColTitleSize * sizeof ( wchar_t ) );
+        
+        if ( curr->szColTitle == NULL ) {
+            FreeBindings ( head );
+            fprintf ( stderr, "Out of memory!\n" );
+            return SQL_ERROR;                           // its not an ODBC error so no diags r required
+        }
+        
+        // get column title
+        if ( ( status = SQLColAttributeW ( hStmt, iCol, SQL_DESC_NAME, curr->szColTitle, curr->iColTitleSize,
+                                           & ( curr->iColTitleSize ), NULL ) ) != SQL_SUCCESS ) {
+            FreeBindings ( head );
+            return status;
+        }
+        
+        //xxx
+        // get col length
+        if ( ( status = SQLColAttributeW ( hStmt, iCol, SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL,
+                                           & ( curr->iColDisplaySize ) ) ) != SQL_SUCCESS ) {
+            FreeBindings ( head );
+            return status;
+        }
+        
+        // arbitrary limit on display size
+        if ( curr->iColDisplaySize > _DISPLAY_MAX )  { curr->iColDisplaySize = _DISPLAY_MAX; }
+        
+        // allocate buffer for col data + NULL terminator
+        curr->szColData = ( void* ) calloc ( 1, 2 * ( curr->iColDisplaySize + 1 ) * sizeof ( char ) );
+        
+        if ( curr->szColData == NULL ) {
+            FreeBindings ( head );
+            fprintf ( stderr, "Out of memory!\n" );
+            return SQL_ERROR;                           // its not an ODBC error so no diags r required
+        }
+        
+        //xxx
+        // get col type, not used now but can be checked to print value right aligned etcc
+        if ( ( status = SQLColAttributeW ( hStmt, iCol, SQL_DESC_CONCISE_TYPE, NULL, 0, NULL, &cType ) ) != SQL_SUCCESS ) {
+            FreeBindings ( head );
+            return status;
+        }
+        
+        curr->iType = cType;
+        fprintf ( stdout, "The type for column %d is %d\n", iCol, cType );
+        //xxx
+        // get col type, not used now but can be checked to print value right aligned etcc
+        SQLLEN unsignedV = 0;
+        
+        if ( ( status = SQLColAttributeW ( hStmt, iCol, SQL_DESC_UNSIGNED , NULL, 0, NULL, &unsignedV ) ) != SQL_SUCCESS ) {
+            FreeBindings ( head );
+            return status;
+        }
+        
+        curr->isSigned = ( unsignedV == 1 ) ? false : true;
+        fprintf ( stdout, "The column %d is signed ? %d\n", iCol, curr->isSigned );
+        // set col type indicator in struct
+        curr->fChar = ( cType == SQL_CHAR || cType == SQL_VARCHAR || cType == SQL_LONGVARCHAR ||
+                        cType == SQL_WCHAR || cType == SQL_WVARCHAR || cType == SQL_WLONGVARCHAR );
+        fprintf ( stdout, "char flag is set to %d\n", curr->fChar );
+        fputs ( "\n", stdout );
+        
+        //xxx
+        // bind the col buffer so that the driver feeds it with col value on every fetch and use generic char binding for very column
+        if ( ( status = SQLBindCol ( hStmt, iCol, SQL_C_DEFAULT, ( SQLPOINTER ) curr->szColData,
+                                     2 * ( curr->iColDisplaySize + 1 ) * sizeof ( char ), & ( curr->indPtr ) ) ) != SQL_SUCCESS ) {
+            FreeBindings ( head );
+            return status;
+        }
+    }
+    
+    // loop to print all the rows one by one
+    for ( i = 1; TRUE; i ++ ) {
+        // fetch the next row
+        if ( ( status = SQLFetch ( hStmt ) ) == SQL_NO_DATA_FOUND )
+        { break; }                                                  // no more rows so break
+        
+        // check for error
+        else if ( status == SQL_ERROR ) {                           // fetch failed
+            FreeBindings ( head );
+            return status;
+        }
+        
+        for ( curr = head, iCol = 0; iCol < iColCount; iCol ++, curr = curr->next ) {
+            fprintf ( stdout, "Row Index: %d, Column Cardinal : %d\n", i - 1, iCol );
+            
+            if ( !isValueConsistent ( curr->szColData, response->results[i - 1]->contents[iCol], curr->iType, curr->isSigned ) ) {
+                FreeBindings ( head );
+                return SQL_ERROR;
+            }
+            
+            fputs ( "\n", stdout );
+        }
+    }
+    
+    // free the allocated bindings
+    FreeBindings ( head );
+    return SQL_SUCCESS;
+}
+
+
+// ----------------------------------------------------------------------------
+// to free the col info allocated by ShowFullResults
+// ----------------------------------------------------------------------------
+
+void FreeBindings ( BIND_COL_INFO* pBindColInfo ) {
+    BIND_COL_INFO* next;
+    
+    // precaution
+    if ( pBindColInfo ) {
+        do {
+            // get the next col binding
+            next = pBindColInfo->next;
+            
+            // free any buffer for col title
+            if ( pBindColInfo->szColTitle ) {
+                free ( pBindColInfo->szColTitle );
+                pBindColInfo->szColTitle = NULL;
+            }
+            
+            // free any col data
+            if ( pBindColInfo->szColData ) {
+                free ( pBindColInfo->szColData );
+                pBindColInfo->szColData = NULL;
+            }
+            
+            // free the current binding
+            free ( pBindColInfo );
+            // make next the current
+            pBindColInfo = next;
+        }
+        while ( pBindColInfo );
+    }
+}
+
+// ----------------------------------------------------------------------------
+// to show the ODBC diagnostic messages
+// ----------------------------------------------------------------------------
+
+void ShowDiagMessages ( SQLSMALLINT hType, SQLHANDLE hValue, SQLRETURN iStatus, char* szMsg ) {
+    SQLSMALLINT iRec = 0;
+    SQLINTEGER  iError;
+    SQLTCHAR    szMessage[1024];
+    SQLTCHAR    szState[1024];
+    // header
+    fputs ( "\nDiagnostics:\n" , stdout );
+    
+    // in case of an invalid handle, no message can be extracted
+    if ( iStatus == SQL_INVALID_HANDLE ) {
+        fprintf ( stderr, "ODBC Error: Invalid handle!\n" );
+        return;
+    }
+    
+    // loop to get all diag messages from driver/driver manager
+    while ( SQLGetDiagRec ( hType, hValue, ++ iRec, szState, &iError, szMessage,
+                            ( SQLSMALLINT ) ( sizeof ( szMessage ) / sizeof ( SQLTCHAR ) ), ( SQLSMALLINT* ) NULL ) == SQL_SUCCESS )
+    { _ftprintf ( stderr, TEXT ( "[%5.5s] %s (%d)\n" ), szState, szMessage, iError ); }
+    
+    // gap
+    fputs ( "\n" , stdout );
+}
+
+void crossValidate() {
+    char* queryFile = "testqueries.txt";
+    //char* queryFile = "c:\\foo.txt";
+    fprintf ( stdout, "The test queries file location is: %s\n", queryFile );
+    //validateOneQuery(L"SELECT * FROM classicmodels.new_table;");
+    validateQueries ( queryFile );
+    fprintf ( stdout, "The verify process is done.\n", queryFile );
+    fprintf ( stdout, "Total queries: %d, Successful queries: %d, Failed queries: %d.\n", totalCount, successCount,
+              failCount );
+              
+    for ( vector<wstring>::iterator iter = failedQueries.begin(); iter != failedQueries.end(); ++iter ) {
+        fprintf ( stdout, wstring2string ( *iter ).c_str() );
+        fprintf ( stdout, "\n\n" );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/QueryFlowTest.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/QueryFlowTest.cpp b/odbc/TestDLL/QueryFlowTest.cpp
new file mode 100644
index 0000000..9961e48
--- /dev/null
+++ b/odbc/TestDLL/QueryFlowTest.cpp
@@ -0,0 +1,32 @@
+#include "Tests.h"
+
+void queryFlowTest() {
+    SQLRETURN       status;
+    SQLHANDLE       hEnv = 0;
+    SQLHANDLE       hConn = 0;
+    SQLHANDLE       hStmt = 0;
+    wchar_t szConnStrOut[1024];
+    SQLSMALLINT     x;
+    // BEFORE U CONNECT
+    // allocate ENVIRONMENT
+    status = SQLAllocHandle ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv );
+    // set the ODBC version for behaviour expected
+    status = SQLSetEnvAttr ( hEnv,  SQL_ATTR_ODBC_VERSION, ( SQLPOINTER ) SQL_OV_ODBC3, 0 );
+    // allocate CONNECTION
+    status = SQLAllocHandle ( SQL_HANDLE_DBC, hEnv, &hConn );
+    status = SQLDriverConnectW ( hConn, GetDesktopWindow(),
+                                 L"DRIVER={KylinODBCDriver};PROJECT=default;UID=ADMIN;SERVER=http://localhost;PORT=80;",
+                                 //L"DSN=testDSN",
+                                 SQL_NTS, szConnStrOut, 1024, &x,
+                                 SQL_DRIVER_PROMPT );
+    // check for error
+    //ODBC_CHK_ERROR(SQL_HANDLE_DBC,hConn,status,"");
+    
+    if ( hConn )
+    { SQLFreeHandle ( SQL_HANDLE_DBC, hConn ); }
+    
+    if ( hEnv )
+    { SQLFreeHandle ( SQL_HANDLE_ENV, hEnv ); }
+    
+    printf ( "finish" );
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/Report.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/Report.cpp b/odbc/TestDLL/Report.cpp
new file mode 100644
index 0000000..27a9530
--- /dev/null
+++ b/odbc/TestDLL/Report.cpp
@@ -0,0 +1,9 @@
+#include "Tests.h"
+
+void report ( const char* msg ) {
+    throw exception ( msg );
+}
+
+void report() {
+    throw exception();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/RestAPITest.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/RestAPITest.cpp b/odbc/TestDLL/RestAPITest.cpp
new file mode 100644
index 0000000..f16bfb3
--- /dev/null
+++ b/odbc/TestDLL/RestAPITest.cpp
@@ -0,0 +1,20 @@
+#include "Tests.h"
+
+void restAPITest() {
+    {
+        bool ret = restAuthenticate ( KServerAddr, KPort, KUserName, KPassword );
+        
+        if ( !ret )
+        { report(); }
+    }
+    {
+        std::vector<string> holder;
+        restListProjects ( KServerAddr, KPort, KUserName, KPassword, holder );
+        
+        if ( holder.size() == 0 )
+        { report(); }
+    }
+    {
+        std::unique_ptr<MetadataResponse> ret = restGetMeta ( KServerAddr, KPort, KUserName, KPassword, KDefaultProject );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/SimpleQueryTest.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/SimpleQueryTest.cpp b/odbc/TestDLL/SimpleQueryTest.cpp
new file mode 100644
index 0000000..50a5432
--- /dev/null
+++ b/odbc/TestDLL/SimpleQueryTest.cpp
@@ -0,0 +1,30 @@
+#include "Tests.h"
+
+void simpleQueryTest() {
+    //Intercept query test
+    {
+        std::unique_ptr<SQLResponse> y  = restQuery ( L"SELECT 1", KServerAddr, KPort, KUserName, KPassword, KDefaultProject );
+        
+        if ( ( int ) y->results.size() != 1 ) {
+            report();
+        }
+    }
+    //Ungzipped Query Test
+    {
+        std::unique_ptr<SQLResponse> y  = restQuery ( L"select cal_dt from test_kylin_fact limit 1", KServerAddr, KPort,
+                                                      KUserName, KPassword, KDefaultProject );
+                                                      
+        if ( ( int ) y->results.size() != 1 ) {
+            report();
+        }
+    }
+    //zipped Query Test
+    {
+        std::unique_ptr<SQLResponse> y  = restQuery ( L"select * from test_kylin_fact limit 12", KServerAddr, KPort, KUserName,
+                                                      KPassword, KDefaultProject );
+                                                      
+        if ( ( int ) y->results.size() != 12 ) {
+            report();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/Source.cpp
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/Source.cpp b/odbc/TestDLL/Source.cpp
new file mode 100644
index 0000000..b0b589b
--- /dev/null
+++ b/odbc/TestDLL/Source.cpp
@@ -0,0 +1,13 @@
+#include "vld.h"
+#include "Tests.h"
+using namespace std;
+
+
+int main() {
+    //unit test
+    //restAPITest();
+    //regression test:
+    //simpleQueryTest();
+    //queryFlowTest();
+    crossValidate();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/TestDLL.vcxproj
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/TestDLL.vcxproj b/odbc/TestDLL/TestDLL.vcxproj
new file mode 100644
index 0000000..7f5fa1e
--- /dev/null
+++ b/odbc/TestDLL/TestDLL.vcxproj
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="ColorPrint.cpp" />
+    <ClCompile Include="CompareQueryTests.cpp" />
+    <ClCompile Include="QueryFlowTest.cpp" />
+    <ClCompile Include="Report.cpp" />
+    <ClCompile Include="RestAPITest.cpp" />
+    <ClCompile Include="SimpleQueryTest.cpp" />
+    <ClCompile Include="Source.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="ColorPrint.h" />
+    <ClInclude Include="Tests.h" />
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{9E229B0C-A9FA-4A36-8089-8C60D109E2A0}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>TestDLL</RootNamespace>
+    <ProjectName>Tests</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <OutDir>Debug\</OutDir>
+    <IntDir>Debug\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <OutDir>$(SolutionDir)$(Configuration)</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(SolutionDir)\Common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <ShowIncludes>false</ShowIncludes>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ModuleDefinitionFile>
+      </ModuleDefinitionFile>
+      <AdditionalDependencies>$(SolutionDir)\Common\$(Platform)\$(Configuration)\Common.lib;$(SolutionDir)\Driver\$(Platform)\$(Configuration)\driver.lib;$(CPPREST_HOME)\Binaries\Win32\Debug\cpprest110d_2_0.lib;winhttp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(SolutionDir)\Common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>$(SolutionDir)\Common\$(Platform)\$(Configuration)\Common.lib;$(SolutionDir)\Driver\$(Platform)\$(Configuration)\driver.lib;$(CPPREST_HOME)\Binaries\Win32\Release\cpprest110_2_0.lib;winhttp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/TestDLL.vcxproj.filters
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/TestDLL.vcxproj.filters b/odbc/TestDLL/TestDLL.vcxproj.filters
new file mode 100644
index 0000000..ee88b0a
--- /dev/null
+++ b/odbc/TestDLL/TestDLL.vcxproj.filters
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Source.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="SimpleQueryTest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Report.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="RestAPITest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="QueryFlowTest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ColorPrint.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="CompareQueryTests.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Tests.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="ColorPrint.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/TestDLL.vcxproj.user
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/TestDLL.vcxproj.user b/odbc/TestDLL/TestDLL.vcxproj.user
new file mode 100644
index 0000000..1b93756
--- /dev/null
+++ b/odbc/TestDLL/TestDLL.vcxproj.user
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LocalDebuggerEnvironment>PATH=$(SolutionDir)\Driver\$(Platform)\$(Configuration)\;%PATH%</LocalDebuggerEnvironment>
+    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
+  </PropertyGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/TestDLL/Tests.h
----------------------------------------------------------------------
diff --git a/odbc/TestDLL/Tests.h b/odbc/TestDLL/Tests.h
new file mode 100644
index 0000000..06dbe9c
--- /dev/null
+++ b/odbc/TestDLL/Tests.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#define prod_KServerAddr ""
+#define prod_KPort 443
+
+#define KServerAddr "http://localhost"
+#define KPort 80
+#define KUserName "ADMIN"
+#define KPassword "KADMIN"
+#define KDefaultProject "default"
+
+#include <conio.h>
+#include <stdio.h>
+#include <tchar.h>
+#include <stdlib.h>
+#include <string>
+#include <memory>
+#include <windows.h>
+#include <sqlext.h>                                     // required for ODBC calls
+#include <iostream>
+#include <REST.h>
+
+void report();
+void report ( const char* msg );
+
+void simpleQueryTest();
+void queryFlowTest();
+void restAPITest();
+void crossValidate();