Changeset: 71ceed60d557 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=71ceed60d557
Modified Files:
        clients/odbc/driver/ODBCDbc.c
        clients/odbc/driver/ODBCDbc.h
        clients/odbc/driver/SQLColumns.c
        clients/odbc/driver/SQLConnect.c
        clients/odbc/driver/SQLDisconnect.c
        clients/odbc/driver/SQLProcedures.c
        clients/odbc/driver/SQLTables.c
Branch: Mar2018
Log Message:

Add ODBC support for comments (remarks).


diffs (170 lines):

diff --git a/clients/odbc/driver/ODBCDbc.c b/clients/odbc/driver/ODBCDbc.c
--- a/clients/odbc/driver/ODBCDbc.c
+++ b/clients/odbc/driver/ODBCDbc.c
@@ -66,7 +66,8 @@ newODBCDbc(ODBCEnv *env)
        dbc->port = 0;
        dbc->dbname = NULL;
 
-       dbc->Connected = 0;
+       dbc->Connected = false;
+       dbc->has_comment = false;
        dbc->sql_attr_autocommit = SQL_AUTOCOMMIT_ON;   /* default is 
autocommit */
        dbc->sql_attr_metadata_id = SQL_FALSE;
        dbc->sql_attr_connection_timeout = 0;
diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h
--- a/clients/odbc/driver/ODBCDbc.h
+++ b/clients/odbc/driver/ODBCDbc.h
@@ -53,7 +53,8 @@ typedef struct tODBCDRIVERDBC {
        char *host;             /* Server host */
        int port;               /* Server port */
        char *dbname;           /* Database Name or NULL */
-       int Connected;          /* 1 is Yes, 0 is No */
+       bool Connected;         /* whether we are connecte to a server */
+       bool has_comment;       /* whether the server has sys.comments */
        SQLUINTEGER sql_attr_autocommit;
        SQLUINTEGER sql_attr_metadata_id;
        SQLUINTEGER sql_attr_connection_timeout;
diff --git a/clients/odbc/driver/SQLColumns.c b/clients/odbc/driver/SQLColumns.c
--- a/clients/odbc/driver/SQLColumns.c
+++ b/clients/odbc/driver/SQLColumns.c
@@ -353,7 +353,7 @@ MNDBColumns(ODBCStmt *stmt,
                            "when true then cast(%d as smallint) "
                            "when false then cast(%d as smallint) "
                       "end as nullable, "
-                      "cast('' as varchar(1)) as remarks, "
+                      "%s as remarks, "
                       "c.\"default\" as column_def, "
                       "case c.type "
                            "when 'bigint' then %d "
@@ -418,7 +418,7 @@ MNDBColumns(ODBCStmt *stmt,
                       "end as is_nullable "
                 "from sys.schemas s, "
                      "sys.tables t, "
-                     "sys.columns c, "
+                     "sys.columns c%s, "
                      "sys.env() e "
                 "where s.id = t.schema_id and "
                       "t.id = c.table_id and "
@@ -437,6 +437,8 @@ MNDBColumns(ODBCStmt *stmt,
                SQL_TINYINT, SQL_WVARCHAR,
                /* nullable: */
                SQL_NULLABLE, SQL_NO_NULLS,
+               /* remarks: */
+               stmt->Dbc->has_comment ? "com.remark" : "cast(null as 
varchar(1))",
                /* sql_data_type: */
                SQL_BIGINT, SQL_LONGVARBINARY, SQL_BIT, SQL_WCHAR,
                SQL_WLONGVARCHAR, SQL_DATETIME, SQL_DECIMAL, SQL_DOUBLE,
@@ -451,7 +453,9 @@ MNDBColumns(ODBCStmt *stmt,
                SQL_CODE_HOUR_TO_SECOND, SQL_CODE_MINUTE,
                SQL_CODE_MINUTE_TO_SECOND, SQL_CODE_SECOND,
                SQL_CODE_TIME, SQL_CODE_TIMESTAMP, SQL_CODE_TIMESTAMP,
-               SQL_CODE_TIME);
+               SQL_CODE_TIME,
+               /* from clause: */
+               stmt->Dbc->has_comment ? " left outer join sys.comments com on 
com.id = c.id" : "");
        assert(strlen(query) < 6300);
        query_end += strlen(query_end);
 
diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c
--- a/clients/odbc/driver/SQLConnect.c
+++ b/clients/odbc/driver/SQLConnect.c
@@ -91,6 +91,14 @@ get_serverinfo(ODBCDbc *dbc)
                }
        }
        mapi_close_handle(hdl);
+       if ((hdl = mapi_query(dbc->mid, "select id from sys._tables where name 
= 'comments' and schema_id = (select id from sys.schemas where name = 'sys')")) 
== NULL)
+               return;
+       n = NULL;
+       while (mapi_fetch_row(hdl)) {
+               n = mapi_fetch_field(hdl, 0);
+       }
+       dbc->has_comment = n != NULL;
+       mapi_close_handle(hdl);
 }
 
 SQLRETURN
@@ -231,7 +239,7 @@ MNDBConnect(ODBCDbc *dbc,
                        free(dsn);
        } else {
                /* store internal information and clean up buffers */
-               dbc->Connected = 1;
+               dbc->Connected = true;
                dbc->mid = mid;
                if (dbc->dsn != NULL)
                        free(dbc->dsn);
diff --git a/clients/odbc/driver/SQLDisconnect.c 
b/clients/odbc/driver/SQLDisconnect.c
--- a/clients/odbc/driver/SQLDisconnect.c
+++ b/clients/odbc/driver/SQLDisconnect.c
@@ -61,7 +61,8 @@ SQLDisconnect(SQLHDBC ConnectionHandle)
        dbc->mid = NULL;
        dbc->cachelimit = 0;
        dbc->Mdebug = 0;
-       dbc->Connected = 0;
+       dbc->Connected = false;
+       dbc->has_comment = false;
 
        return SQL_SUCCESS;
 }
diff --git a/clients/odbc/driver/SQLProcedures.c 
b/clients/odbc/driver/SQLProcedures.c
--- a/clients/odbc/driver/SQLProcedures.c
+++ b/clients/odbc/driver/SQLProcedures.c
@@ -136,16 +136,18 @@ MNDBProcedures(ODBCStmt *stmt,
                        "0 as num_input_params, "
                        "0 as num_output_params, "
                        "0 as num_result_sets, "
-                       "cast('' as varchar(1)) as remarks, "
+                       "%s as remarks, "
                        "cast(case when p.type = %d then %d else %d end as 
smallint) as procedure_type "
                 "from sys.schemas as s, "
                      "sys.env() as e, "
-                     "sys.functions as p "
+                     "sys.functions as p%s "
                 "where p.schema_id = s.id and "
                       "p.language >= %d and "
                       "p.type in (%d, %d, %d) and "
                       "e.name = 'gdk_dbname'",
+                stmt->Dbc->has_comment ? "c.remark" : "cast(null as 
varchar(1))",
                 F_PROC, SQL_PT_PROCEDURE, SQL_PT_FUNCTION,
+                stmt->Dbc->has_comment ? " left outer join sys.comments c on 
p.id = c.id" : "",
                 FUNC_LANG_SQL, F_FUNC, F_PROC, F_UNION);
        assert(strlen(query) < 800);
        query_end += strlen(query_end);
