Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: Proposal for new pgsqlODBC feature - hiding tables inaccessible to the current user



Hi everyone,

I've just completed the patch for only listing tables accessible by the
current user for psqlodbc as detailed in my email here:
http://archives.postgresql.org/pgsql-odbc/2007-05/msg00068.php. As
suggested in the original post, I have implemented a tick box called
"Only list user-accessible tables" on page 2 of the Datasource Advanced
Options dialog. When this box is ticked, only tables on which the user
has one of SELECT, INSERT, DELETE or UPDATE privileges will appear in
the table list for the given DSN.

I think that this would be a really useful feature to add to the
psqlodbc driver, and so I have attached a diff from CVS HEAD. As far as
I know, the only part I have missed is adding the tickbox and its
corresponding translation to the Japanese version of the dialog in
psqlodbc.rc. Please let me know if there is any more work I need to do
in order to get this applied.


Kind regards,

Mark.


Index: connection.c
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/connection.c,v
retrieving revision 1.161
diff -u -r1.161 connection.c
--- connection.c	4 Jun 2007 11:49:49 -0000	1.161
+++ connection.c	7 Jun 2007 14:34:03 -0000
@@ -286,6 +286,7 @@
 		conninfo->fake_mss = -1;
 		conninfo->cvt_null_date_string = -1;
 		conninfo->autocommit_public = SQL_AUTOCOMMIT_ON;
+		conninfo->list_usertables_only = -1;
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 		conninfo->xa_opt = -1;
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
Index: connection.h
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/connection.h,v
retrieving revision 1.85
diff -u -r1.85 connection.h
--- connection.h	2 Jun 2007 05:32:18 -0000	1.85
+++ connection.h	5 Jun 2007 05:18:57 -0000
@@ -306,6 +306,7 @@
 	signed char	fake_mss;
 	signed char	cvt_null_date_string;
 	signed char	autocommit_public;
+	signed char list_usertables_only;
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 	signed char	xa_opt;
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
Index: dlg_specific.c
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/dlg_specific.c,v
retrieving revision 1.80
diff -u -r1.80 dlg_specific.c
--- dlg_specific.c	2 Jun 2007 05:32:18 -0000	1.80
+++ dlg_specific.c	7 Jun 2007 14:38:22 -0000
@@ -188,6 +188,7 @@
 			INI_BYTEAASLONGVARBINARY "=%d;"
 			INI_USESERVERSIDEPREPARE "=%d;"
 			INI_LOWERCASEIDENTIFIER "=%d;"
+			INI_LISTUSERTABLESONLY "=%d;"
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 			INI_XAOPT "=%d"	/* XAOPT */
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
@@ -223,6 +224,7 @@
 			,ci->bytea_as_longvarbinary
 			,ci->use_server_side_prepare
 			,ci->lower_case_identifier
+			,ci->list_usertables_only
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 			,ci->xa_opt
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
@@ -293,6 +295,8 @@
 			flag |= BIT_USESERVERSIDEPREPARE;
 		if (ci->lower_case_identifier)
 			flag |= BIT_LOWERCASEIDENTIFIER;
+		if (ci->list_usertables_only)
+			flag |= BIT_LISTUSERTABLESONLY;
 
 		if (ci->sslmode[0])
 			olen = snprintf(&connect_string[hlen], nlen, ";"
@@ -407,10 +411,12 @@
 	sprintf(ci->show_system_tables, "%d", (char)((flag & BIT_SHOWSYSTEMTABLES) != 0));
 	sprintf(ci->show_oid_column, "%d", (char)((flag & BIT_SHOWOIDCOLUMN) != 0));
 	sprintf(ci->fake_oid_index, "%d", (char)((flag & BIT_FAKEOIDINDEX) != 0));
+	ci->list_usertables_only = (char)((flag & BIT_LISTUSERTABLESONLY) != 0);
 	ci->true_is_minus1 = (char)((flag & BIT_TRUEISMINUS1) != 0);
 	ci->bytea_as_longvarbinary = (char)((flag & BIT_BYTEAASLONGVARBINARY) != 0);
 	ci->use_server_side_prepare = (char)((flag & BIT_USESERVERSIDEPREPARE) != 0);
 	ci->lower_case_identifier = (char)((flag & BIT_LOWERCASEIDENTIFIER) != 0);
+	
 }
 BOOL
 copyAttributes(ConnInfo *ci, const char *attribute, const char *value)
