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