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