Hola.

En gvSIG 1.9 RC2, build 1250 (y en versiones anteriores, ya que lo hemos
detectado también en la 1.1.2) no hay ningún impedimento a la hora de poner
en edición una capa sobre la que no hay permisos de escritura (por ejemplo,
en la que el usuario tiene tan sólo el privilegio SELECT). Esto conlleva a
que cuando se quieren guardar los cambios de la capa el usuario se encuentra
con un error y pierde la conexión a la BD.

Investigando en el código me he encontrado con que en el driver de PostGIS
no comprueba si la capa es editable, simplemente devuelve siempre true en el
método isWritable. Así que propongo los parches adjuntos para los archivos
PostGISDriver y PostGISWriter para que se efectúen las comprobaciones
necesarias.

Como una pequeña mejora a la situación actual, en la función canSaveEdits
(PostGISWriter) se hace una consulta de privilegios sobre la tabla para
comprobar si se tienen los privilegios INSERT, UPDATE y DELETE. Y en
isWritable se llama a esta función.

Además también se propone otra consulta en canAlterTable (PostGISWriter)
para comprobar si el usuario es dueño de la tabla o superusuario para saber
así si tiene permisos de modificación de estructura de la tabla.

Espero que sirva de ayuda.
Un saludo.

-- 
Javier Estévez Valiñas
Grupo de Desarrollo
Cartolab - Laboratorio de Ingeniería Cartográfica
http://www.cartolab.es

ETS Ingeniería de Caminos, Canales y Puertos
Universidade da Coruña
Campus de Elviña - 15071 A Coruña (España)
(34)981167000 ext. 5493
Index: .
===================================================================
--- .	(revision 31485)
+++ .	(working copy)
@@ -910,7 +910,7 @@
 	}
 */
 	public boolean isWritable() {
-		return true;
+		return writer.canSaveEdits();
 	}
 
 	public IWriter getWriter() {
Index: .
===================================================================
--- .	(revision 31485)
+++ .	(working copy)
@@ -283,13 +283,35 @@
 	}
 
 	public boolean canAlterTable() {
-		return true;
+		try {
+            boolean can_alter = false;
+            st = ((ConnectionJDBC)conex).getConnection().createStatement();
+            String sql = "SELECT current_user=(SELECT tableowner from pg_tables WHERE schemaname = '" + lyrDef.getSchema() + 
+            	"' and tablename='" + lyrDef.getTableName() + "') OR (SELECT usesuper FROM pg_user WHERE usename=current_user) AS can_alter;";
+            ResultSet rs = st.executeQuery(sql);
+            if (rs.next()) {
+                can_alter = rs.getBoolean("can_alter");
+            }
+            return can_alter;
+		} catch (SQLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return false;
+		}
 	}
 
 	public boolean canSaveEdits() {
-		// TODO: Revisar los permisos de la tabla en cuesti�n.
 		try {
-			return !((ConnectionJDBC)conex).getConnection().isReadOnly();
+            boolean can_edit = false;
+            st = ((ConnectionJDBC)conex).getConnection().createStatement();
+            String sql = "SELECT has_table_privilege('" + lyrDef.getComposedTableName() + "', 'insert') " +
+                    "AND has_table_privilege('" + lyrDef.getComposedTableName() + "', 'update') " +
+                    "AND has_table_privilege('" + lyrDef.getComposedTableName() + "', 'delete') as can_edit;";
+            ResultSet rs = st.executeQuery(sql);
+            if (rs.next()) {
+                can_edit = rs.getBoolean("can_edit");
+            }
+            return can_edit && !((ConnectionJDBC)conex).getConnection().isReadOnly();
 		} catch (SQLException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
_______________________________________________
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores@listserv.gva.es
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores

Responder a