diff --git a/clients/odbc/driver/SQLTables.c b/clients/odbc/driver/SQLTables.c
--- a/clients/odbc/driver/SQLTables.c
+++ b/clients/odbc/driver/SQLTables.c
@@ -95,6 +95,9 @@ MNDBTables(ODBCStmt *stmt,
                                      "name as table_schem, "
                                      "cast(null as varchar(1)) as table_name, "
                                      "cast(null as varchar(1)) as table_type, "
+                              /* ODBC says remarks column contains
+                               * NULL even though MonetDB supports
+                               * schema remarks */
                                      "cast(null as varchar(1)) as remarks "
                               "from sys.schemas order by table_schem");
        } else if (NameLength1 == 0 &&
@@ -165,19 +168,21 @@ MNDBTables(ODBCStmt *stmt,
                        goto nomem;
                query_end = query;
 
-               strcpy(query_end,
+               sprintf(query_end,
                       "select e.value as table_cat, "
                              "s.name as table_schem, "
                              "t.name as table_name, "
                              "tt.table_type_name as table_type, "
-                             "cast(null as varchar(1)) as remarks "
+                             "%s as remarks "
                       "from sys.schemas s, "
-                           "sys.tables t, "
+                           "sys.tables t%s, "
                            "sys.table_types tt, "
                            "sys.env() e "
                       "where s.id = t.schema_id and "
                             "t.type = tt.table_type_id and "
-                            "e.name = 'gdk_dbname'");
+                            "e.name = 'gdk_dbname'",
+                       stmt->Dbc->has_comment ? "c.remark" : "cast(null as 
varchar(1))",
+                       stmt->Dbc->has_comment ? " left outer join sys.comments 
c on c.id = t.id" : "");
                assert(strlen(query) < 1900);
                query_end += strlen(query_end);
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to