@@ -494,6 +500,8 @@
 		ci->use_server_side_prepare = atoi(value);
 	else if (stricmp(attribute, INI_LOWERCASEIDENTIFIER) == 0 || stricmp(attribute, ABBR_LOWERCASEIDENTIFIER) == 0)
 		ci->lower_case_identifier = atoi(value);
+	else if (stricmp(attribute, INI_LISTUSERTABLESONLY) == 0 || stricmp(attribute, ABBR_LISTUSERTABLESONLY) == 0)
+		ci->list_usertables_only = atoi(value);
 	else if (stricmp(attribute, INI_SSLMODE) == 0 || stricmp(attribute, ABBR_SSLMODE) == 0)
 	{
 		switch (value[0])
@@ -670,6 +678,9 @@
 		ci->bde_environment = 0;
 	if (ci->cvt_null_date_string < 0)
 		ci->cvt_null_date_string = 0;
+	if (ci->list_usertables_only < 0)
+		ci->list_usertables_only = DEFAULT_LISTUSERTABLESONLY;
+
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 	if (ci->xa_opt < 0)
 		ci->xa_opt = DEFAULT_XAOPT;
@@ -835,6 +846,14 @@
 	if (ci->sslmode[0] == '\0' || overwrite)
 		SQLGetPrivateProfileString(DSN, INI_SSLMODE, "", ci->sslmode, sizeof(ci->sslmode), ODBC_INI);
 
+	if (ci->list_usertables_only < 0 || overwrite)
+	{
+		SQLGetPrivateProfileString(DSN, INI_LISTUSERTABLESONLY, "", temp, sizeof(temp), ODBC_INI);
+		if (temp[0])
+			ci->list_usertables_only = atoi(temp);
+	}
+
+
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 	if (ci->xa_opt < 0 || overwrite)
 	{
@@ -1117,6 +1136,11 @@
 								 INI_SSLMODE,
 								 ci->sslmode,
 								 ODBC_INI);
+	sprintf(temp, "%d", ci->list_usertables_only);
+	SQLWritePrivateProfileString(DSN,
+								 INI_LISTUSERTABLESONLY,
+								 temp,
+								 ODBC_INI);
 #ifdef	_HANDLE_ENLIST_IN_DTC_
 	sprintf(temp, "%d", ci->xa_opt);
 	SQLWritePrivateProfileString(DSN, INI_XAOPT, temp, ODBC_INI);
Index: dlg_specific.h
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/dlg_specific.h,v
retrieving revision 1.55
diff -u -r1.55 dlg_specific.h
--- dlg_specific.h	11 Apr 2007 15:22:23 -0000	1.55
+++ dlg_specific.h	7 Jun 2007 13:20:46 -0000
@@ -141,6 +141,8 @@
 #define ABBR_LOWERCASEIDENTIFIER	"C9"
 #define INI_SSLMODE			"SSLmode"
 #define ABBR_SSLMODE			"CA"
+#define INI_LISTUSERTABLESONLY		"ListUserTablesOnly"
+#define ABBR_LISTUSERTABLESONLY		"CB"
 #define INI_EXTRAOPTIONS		"AB"
 
 #define	SSLMODE_DISABLE		"disable"
@@ -180,8 +182,9 @@
 #define BIT_BYTEAASLONGVARBINARY		(1L<<24)
 #define BIT_USESERVERSIDEPREPARE		(1L<<25)
 #define BIT_LOWERCASEIDENTIFIER			(1L<<26)
+#define BIT_LISTUSERTABLESONLY			(1L<<27)
 
-#define EFFECTIVE_BIT_COUNT			27
+#define EFFECTIVE_BIT_COUNT			28
 
 /*	Mask for extra options	*/
 #define	BIT_FORCEABBREVCONNSTR			1L
@@ -203,6 +206,7 @@
 #define DEFAULT_UNIQUEINDEX			1		/* dont recognize */
 #define DEFAULT_COMMLOG				0		/* dont log */
 #define DEFAULT_DEBUG				0
+#define DEFAULT_LISTUSERTABLESONLY	0		/* show all tables by default */
 #define DEFAULT_UNKNOWNSIZES			UNKNOWNS_AS_MAX
 
 
Index: dlg_wingui.c
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/dlg_wingui.c,v
retrieving revision 1.18
diff -u -r1.18 dlg_wingui.c
--- dlg_wingui.c	2 Jun 2007 05:32:18 -0000	1.18
+++ dlg_wingui.c	7 Jun 2007 14:43:51 -0000
@@ -566,6 +566,7 @@
 			CheckDlgButton(hdlg, DS_UPDATABLECURSORS, ci->allow_keyset);
 			CheckDlgButton(hdlg, DS_SERVERSIDEPREPARE, ci->use_server_side_prepare);
 			CheckDlgButton(hdlg, DS_BYTEAASLONGVARBINARY, ci->bytea_as_longvarbinary);
+			CheckDlgButton(hdlg, DS_LISTUSERTABLESONLY, ci->list_usertables_only);
 			/*CheckDlgButton(hdlg, DS_LOWERCASEIDENTIFIER, ci->lower_case_identifier);*/
 
 			EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), atoi(ci->show_oid_column));
@@ -638,6 +639,7 @@
 					ci->allow_keyset = IsDlgButtonChecked(hdlg, DS_UPDATABLECURSORS);
 					ci->use_server_side_prepare = IsDlgButtonChecked(hdlg, DS_SERVERSIDEPREPARE);
 					ci->bytea_as_longvarbinary = IsDlgButtonChecked(hdlg, DS_BYTEAASLONGVARBINARY);
+					ci->list_usertables_only = IsDlgButtonChecked(hdlg, DS_LISTUSERTABLESONLY);
 					/*ci->lower_case_identifier = IsDlgButtonChecked(hdlg, DS_LOWERCASEIDENTIFIER);*/
 
 					/* OID Options */
Index: info.c
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/info.c,v
retrieving revision 1.145
diff -u -r1.145 info.c
--- info.c	2 Jun 2007 05:32:18 -0000	1.145
+++ info.c	7 Jun 2007 12:38:04 -0000
@@ -1709,6 +1709,18 @@
 		}
 	}
 
+	/*
+	 * Check to see if we are only interested in listing tables upon
+	 * which the user has one of SELECT, INSERT, DELETE or UPDATE
+	 * privileges
+	 */
+	if (!list_some)
+	{
+		if (ci->list_usertables_only)
+			strcat(tables_query, " and (has_table_privilege(current_user, c.oid, 'select') or has_table_privilege(current_user, c.oid, 'insert') or" 
+			" has_table_privilege(current_user, c.oid, 'delete') or has_table_privilege(current_user, c.oid, 'update'))"); 
+	}
+
 	if (list_schemas)
 		strcat(tables_query, " order by nspname");
 	else if (list_some)
Index: psqlodbc.rc
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/psqlodbc.rc,v
retrieving revision 1.87
diff -u -r1.87 psqlodbc.rc
--- psqlodbc.rc	23 Oct 2006 15:58:29 -0000	1.87
+++ psqlodbc.rc	4 Jun 2007 20:59:01 -0000
@@ -542,6 +542,8 @@
                     BS_AUTOCHECKBOX | WS_TABSTOP,163,71,90,10
     CONTROL         "bytea as LO",DS_BYTEAASLONGVARBINARY,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,16,84,87,10
+    CONTROL         "Only list user-accessible tables",DS_LISTUSERTABLESONLY,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,163,84,147,10
     GROUPBOX        "Int8 As",IDC_STATIC,5,97,256,25
     CONTROL         "default",DS_INT8_AS_DEFAULT,"Button",BS_AUTORADIOBUTTON | 
                     WS_GROUP,12,107,40,10
Index: resource.h
===================================================================
RCS file: /cvsroot/psqlodbc/psqlodbc/resource.h,v
retrieving revision 1.40
diff -u -r1.40 resource.h
--- resource.h	23 Oct 2006 15:58:29 -0000	1.40
+++ resource.h	4 Jun 2007 20:58:51 -0000
@@ -94,6 +94,7 @@
 #define DRV_DTCLOG			1083
 #define DS_EXTRA_OPTIONS		1084
 #define IDC_TEST			1085
+#define DS_LISTUSERTABLESONLY	1086
 
 // Next default values for new objects
 // 


Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group