From 831f99a401652deb7fd530d80cfd29537af4f39d Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Mon, 14 Jan 2013 01:28:11 +0100 Subject: [PATCH] oracle provider improvements: - improve srs lookup - insert crs to oracle table on import, if not existent (requires INSERT privilege on MDSYS.SDO_COORD_REF_SYSTEM) - move table lookup into thread - use QgsMessageOutput for import errors (also in postgres and spatialite) - german translation update --- doc/TRANSLATORS | 66 +- i18n/qgis_de.ts | 1677 ++++++++--------- .../oracle/qgsoraclecolumntypethread.cpp | 35 +- .../oracle/qgsoraclecolumntypethread.h | 5 +- src/providers/oracle/qgsoracleconn.cpp | 55 +- src/providers/oracle/qgsoracleconn.h | 2 + src/providers/oracle/qgsoracledataitems.cpp | 121 +- src/providers/oracle/qgsoracledataitems.h | 7 +- src/providers/oracle/qgsoracleprovider.cpp | 263 ++- src/providers/oracle/qgsoracleprovider.h | 15 +- .../oracle/qgsoraclesourceselect.cpp | 94 +- src/providers/oracle/qgsoraclesourceselect.h | 1 - .../postgres/qgspostgresdataitems.cpp | 9 +- .../postgres/qgspostgresprovider.cpp | 2 +- .../spatialite/qgsspatialitedataitems.cpp | 9 +- 15 files changed, 1217 insertions(+), 1144 deletions(-) diff --git a/doc/TRANSLATORS b/doc/TRANSLATORS index 18cce452015..d7d419d0c63 100755 --- a/doc/TRANSLATORS +++ b/doc/TRANSLATORS @@ -1,42 +1,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + diff --git a/i18n/qgis_de.ts b/i18n/qgis_de.ts index 0a9daf3d084..fe85dc3c4c6 100644 --- a/i18n/qgis_de.ts +++ b/i18n/qgis_de.ts @@ -6707,10 +6707,6 @@ Bitte koorigieren Sie dies, da die OSM-Erweiterung nicht weiß welche Layer das Import Sextante classKlasse Sextante importieren - - Import QgisInterface class - Klasse QgisInterface importiern - Import PyQt.QtCore class Modul PyQt.QtCore importieren @@ -8521,7 +8517,7 @@ Nur %1 von %2 Objekten geschrieben. KBS undefiniert - voreingestelltes KBS gewählt: %1 - + Reading raster Lade Raster @@ -8669,10 +8665,6 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA No active vector layerKein aktiver Vektorlayer - - To select features, you must choose a vector layer by clicking on its name in the legend - Um Objekte zu wählen, müssen Sie einen Vektorlayer in der Legende durch Anklicken auswählen - To select features, choose a vector layer in the legend @@ -8991,8 +8983,8 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA Nur %1 von %2 Objekten geschrieben. - - + + @@ -9001,12 +8993,12 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA Verbindung zur Datenbank schlug fehl - + No owner name found Kein Besitzername gefunden - + Creation of data source %1 failed: %2 @@ -9014,37 +9006,37 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA %2 - + Loading of the layer %1 failed Laden des Layers %1 gescheitert - + Field name clash found (%1 not remappable) Feldnamenkonflikt gefunden (%1 nicht abbildbar) - + %1 not owner of the table %2. %1 nicht Besitzer der Tabelle %2. - + Unable determine number of geometry columns of layer %1.%2: %3 Konnte die Geometriespaltenanzahl des Layer %1.%2 nicht feststellen: %3 - + Unable to delete layer %1.%2: %3 Konnte Layer %1.%2 nicht löschen: %3 - + Unable to clean metadata %1.%2: %3 Konnte Metadaten %1.%2 nicht löschen: @@ -9065,14 +9057,14 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA - + Unsupported type for field %1 Nicht unterstützter Typ für Feld %1 - + Creation of fields failed Erzeugung der Felder gescheitert @@ -9381,140 +9373,140 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA QgisApp - - + + Invalid Data Source Ungültige Datenquelle - - + + No Layer Selected Keinen Layer ausgewählt - + There is a new version of QGIS available Eine neue Version von QGIS ist verfügbar - + You are running a development version of QGIS Sie verwenden eine Entwicklungsversion von QGIS - + You are running the current version of QGIS Sie verwenden die aktuelle Version von QGIS - + Would you like more information? Wollen Sie mehr Information? - - - - + + + + QGIS Version Information QGIS-Versionsinformationen - + Unable to get current version information from server Kann Informationen zu aktuellen Version nicht vom Server holen - + Connection refused - server may be down Verbindung abgelehnt - Server vielleicht heruntergefahren - + QGIS server was not found QGIS-Server nicht gefunden - - - - + + + + Invalid Layer Ungültiger Layer - + %1 is an invalid layer and cannot be loaded. %1 ist ein ungültiger Layer und kann nicht geladen werden. - + Problem deleting features Problem beim Löschen der Objekte - + A problem occured during deletion of features Beim Löschen der Objekte ist ein Problem aufgetreten - + No Vector Layer Selected Es wurde kein Vektorlayer gewählt - + Deleting features only works on vector layers Löschen von Objekten ist nur von Vektorlayern möglich - + To delete features, you must select a vector layer in the legend Zum Löschen von Objekte zu muss ein Vektorlayer in der Legende gewählt werden - + Map legend that displays all the layers currently on the map canvas. Click on the check box to turn a layer on or off. Double click on a layer in the legend to customize its appearance and set other properties. Legende, die alle im Kartenfenster angezeigten Layer enthält. Bitte auf die Kontrollkästchen klicken, um einen Layer an- oder auszuschalten. Mit einem Doppelklick in der Legende kann die Erscheinung und sonstige Eigenschaften eines Layers festgelegt werden. - + Map overview canvas. This canvas can be used to display a locator map that shows the current extent of the map canvas. The current extent is shown as a red rectangle. Any layer on the map can be added to the overview canvas. Übersichtsfenster. Dieses Fenster kann benutzt werden um die momentane Ausdehnung des Kartenfensters darzustellen. Der momentane Ausschnitt ist als rotes Rechteck dargestellt. Jeder Layer in der Karte kann zum Übersichtsfenster hinzugefügt werden. - + Displays the current map scale Zeigt den momentanen Kartenmaßstab an - + Render Zeichnen - + When checked, the map layers are rendered in response to map navigation commands and other events. When not checked, no rendering is done. This allows you to add a large number of layers and symbolize them before rendering. Wenn angewählt, werden die Kartenlayer abhängig von der Bedienung der Navigationsinstrumente, gezeichnet. Anderenfalls werden die Layer nicht gezeichnet. Dies erlaubt es, eine große Layeranzahl hinzuzufügen und das Aussehen der Layer vor dem Zeichnen zu setzen. - + Choose a QGIS project file Eine QGIS-Projektdatei wählen - + Toggle map rendering Zeichnen der Karte einschalten - + Open a GDAL Supported Raster Data Source Öffnen einer GDAL-Rasterdatenquelle - + Choose a QGIS project file to open QGIS-Projektdatei zum Öffnen wählen @@ -9534,272 +9526,282 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA Überprüfe die Datenbank - + + Browser + Browser + + + + Browser (2) + Browser (2) + + + Restoring loaded plugins Stelle die geladenen Erweiterungen wieder her - + Initializing file filters Initialisiere Dateifilter - + Restoring window state Stelle Fensterstatus wieder her - - + + QGIS Ready! QGIS ist startklar! - + Ready Fertig - + QGIS version QGIS-Version - + QGIS code revision QGIS-Codeversion - + Compiled against Qt Kompiliert gegen Qt - + Running against Qt Laufendes Qt - + GEOS Version GEOS-Version - + PostgreSQL Client Version PostgreSQL-Client-Version - - + + No support. Keine Unterstützung. - + SpatiaLite Version SpatiaLite-Version - + QWT Version QWT-Version - + This copy of QGIS writes debugging output. Diese QGIS-Kopie schreibt Debugausgaben. - + Unable to open project Kann das Projekt nicht öffnen - + Labeling Options Beschriftungsoptionen - + Please select a vector layer first Bitte wählen zur zuvor einen Layer - - + + Duplicate layer: Layer kopieren: - + %1 (duplication resulted in invalid layer) %1 (Kopieren führt zu ungültigem Layer) - + %1 (%2type unsupported) %1 (Typ %2 nicht unterstützt) - + Unknown network socket error: %1 Unbekannter Netzwerkfehler: %1 - - + + Layer is not valid Layer ist ungültig - + The layer is not a valid layer and can not be added to the map Der Layer ist ungültig und kann daher nicht zum Kartenfenster hinzugefügt werden - + Project has layer(s) in edit mode with unsaved edits, which will NOT be saved! Projekt hat Layer im Bearbeitungsmodus mit nicht gespeicherten Bearbeitungen, die NICHT gespeichert werden! - + Save? Speichern? - + Do you want to save the current project?%1 Wollen Sie das aktuelle Projekt speichern?%1 - + Current CRS: %1 (OTFR enabled) Aktuelles KBS: %1 (OTF-Reprojektion aktiv) - + Current CRS: %1 (OTFR disabled) Aktuelles KBS: %1 (OTF-Reprojektion aus) - + Extents: Ausdehnung: - - + + Error adding valid layer to map canvas Fehler beim Hinzufügen eines gültigen Layers zur Karte - - - + + + Raster layer Raster-Layer - + Unsupported Data Source Nicht unterstütztes Datenformat - - - - - - - - - - - + + + + + + + + + + + Error Fehler - + Checking provider plugins Provider-Erweiterungen werden geprüft - + Starting Python Python wird gestartet - + Provider does not support deletion Provider unterstützt keine Löschoperationen - + Data provider does not support deleting features Der Provider hat nicht die Möglichkeit, Objekte zu löschen - - - + + + Layer not editable Der Layer kann nicht bearbeitet werden - + The current layer is not editable. Choose 'Start editing' in the digitizing toolbar. Der aktuelle Layer kann nicht bearbeitet werden. Bitte 'Bearbeitungsstatus umschalten' aus der Digitalisierwerkzeugleiste wählen. - + Scale Maßstab - + Current map scale (formatted as x:y) Aktueller Kartenmaßstab (x:y formatiert) - + Map coordinates at mouse cursor position Kartenkoordinaten beim Mauszeiger - + Current map scale Aktueller Kartenmaßstab - + Project file is older Projektdatei ist älter - + <tt>Settings:Options:General</tt> Menu path to setting options <tt>Einstellungen:Optionen:Allgemein</tt> - + Warn me when opening a project file saved with an older version of QGIS Beim Öffnen einer Projektdatei, die mit einer älteren QGIS-Version erstellt wurde, warnen - + Overview Übersicht - + Progress bar that displays the status of rendering layers and other time-intensive operations Fortschrittsanzeige für das Zeichnen von Layern und andere zeitintensive Operationen - + Stop map rendering Zeichnen der Karte abbrechen @@ -9809,22 +9811,22 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA Kartenansicht. Hier werden Raster- und Vektorlayer angezeigt, wenn sie der Karte hinzugefügt werden - + Toggle extents and mouse position display Ausdehnungs- und Mauspositionsanzeige umschalten - + This icon shows whether on the fly coordinate reference system transformation is enabled or not. Click the icon to bring up the project properties dialog to alter this behaviour. Diese Icon zeigt an, ob On-The-Fly-Transformation des Koordinatenbezugssystem aktiv ist. Anklicken, um dies in den Projektionseigenschaften zu ändern. - + CRS status - Click to open coordinate reference system dialog KBS-Status - Klicken um den Dialog zum Koordinatenbezugssystem zu öffnen - + Maptips require an active layer Kartentipps erfordern einen aktuellen Layer @@ -9847,154 +9849,150 @@ Bitte nehmen Sie Kontakt zu den Entwicklern auf.Quantum GIS - + Minimize Minimieren - + Ctrl+M Minimize Window Strg+M - + Minimizes the active window to the dock Minimiert das aktive Fenster ins Dock - + Zoom Zoom - + Toggles between a predefined size and the window size set by the user Schaltet zwischen voreingestellter und vom Benutzer bestimmten Fenstergröße um - + Bring All to Front Alle in den Vordergrund bringen - + Bring forward all open windows Alle geöffneten Fenster vorholen - + Failed to open Python console: Konnte Python-Konsole nicht öffnen: - + Panels Bedienfelder - + Toolbars Werkzeugkästen - + &Database Da&tenbank - - + + Coordinate: Koordinate: - + Current map coordinate Aktuelle Kartenkoordinate - + Control rendering order Bestimmt Zeichenreihenfolge - + Layer order Layerreihenfolge - - - + + + Private qgis.db Benutzer qgis.db - + Could not open qgis.db Konnte qgis.db nicht öffnen - + Migration of private qgis.db failed. %1 Migration der Benutzer qgis.db schlug fehl. %1 - + Compiled against GDAL/OGR Kompiliert mit GDAL/OGR - + Running against GDAL/OGR Läuft mit GDAL/OGR - + %1 doesn't have any layers %1 hat keine Layer - + Select raster layers to add... Einzufügende Rasterlayer wählen... - + Cannot get MSSQL select dialog from provider. Konnte den MSSQL-Auswahldialog nicht vom Datenlieferanten holen. - - - + + + QGis files QGis-Dateien - Labeling - Beschriftung - - - + Cannot copy style: %1 Kann Stil nicht kopieren: %1 - + Cannot parse style: %1:%2:%3 Kann Stil nicht interpretieren: %1:%2:%3 - + Cannot read style: %1 Kann Stil nicht lesen: %1 - + Could not %1 changes to layer %2 Errors: %3 @@ -10005,95 +10003,95 @@ Fehler: %3 - + rollback verworfen - + cancel abgebrochen - + Save Speichern - - - + + + all Alle - + Rollback Verwerfen - + Cancel Abbrechen - + Current edits Aktuelle Änderungen - + %1 current changes for %2 layer(s)? Aktuelle Änderungen für %2 Layer %1? - + copy Kopie - + Plugin layer Erweiterungslayer - + Memory layer Speicherlayer - + Couldn't load Python support library: %1 Konnte Python-Unterstützungsbibliothek nicht laden: %1 - + Couldn't resolve python support library's instance() symbol. Konnte Symbol instance() nicht in Python-Unterstützungsbibliothek finden. - + Python support ENABLED :-) Python-Unterstützung aktiviert :-) - + QGIS - Changes since last release QGIS-Änderung seit der letzten Ausgabe - - + + To perform a full histogram stretch, you need to have a raster layer selected. Um eine volle Histogrammstreckung durchzuführen, muß ein Rasterlayer gewählt sein. - + This project file was saved by an older version of QGIS Die Projektdatei wurde mit einer älteren QGIS-Version gespeichert - + Always ignore these errors? @@ -10102,7 +10100,7 @@ Always ignore these errors? Diese Fehler immer ignorieren? - + %n SSL errors occured number of errors @@ -10111,380 +10109,372 @@ Diese Fehler immer ignorieren? - + Raster Raster - Security warning: - Sicherheitswarnung: - - - + Log Messages Protokoll - + QGIS starting... QGIS startet... - + Current Edits Aktuelle Änderungen - + Window Fenster - + Vect&or &Vektor - + &Web &Web - + Shows the map coordinates at the current cursor position. The display is continuously updated as the mouse is moved. It also allows editing to set the canvas center to a given position. The format is lat,lon or east,north Zeigt die Kartenkoordinate an der aktuellen Mausposition. Die Anzeige wird laufend aktualisiert während die Maus bewegt wird. Sie kann auch bearbeitet werden, um die Kartenanzeige auf eine gegebene Koordinate zu zentrieren. Das Format ist Breite,Höhe oder Ost,Nord - + Current map coordinate (lat,lon or east,north) Aktuelle Kartenkoordinaten (Breite,Höhe oder Ost,Nord) - + Map layer list that displays all layers in drawing order. Layerliste, die alle Layer in Zeichenreihenfolge anzeigt. - + [ERROR] Can not make qgis.db private copy [FEHLER] Kann private Kopie von qgis.db nicht anlegen - + Update of view in private qgis.db failed. %1 Aktualisierung der Sicht in privater qgis.db gescheitert. %1 - - + + < Blank > < Leer > - + PROJ.4 Version PROJ.4-Version - + QScintilla2 Version QScintilla2-Version - + Select zip layers to add... ZIP-Layer zum Hinzufügen wählen... - + Vector Vektor - + Select vector layers to add... Einzufügende Vektorlayer wählen... - + PostgreSQL PostgreSQL - + Cannot get PostgreSQL select dialog from provider. Kann PostgreSQL-Auswahldialog des Datenlieferanten nicht bestimmen. - + %1 is an invalid layer - not loaded %1 ist ein ungültiger Layer - nicht geladen - + SpatiaLite SpatiaLite - + Cannot get SpatiaLite select dialog from provider. Kann SpatiaLite-Auswahldialog nicht vom Datenlieferanten holen. - + MSSQL MSSQL - + Oracle Oracle - + Cannot get Oracle select dialog from provider. Konnte den Oracle-Auswahldialog nicht vom Datenlieferanten holen. - + WMS WMS - + Cannot get WMS select dialog from provider. Konnte den WMS-Auswahldialog nicht vom Datenlieferanten holen. - + WCS WCS - + Cannot get WCS select dialog from provider. Konnte den WCS-Auswahldialog nicht vom Datenlieferanten holen. - + WFS WFS - + Cannot get WFS select dialog from provider. Konnte WFS-Auswahldialog nicht vom Datenlieferanten holen. - + Calculating... Berechne... - - + + Abort... Abbrechen... - + Security warning Sicherheitswarnung - + project macros have been disabled. Projektmakros wurden abgeschaltet. - + Enable macros Makros aktivieren - + Choose a file name to save the QGIS project file as Name für zu speichernden QGIS-Projektdatei wählen - + Unable to load %1 %1 kann nicht geladen werden - + Choose a file name to save the map image as Name für Datei zum Speichern des Kartenabbilds wählen - Please select a vector layer first. - Bitte wählen zur zuvor einen Layer. - - - + Layer labeling settings Layerbeschriftungseinstellungen - + Cannot write raster error code: %1 Rasterschreibfehlercode: %1 - + Saving done Speichern abgeschlossen - + Export to vector file has been completed Export in Vektordatei ist abgeschlossen - + Save error Fehler beim Speichern - + Export to vector file failed. Error: %1 Export in Vektordatei schlug fehl. Fehler: %1 - + Features deleted Objekt gelöscht - + Merging features... Objekte werden verschmolzen... - + Abort Abbrechen - - + + Composer %1 Druckzusammenstellung %1 - - + + No active layer Kein aktiver Layer - - + + No active layer found. Please select a layer in the layer list Keinen aktiven Layer gefunden. Bitte einen Layer aus der Liste wählen - - + + Active layer is not vector Aktiver ist kein Vektorlayer - - + + The merge features tool only works on vector layers. Please select a vector layer from the layer list Das Verschmelzen von Objekte funktioniert nur mit Vektorlayern. Bitte einen Vektorlayer aus der Liste wählen - - + + Merging features can only be done for layers in editing mode. To use the merge tool, go to Layer->Toggle editing Objekte können nur auf Layern im Bearbeitungsmodus verschmolzen werden. Bitte mit Layer->Bearbeitungsmodus umschalten, um das Verschmelzungswerkzeug zu benutzen - - - + + + The merge tool requires at least two selected features Das Verschmelzungswerkzeug erfordert mindestens zwei gewählte Objekte - - - + + + Not enough features selected Nicht genug Objekte gewählt - + Merged feature attributes Objektattribute vereinen - - + + Merge failed Zusammenführung fehlgeschlagen - - + + An error occured during the merge operation Beim Zusammenführen trat ein Fehler auf - - + + The union operation would result in a geometry type that is not compatible with the current layer and therefore is canceled Die Vereinigungsoperation würde zu einem Geometrietyp führen, der nicht zum aktuellen Layer paßt, und wurde daher abgebrochen - + Union operation canceled Vereinigungsvorgang abgebrochen - + Merged features Objekte verschmelzen - + Features cut Objekte ausgeschnitten - + Features pasted Objekte eingefügt - + Start editing failed Bearbeitungsbeginn schlug fehl - + Provider cannot be opened for editing Lieferant kann nicht zum Bearbeiten geöffnet werden - + Stop editing Bearbeitung beenden - + Do you want to save the changes to layer %1? Sollen die Änderungen am Layer %1 gespeichert werden? - - + + Could not commit changes to layer %1 Errors: %2 @@ -10495,91 +10485,91 @@ Fehler: %2 - + Problems during roll back Probleme beim Zurücknehmen der Änderungen - + GPS Information GPS-Information - + Map coordinates for the current view extents Kartenkoordinaten für den aktuell sichtbaren Ausschnitt - + Warning Warnung - + This layer doesn't have a properties dialog. Dieser Layer hat keine Eigenschaftendialog. - + Authentication required Authentifikation erforderlich - + Proxy authentication required Proxy-Authentifikation erforderlich - + SSL errors occured accessing URL %1: SSL-Fehler beim Zugriff auf URL %1: - + Quantum GIS - %1 ('%2') Quantum GIS - %1 ('%2') - + %1 is not a valid or recognized data source %1 ist keine gültige Datenquelle oder wird nicht erkannt - - + + Saved project to: %1 Projekt in %1 gespeichert - - + + Unable to save project %1 Konnte Projekt %1 nicht speichern - + Saved map image to %1 Kartenabbild als %1 gespeichert - + Unable to communicate with QGIS Version server %1 Konnte nicht mit dem QGIS-Versionserver kommunizieren %1 - + No Raster Layer Selected Kein Rasterlayer gewählt - + The layer %1 is not a valid layer and can not be added to the map Der Layer %1 ist ungültig und kann der Karte nicht hinzugefügt werden - + %n feature(s) selected on layer %1. number of selected features @@ -10588,27 +10578,27 @@ Fehler: %2 - + %1 is not a supported raster data source %1 ist keine unterstützte Rasterdatenquelle - + <p>This project file was saved by an older version of QGIS. When saving this project file, QGIS will update it to the latest version, possibly rendering it useless for older versions of QGIS.<p>Even though QGIS developers try to maintain backwards compatibility, some of the information from the old project file might be lost. To improve the quality of QGIS, we appreciate if you file a bug report at %3. Be sure to include the old project file, and state the version of QGIS you used to discover the error.<p>To remove this warning when opening an older project file, uncheck the box '%5' in the %4 menu.<p>Version of the project file: %1<br>Current version of QGIS: %2 <p>Diese Projektdatei wurde mit einer älteren QGIS-Version gespeichert. Beim Speichern dieser Projektdatei wird QGIS es auf die aktuelle Version aktualisieren und sie damit unter Umständen für ältere QGIS-Versionen unbrauchbar machen. <p>Obwohl die QGIS-Entwickler versuchen Rückwärtskompatibilität zu erhalten, könnten dabei einige Informationen der alten Projektdatei verloren gehen. Um die Qualität von QGIS zu verbessern, würden wir es begrüßen, wenn Sie einen Fehler unter %3 melden würden. Bitte legen Sie die alte Projektdatei bei und nennen Sie die QGIS-Version mit der Sie diesen Fehler entdeckt haben. <p>Um diese Warnung in Zukunft zu unterdrücken, entfernen Sie bitte das Häkchen in '%5' im Menü %4.<p>Version der Projektdatei: %1<br>Aktuelle QGIS-Version: %2 - + Layers Layer - + Delete features Objekte löschen - + Delete %n feature(s)? number of features to delete @@ -12298,11 +12288,6 @@ Datenbank: %2 QgsBrowserDockWidget - - - Browser - Browser - Add Selected Layers @@ -26137,14 +26122,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.add feature Objekt hinzugefügt - - Not a vector layer - Keine Vektorlayer - - - The current layer is not a vector layer - Der aktuelle Layer ist kein Vektorlayer - Layer cannot be added to @@ -26155,14 +26132,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.The data provider for this layer does not support the addition of features. Der Datenlieferant dieses Layers unterstützt das Hinzufügen von neuen Objekten nicht. - - Layer not editable - Der Layer kann nicht bearbeitet werden - - - Cannot edit the vector layer. Use 'Toggle Editing' to make it editable. - Der Vektorlayer kann nicht geändert werden. Benutzen Sie bitte 'Bearbeitungsstatus umschalten', um ihn zu ändern. - @@ -26230,22 +26199,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten. QgsMapToolAddPart - - Not a vector layer - Kein Vektorlayer - - - The current layer is not a vector layer - Der aktuelle Layer ist kein Vektorlayer - - - Layer not editable - Der Layer kann nicht bearbeitet werden - - - Cannot edit the vector layer. Use 'Toggle Editing' to make it editable. - Der Vektorlayer kann nicht geändert werden. Benutzen Sie bitte 'Bearbeitungsstatus umschalten', um ihn zu ändern. - @@ -26311,22 +26264,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten. QgsMapToolAddRing - - Not a vector layer - Keine Vektorlayer - - - The current layer is not a vector layer - Der aktuelle Layer ist kein Vektorlayer - - - Layer not editable - Der Layer kann nicht bearbeitet werden - - - Cannot edit the vector layer. Use 'Toggle Editing' to make it editable. - Der Vektorlayer kann nicht geändert werden. Benutzen Sie bitte 'Bearbeitungsstatus umschalten', um ihn zu ändern. - Coordinate transform error @@ -26586,14 +26523,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten. QgsMapToolMoveFeature - - Layer not editable - Der Layer kann nicht bearbeitet werden - - - Cannot edit the vector layer. Use 'Toggle Editing' to make it editable. - Der Vektorlayer kann nicht geändert werden. Benutzen Sie bitte 'Bearbeitungsstatus umschalten', um ihn zu ändern. - Feature moved @@ -26662,22 +26591,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten. QgsMapToolReshape - - Not a vector layer - Kein Vektorlayer - - - The current layer is not a vector layer - Der aktuelle Layer ist kein Vektorlayer - - - Layer not editable - Der Layer kann nicht bearbeitet werden - - - Cannot edit the vector layer. Use 'Toggle Editing' to make it editable. - Der Vektorlayer kann nicht geändert werden. Benutzen Sie bitte 'Bearbeitungsstatus umschalten', um ihn zu ändern. - Coordinate transform error @@ -26794,10 +26707,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.No feature split done Keine Objekttrennung vorgenommen - - Cannot edit the vector layer. Use 'Toggle Editing' to make it editable. - Der Vektorlayer kann nicht geändert werden. Benutzen Sie bitte 'Bearbeitungsstatus umschalten', um ihn zu ändern. - Features split @@ -26808,18 +26717,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.If there are selected features, the split tool only applies to the selected ones. If you like to split all features under the split line, clear the selection Wenn Objekte ausgewählt sind, wird die Objekttrennung nur auf diese angewendet. Um alle Objekte zu trennen, muss die Auswahl aufgehoben werden - - Not a vector layer - Keine Vektorlayer - - - The current layer is not a vector layer - Der aktuelle Layer ist kein Vektorlayer - - - Layer not editable - Der Layer kann nicht bearbeitet werden - Coordinate transform error @@ -27296,11 +27193,6 @@ http://meine.kiste.com/cgi-bin/mapserv.exe QgsMessageBar - - - Countdown - Countdown - Remaining messages @@ -27317,7 +27209,7 @@ http://meine.kiste.com/cgi-bin/mapserv.exe Schließen - + more mehr @@ -29562,21 +29454,21 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein QgsOptions - - - + + + Semi transparent circle Teiltransparenter Kreis - - - + + + Cross Kreuz - + Detected active locale on your system: %1 Festgestellte Spracheinstellung des Systems: %1 @@ -29666,27 +29558,27 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Vollsuche - + No Stretch Kein Strecken - + Stretch To MinMax Strecken auf MinMax - + Stretch And Clip To MinMax Strecken und Zuschneiden auf MinMax - + Clip To MinMax Zuschneiden auf MinMax - + To vertex Zum Stützpunkt @@ -29696,202 +29588,202 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Keine / Planar - - + + Cumulative pixel count cut Kommulativer Pixelanzahl-Schnitt - + Minimum / maximum Minimum / Maximum - + Mean +/- standard deviation Mittlere +/- Standardabweichung - + To segment Zum Segment - + To vertex and segment Zum Stützpunkt und Segment - - - + + + None Keine - + Off Aus - + QGIS QGIS - + GEOS GEOS - + Round Rund - + Mitre Eckig - + Bevel Abgerundet - - - + + + Save default project Als Vorgabeprojekt speichern - + You must set a default project Sie müssen ein Vorgabeprojekt setzen - + Current project saved as default Aktuelles Projekt als Vorgabe gespeichert - + Error saving current project as default Konnte aktuelles Projekt nicht als Vorgabe speichern - + Choose a directory to store project template files Wählen Sie ein Verzeichnis für die Speicherung von Projektvorlagedateien - + Selection color Auswahlfarbe - + Create Options - %1 Driver Erzeugungsoptionen - %1 Treiber - + Create Options - pyramids Erzeugungsoptionen - Pyramiden - + Overwrite Überschreiben - + If Undefined Wenn definiert - + Unset Nicht gesetzt - + Prepend Voranstellen - + Append Anhängen - - - + + + Choose a directory Verzeichnis wählen - + Enter scale Maßstab angeben - + Scale denominator Maßstabsnenner - + Load scales Maßstäbe laden - - + + XML files (*.xml *.XML) XML-Dateien (*.xml *.XML) - + Save scales Maßstäbe speichern - - + + map units Karteneinheiten - - + + pixels Pixel - + Central point (fastest) Zentrum (am schnellsten) - + Chain (fast) Kette (schnell) - + Popmusic tabu chain (slow) Popmusik-Tabu-Kette (langsam) - + Popmusic tabu (slow) Popmusik-Tabu (langsam) - + Popmusic chain (very slow) Popmusik-Kette (sehr langsam) @@ -29899,58 +29791,58 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein QgsOptionsBase - + Hide splash screen at startup Splashscreen beim Start nicht anzeigen - + Map display will be updated (drawn) after this many features have been read from the data source Kartenanzeige wird erneuert (gezeichnet) nachdem so viele Objekte von der Datenquelle gelesen wurden - + Make lines appear less jagged at the expense of some drawing performance Linien auf Kosten der Zeichengeschwindigkeit weniger gezackt zeichnen - + By default new la&yers added to the map should be displayed Normalerweise werden alle neuen La&yer im Kartenfenster angezeigt - + Measure tool Messwerkzeug - + Fix problems with incorrectly filled polygons Problem mit falsch gefüllten Polygonen beheben - - + + % % - + Panning and zooming Verschieben und Zoomen - + Zoom Zoom - + Zoom and recenter Zoomen und mittig zentrieren - + Nothing Nichts @@ -29961,42 +29853,42 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Sprache - + Locale to use instead Stattdessen folgende Spracheinstellungen benutzen - + Additional Info Ergänzende Informationen - + Detected active locale on your system: Festgestellte aktive Spracheinstellung: - + Rubberband Gummiband - + Line width in pixels Linienbreite in Pixel - + Snapping Objektfang - + Zoom to mouse cursor Zur Mausposition zoomen - + Project files Projektdateien @@ -30019,82 +29911,82 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Kartenwerkzeuge - + Prompt to save project changes when required Bei Bedarf nachfragen, ob geänderte Projekte gespeichert werden sollen - + Warn when opening a project file saved with an older version of QGIS Warnung ausgeben, wenn QGIS-Projekt einer früheren Version geöffnet wird - + Create new project from default project Neues Projekt aus Vorgabeprojekt erstellen - + Set current project as default Aktuelles Projekt als Vorgabe speichern - + Reset default Vorgabe zurücksetzen - + Template folder Vorlagenverzeichnis - + Browse Durchsuchen - + Reset Zurücksetzen - + Enable macros Makros aktivieren - + Never Nie - + Ask Fragen - + For this session only Nur in dieser Sitzung - + Always (not recommended) Immer (nicht empfohlen) - + Default Map Appearance (overridden by project properties) Voreingestelles Kartenaussehen (Projekteigenschaften überschreiben) - + Selection color Farbe für Auswahlen - + Background color Hintergrundfarbe @@ -30135,97 +30027,97 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein 32 - + Double click action in legend Doppelklick-Aktion in Legende - + Open layer properties Layereigenschaften öffnen - + Open attribute table Attributtabelle öffnen - + Capitalise layer names in legend Layernamen groß schreiben - + Display classification attribute names in legend Klassifikationsattributnamen in der Legende anzeigen - + Create raster icons in legend Rastericons für Legende erzeugen - + Show tips at start up Tipps beim Starten anzeigen - + Open identify results in a dock window (QGIS restart required) Abfrageergebnisse in einem Dockfenster (QGIS-Neustart erforderlich) - + Open snapping options in a dock window (QGIS restart required) Fangoptionsdialog in einem Dockfenster anzeigen (QGIS-Neustart erforderlich) - + Open attribute table in a dock window (QGIS restart required) Attributtabelle gedockt öffnen (QGIS-Neustart erforderlich) - + Add PostGIS layers with double click and select in extended mode PostGIS-Layer per Doppelklick hinzufügen und zur Auswahl den erweiterten Modus verwenden - + Copy geometry in WKT representation from attribute table Geometrie in WKT aus Attributtabelle kopieren - + Ignore shapefile encoding Shapefile-Kodierung ignorieren - + Attribute table behaviour Attributtabellenverhalten - + Attribute table row cache Attributtabellenzeilencache - + Representation for NULL values Repräsentation für NULL-Werte - + Prompt for raster sublayers Nach Unterlayern fragen - + Scan for valid items in the browser dock Nach gültigen Element im Browser suchen - + Scan for contents of compressed files (.zip) in browser dock Inhalt komprimierter Dateien (.zip) im Browser durchsuchen @@ -30236,57 +30128,57 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein GDAL - + GDAL Drivers GDAL-Treiber - + In some cases more than one GDAL driver can be used to load the same raster format. Use the list below to specify which to use. In einigen Fällen können mehrere GDAL-Treiber benutzt werden um bestimmte Rasterformate zu laden. Im Folgenden können Sie einstellen, welche benutzt werden sollen. - + Name Name - + ext Erw - + Flags Flaggen - + Description Beschreibung - + GDAL Driver Options GDAL-Treiberoptionen - + Edit Pyramids Options Pyramiden-Optionen bearbeiten - + Edit Create Options Erzeugungsoptionen bearbeiten - + Plugin paths Erweiterungspfade - + Path(s) to search for additional C++ plugins libraries Nach zusätzlichen C++-Erweiterungsbibliotheken zu durchsuchende Pfad(e) @@ -30297,52 +30189,52 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Darstellung - + Rendering behavior Zeichenverhalten - + Number of features to draw before updating the display Anzahl von Objekten nach deren Zeichnung die Anzeige aktualisiert werden soll - + Default expiration period for WMS-C/WMTS tiles (hours) Verfallszeitraumvorgabe für WMS-C-/WMTS-Kacheln (Stunden) - + <b>Note:</b> Use zero to prevent display updates until all features have been rendered <b>Note:</b> 0 sorgt dafür, dass erst aktualisiert wird, wenn alle Objekte gezeichnet wurden - + Use render caching where possible to speed up redraws Wo möglich den Darstellungscache benutzen, um das Neuzeichnen zu beschleunigen - + Rendering quality Zeichenqualität - + SVG paths SVG-Pfade - + Path(s) to search for Scalable Vector Graphic (SVG) symbols Suchpfad(e) für SVG-Symbole (Scalable Vector Graphic) - + Decimal places Dezimalstellen - + Keep base unit Basiseinheit beibehalten @@ -30353,7 +30245,7 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Überlagern - + Reuse last entered attribute values Letzte Attributwerteingaben wiederverwenden @@ -30364,12 +30256,12 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Netzwerk - + Timeout for network requests (ms) Zeitüberschreitung bei Netzwerkanfragen (ms) - + Compatibility Kompatibilität @@ -30380,7 +30272,7 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Digitalisierung - + Use new generation symbology for rendering Darstellung der nächsten Generation verwenden @@ -30400,382 +30292,392 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein Qt-Voreinstellung - + + Timeout for timed messages or dialogs + Dauer von zeitweiligen Meldungen und Dialogen + + + + s + s + + + Add new layers to selected or current group Neue Layer zur gewählten oder aktuellen Gruppe hinzufügen - + Environment Umgebung - + Apply Anwenden - - + + Variable Variable - - + + Value Wert - + Current environment variables (read-only - bold indicates modified at startup) Aktuelle Umgebungsvariablen (schreibgeschützt - Fett bedeutet Änderung beim Start) - + Show only QGIS-specific variables Nur QGIS-spezifische Variablen anzeigen - + Use custom environment variables (restart required - include separators) Benutzerdefinierte Umgebungsvariablen verwenden (Neustart erforderlich - Trennzeichen einschließen) - + Better graphics performance at the cost of loosing the possibility to cancel rendering and incremental feature drawing Bessere Grafikleistung unter Verzicht auf die Möglichkeit des Abbruchs des Zeichnens und des inkrementellen Zeichnen - + Enable back buffer Hintergrundpuffer aktivieren - + Rasters Raster - + RGB band selection RGB Kanalauswahl - + Red band Roter Kanal - + Green band Grüner Kanal - + Blue band Blauer Kanal - + Contrast enhancement Kontrastverbesserung - + Single band gray Einkanalgraustufen - + Multi band color (byte / band) Multikanalfarbe (Byte/Kanal) - + Multi band color (> byte / band) Multikanalfarbe (> Byte/Kanal) - + Limits (minimum/maximum) Grenzen (Minimum/Maximum) - + Cumulative pixel count cut limits Kommulative Pixelanzahl-Schnittgrenzen - + - - - + Standard deviation multiplier Standardabweichungsfaktor - + Preferred angle units Bevorzugtes Winkelmaß - + Degrees Grad - + Radians Bogenmaß - + Gon Gon - + Zoom factor Zoomfaktor - + Mouse wheel action Mausradaktion - + Predefined scales Vordefinierte Maßstäbe - + Placement algorithm Platzierungsalgorithmus - + Other settings Weitere Einstellungen - + Validate geometries Geometrien prüfen - + Join style for curve offset Verbindungsstil für Linienversatz - + Quadrantsegments for curve offset Quadrantensegmente für Linienversatz - + Miter limit for curve offset Eckengrenze für Linienversatz - + Default Coordinate Reference System for new projects Koordinatensystemvorgabe für neue Projekte - - + + Select... Wählen... - + Always start new projects with this CRS Neue Projekte immer in diesem KBS beginnen - + Automatically enable 'on the fly' reprojection if CRS of a new added layer differ from CRS of layer(s) already present. CRS of present layer(s) will be used. 'On-The-Fly'-Reprojektion automatisch einschalten, wenn das KBS eines neu hinzugefügten Layers vom dem der bereits vorhandenen Layer abweicht. KBS der vorhandenen Layer wird benutzt. - + Automatically enable 'on the fly' reprojection if layers have different CRS 'On-The-Fly'-Reprojektion automatisch aktivieren, wenn die Layer unterschiedliche KBS haben - + Coordinate Reference System for new layers Koordinatenbezugssystem für neue Layer - + When a new layer is created, or when a layer is loaded that has no Coordinate Reference System (CRS) Wenn ein neuer Layer erzeugt wird oder ein Layer geladen wird der kein Koordinatenbezugssystem hat - + Exclude URLs (starting with) URL ausschließen, die beginnen mit - + Cache settings Cache-Einstellungen - + Directory Verzeichnis - - - - + + + + ... ... - + Size Größe - + Clear Löschen - + WMS search address WMS-Suchadresse - + Open feature form, if a single feature is identified Objektformular öffnen, wenn ein einzelnes Objekt abgefragt wird - + Rubberband color Gummibandfarbe - + Preferred measurements units Bevorzugte Maßeinheiten - + Meters Meter - + Feet Fuß - + Identify Abfragen - + <b>Note:</b> Specify the search radius as a percentage of the map width <b>Anmerkung:</b> Suchradius in Prozent der Kartenbreite angeben - + Search radius for identifying features and displaying map tips Suchradius für die Objektidentifikation und zur Maptippanzeige - + Mode Modus - + Line width Linienbreite - + Default snap mode Voreingestellter Fangmodus - + Vertex markers Stützpunktmarken - + Line color Linienfarbe - + Show markers only for selected features Markierungen nur für gewählte Objekte anzeigen - + Marker style Markierungsstil - + Marker size Markierungsgröße - + Override system locale System-Locale überschreiben - + <b>Note:</b> Enabling / changing overide on local requires an application restart <b>Note:</b> Einschalten/Änderung der Locale-Überschreibung erfordert einen Anwendungsneustart - + Use proxy for web access Proxy für Webzugriff benutzen - + Host Host - + Port Port - + User Benutzer - - + + Leave this blank if no proxy username / password are required Lassen Sie Benutzer/Passwort leer, wenn sie nicht benötigt werden - + Password Passwort @@ -30786,75 +30688,75 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein KBS - + Default snapping tolerance Voreingestellte Fangtoleranz - + Search radius for vertex edits Suchradius für Stützpunktbearbeitung - + Suppress attributes pop-up windows after each created feature Eingabe der Attributwerte bei der Erstellung neuer Objekte unterdrücken - + Enable 'on the &fly' reprojection by default 'On-The-&Fly'-Reprojektion voreinstellen - + Prompt for &CRS &KBS abfragen - + Use &project CRS KBS des &Projekts benutzen - + Use default CRS displa&yed below &Folgendes KBS benutzen - + Proxy type Proxytyp - - - - + + + + Add Hinzufügen - - - - + + + + Remove Entfernen - + Position Position - - + + map units Karteneinheiten - - + + pixels Pixel @@ -30869,18 +30771,18 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein - - - - - - + + + + + + Oracle Oracle - + SQL:%1 error:%2 @@ -30889,7 +30791,7 @@ Fehler:%2 - + Querying available tables failed. SQL:%1 error:%2 @@ -30900,62 +30802,62 @@ Fehler:%2 - + Database connection was successful, but the accessible tables could not be determined. Die Datenbankverbindung war erfolgreich, jedoch konnten die zugänglichen Tabellen nicht bestimmt werden. - + Unable to get list of spatially enabled tables from the database Konnte Liste der räumlichen Tabellen der Datenbank nicht bestimmen - + Unsupported geometry type %1 in %2.%3.%4 ignored Nicht unterstützter Geometrietyp %1 in %2.%3.%4 ignoriert - + View %1.%2 doesn't have integer columns for use as keys. Sicht %1.%2 hat keine als Schlüssel verwendbare Integer-Spalte. - + Point Punkt - + Multipoint Multipunkt - + Line Linie - + Multiline Multilinie - + Polygon Polygon - + Multipolygon Multipolygon - + No Geometry Ohne Geometrie - + Unknown Geometry Unbekannte Geometrie @@ -30963,59 +30865,54 @@ Fehler:%2 QgsOracleConnectionItem - - Failed to retrieve layers - Konnte Layer nicht bestimmen - - - - No layers found. - Keine Layer gefunden. - - - + Edit... Bearbeiten... - + Delete Löschen - + + Refresh + Aktualisieren + + + Copying features... Kopiere Objekte... - + Abort Abbrechen - + Import layer Layer importieren - + %1: Not a vector layer! %1: Kein Vektorlayer! - - + + %1: OK! %1: OK! - - + + Import to Oracle database In Oracle-Datenbank importieren - + Failed to import some layers! @@ -31024,7 +30921,7 @@ Fehler:%2 - + Import was successful. Import war erfolgreich. @@ -31032,14 +30929,14 @@ Fehler:%2 QgsOracleLayerItem + + - - Delete layer Layer löschen - + Layer deleted successfully. Layer erfolgreich gelöscht. @@ -31209,12 +31106,12 @@ Fehler:%2 QgsOracleOwnerItem - + %1 as %2 in %3 %1 als %2 in %3 - + as geometryless table als geometrielose Tabelle @@ -31318,37 +31215,27 @@ Fehler:%2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Oracle Oracle @@ -31486,96 +31373,192 @@ SQL: %2 No key field for query given. Kein Schlüsselfeld für Abfrage gegeben. + + + Evaluation of default value failed + Auswertung des Vorgabewert gescheitert + - - - - - - + + + + + + Could not start transaction Transaktion konnte nicht gestartet werden - - Could not prepare insert statement. -SQL: %1 -ERROR: %2 - Konnte Einfügeanweisung nicht vorbereiten. -SQL: %1 -Fehler: %2 + + Could not prepare insert statement + Konnte Einfügeanweisung nicht vorbereiten - - - - - - - + + Could not insert feature %1 + Konnte Objekt %1 nicht einfügen + + + + Could not prepare update statement. + Konnte Aktualisierungsanweisung nicht vorbereiten. + + + + Could not determine table existence. + Konnte Tabellenexistenz nicht feststellen. + + + + Table %1 could not be dropped. + Tabelle %1 konnte nicht gelöscht werden. + + + + Table %1 already exists. + Tabelle %1 existiert bereits. + + + + Table creation failed. + Tabellenerzeugung gescheitert. + + + + Could not lookup authid %1:%2 + Konnte AuthId %1:%2 nicht finden + + + + Could not lookup WKT. + Konnte WKT nicht finden. + + + + Could not determine new srid. + Konnte freie SRID nicht feststellen. + + + + CRS not found and could not be created. + KBS nicht gefunden und konnte auch nicht erzeugt werden. + + + + Could not insert metadata. + Konnte Metadaten nicht einfügen. + + + + Drop created table %1 failed. +SQL:%2 +Error: %3 + Löschen der erzeugten Tabelle %1 gescheitert. +SQL:%2 +Fehler: %3 + + + + Oracle SRID %1 not found. + Oracle SRID %1 nicht gefunden. + + + + Lookup of Oracle SRID %1 failed. +SQL:%2 +Error:%3 + Oracle SRID %1 nicht gefunden. +SQL:%2 +Fehler:%3 + + + + + + + + + Could not commit transaction Transaktion konnte nicht festgeschrieben werden - + Oracle error while adding features: %1 Oracle-Fehler beim Attributhinzufügen: %1 - - - - - - - + + + + + + + Could not rollback transaction Transaktion konnte nicht zurückgerollt werden - + + Deletion of feature %1 failed + Löschen des Objekts %1 gescheitert + + + Oracle error while deleting features: %1 Oracle-Fehler beim Objektlöschen: %1 - + + Adding attribute %1 failed + Hinzufügen des Attributs %1 gescheitert + + + + Setting comment on %1 failed + Setzen des Kommentars für %1 gescheitert + + + Oracle error while adding attributes: %1 Oracle-Fehler beim Attributhinzufügen: %1 - + + Dropping column %1 failed + Löschen der Spalte %1 gescheitert + + + Oracle error while deleting attributes: %1 Oracle-Fehler beim Attributlöschen: %1 - + + + Update of feature %1 failed + Aktualisierung des Objekte %1 gescheitert + + + Oracle error while changing attributes: %1 Oracle-Fehler beim Attributändern: %1 - - Could not prepare update statement. -SQL: %1 -ERROR: %2 - Konnte Aktualisierungsanweisung nicht vorbereiten. -SQL: %1 -Fehler: %2 - - - + Oracle error while changing geometry values: %1 Oracle-Fehler beim Geometrieändern: %1 - + Could not retrieve extents: %1 SQL: %2 Konnte Ausmaße nicht bestimmen: %1 SQL: %2 - + Could not execute query. The error message from the database was: %1. @@ -31586,7 +31569,7 @@ Die Datenbankfehlermeldung war: SQL: %2 - + Could not retrieve SRID of %1. The error message from the database was: %2. @@ -31597,7 +31580,7 @@ Die Datenbankfehlermeldung war: SQL: %3 - + Could not determine SRID of %1. The error message from the database was: %2. @@ -31608,14 +31591,14 @@ Die Datenbankfehlermeldung war: SQL: %3 - + %1 has no valid geometry types. SQL: %2 %1 hat keine gültigen Geometrietypen. SQL: %2 - + Could not determine geometry type of %1. The error message from the database was: %2. @@ -31626,22 +31609,40 @@ Die Datenbankfehlermeldung war: SQL: %3 - + Geometry type and srid for empty column %1 of %2 undefined. Geometrietyp und SRID für leere Spalte %1 in %2 undefiniert. - + Feature type or srid for %1 of %2 could not be determined or was not requested. Objekttyp oder SRID für %1 aus %2 konnte nicht festgestellt werden und wurde nicht festgelegt. - + Editing and adding disabled for 2D+ layer (%1; %2) Ändern und Hinzufügen auf 2D+-Layern abgeschaltet (%1; %2) - + + Could not update metadata for %1.%2. +SQL:%1 +Error: %2 + Konnte Metadaten für %1.%2 nicht aktualisieren. +SQL:%1 +Fehler: %2 + + + + Could not insert metadata for %1.%2. +SQL:%3 +Error: %4 + Konnte Metadaten für %1.%2 nicht einfügen. +SQL: %3 +Fehler: %4 + + + Creation spatial index failed. SQL:%1 Error: %2 @@ -31650,7 +31651,7 @@ SQL:%1 FehleR:%2 - + Rebuild of spatial index failed. SQL:%1 Error: %2 @@ -31660,17 +31661,25 @@ Fehler:%2 - Oracle-Error: %1 + Oracle error: %1 SQL: %2 - +Error: %3 Oracle-Fehler: %1 -SQL: %2 +SQL: %2 +Fehler: %3 + + + + Oracle error: %1 +Error: %2 + Oracle-Fehler: %1 +Fehler: %2 QgsOracleRootItem - + New Connection... Neue Verbindung... @@ -31821,22 +31830,12 @@ SQL: %2 Um einen Layer hinzuzufügen, muss eine Tabelle gewählt sein. - + Stop Stopp - - Oracle Locator Provider - Oracle-Locator-Datenlieferant - - - - Could not open the Oracle Locator Provider - Konnte Oracle-Locator-Datenlieferant nicht öffnen - - - + Connect Verbinden @@ -31911,59 +31910,59 @@ SQL: %2 QgsPGConnectionItem - + Failed to retrieve layers Konnte Layer nicht bestimmen - + No layers found. Keine Layer gefunden. - + Edit... Bearbeiten... - + Delete Löschen - + Copying features... Kopiere Objekte... - + Abort Abbrechen - + Import layer Layer importieren - + %1: Not a vector layer! %1: Kein Vektorlayer! - - + + %1: OK! %1: OK! - - + + Import to PostGIS database In PostGIS-Datenbank importieren - + Failed to import some layers! @@ -31972,7 +31971,7 @@ SQL: %2 - + Import was successful. Import war erfolgreich. @@ -31980,14 +31979,14 @@ SQL: %2 QgsPGLayerItem - - - + + + Delete layer Layer löschen - + Layer deleted successfully. Layer erfolgreich gelöscht. @@ -31995,7 +31994,7 @@ SQL: %2 QgsPGRootItem - + New Connection... Neue Verbindung... @@ -32003,12 +32002,12 @@ SQL: %2 QgsPGSchemaItem - + %1 as %2 in %3 %1 als %2 in %3 - + as geometryless table als geometrielose Tabelle @@ -37807,54 +37806,54 @@ datasets with maximum width and height specified below. QgsSLConnectionItem - + Database does not exist Datenbank existiert nicht - + Failed to open database Konnte Datenbank nicht öffnen - + Failed to check metadata Metadatenprüfung gescheitert - + Failed to get list of tables Konnte Tabellenliste nicht bestimmen - + Unknown error Unbekannter Fehler - + Delete Löschen - + %1: Not a vector layer! %1: Kein Vektorlayer! - - + + %1: OK! %1: OK! - - + + Import to SpatiaLite database In eine SpatiaLite-Datenbank importieren - + Failed to import some layers! @@ -37863,7 +37862,7 @@ datasets with maximum width and height specified below. - + Import was successful. Import war erfolgreich. @@ -37871,14 +37870,14 @@ datasets with maximum width and height specified below. QgsSLLayerItem - - - + + + Delete layer Layer löschen - + Layer deleted successfully. Layer erfolgreich gelöscht. @@ -37886,38 +37885,38 @@ datasets with maximum width and height specified below. QgsSLRootItem - + New Connection... Neue Verbindung... - + Create database... Datenbank erzeugen... - + New SpatiaLite Database File Neue SpatiaLite-Datenbankdatei - + SpatiaLite SpatiaLite - - + + Create SpatiaLite database SpatiaLite-Datenbank erzeugen - + The database has been created Die Datenbank wurde erzeugt - + Failed to create the database: Fehler beim Erzeugung der Datenbank: diff --git a/src/providers/oracle/qgsoraclecolumntypethread.cpp b/src/providers/oracle/qgsoraclecolumntypethread.cpp index b2be870bd13..e0c079207eb 100644 --- a/src/providers/oracle/qgsoraclecolumntypethread.cpp +++ b/src/providers/oracle/qgsoraclecolumntypethread.cpp @@ -16,22 +16,18 @@ email : jef at norbit dot de ***************************************************************************/ #include "qgsoraclecolumntypethread.h" +#include "qgslogger.h" #include -QgsOracleColumnTypeThread::QgsOracleColumnTypeThread( QgsOracleConn *conn, bool useEstimatedMetaData ) +QgsOracleColumnTypeThread::QgsOracleColumnTypeThread( QString name, bool useEstimatedMetadata ) : QThread() - , mConn( conn ) - , mUseEstimatedMetadata( useEstimatedMetaData ) + , mName( name ) + , mUseEstimatedMetadata( useEstimatedMetadata ) { qRegisterMetaType( "QgsOracleLayerProperty" ); } -void QgsOracleColumnTypeThread::addGeometryColumn( QgsOracleLayerProperty layerProperty ) -{ - layerProperties << layerProperty; -} - void QgsOracleColumnTypeThread::stop() { mStopped = true; @@ -39,16 +35,32 @@ void QgsOracleColumnTypeThread::stop() void QgsOracleColumnTypeThread::run() { - if ( !mConn ) + QgsDataSourceURI uri = QgsOracleConn::connUri( mName ); + QgsOracleConn *conn = QgsOracleConn::connectDb( uri.connectionInfo() ); + if ( !conn ) + { + QgsDebugMsg( "Connection failed - " + uri.connectionInfo() ); return; + } mStopped = false; + QgsDebugMsg( "retrieving supported layers - connection " + mName ); + QVector layerProperties; + if ( !conn->supportedLayers( layerProperties, + QgsOracleConn::geometryColumnsOnly( mName ), + QgsOracleConn::userTablesOnly( mName ), + QgsOracleConn::allowGeometrylessTables( mName ) ) || + layerProperties.isEmpty() ) + { + return; + } + foreach ( QgsOracleLayerProperty layerProperty, layerProperties ) { if ( !mStopped ) { - mConn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata ); + conn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata ); } if ( mStopped ) @@ -61,6 +73,5 @@ void QgsOracleColumnTypeThread::run() emit setLayerType( layerProperty ); } - mConn->disconnect(); - mConn = 0; + conn->disconnect(); } diff --git a/src/providers/oracle/qgsoraclecolumntypethread.h b/src/providers/oracle/qgsoraclecolumntypethread.h index 95c0f5e8cea..ddb80bc1930 100644 --- a/src/providers/oracle/qgsoraclecolumntypethread.h +++ b/src/providers/oracle/qgsoraclecolumntypethread.h @@ -28,7 +28,7 @@ class QgsOracleColumnTypeThread : public QThread { Q_OBJECT public: - QgsOracleColumnTypeThread( QgsOracleConn *conn, bool useEstimatedMetaData ); + QgsOracleColumnTypeThread( QString connName, bool useEstimatedMetaData ); // These functions get the layer types and pass that information out // by emitting the setLayerType() signal. @@ -38,13 +38,12 @@ class QgsOracleColumnTypeThread : public QThread void setLayerType( QgsOracleLayerProperty layerProperty ); public slots: - void addGeometryColumn( QgsOracleLayerProperty layerProperty ); void stop(); private: QgsOracleColumnTypeThread() {} - QgsOracleConn *mConn; + QString mName; bool mUseEstimatedMetadata; bool mStopped; QList layerProperties; diff --git a/src/providers/oracle/qgsoracleconn.cpp b/src/providers/oracle/qgsoracleconn.cpp index a4e37031895..658f071a93e 100644 --- a/src/providers/oracle/qgsoracleconn.cpp +++ b/src/providers/oracle/qgsoracleconn.cpp @@ -173,7 +173,7 @@ QStringList QgsOracleConn::pkCandidates( QString ownerName, QString viewName ) return cols; } -bool QgsOracleConn::tableInfo( bool geometryTablesOnly, bool userTablesOnly, bool allowGeometrylessTables ) +bool QgsOracleConn::tableInfo( bool geometryColumnsOnly, bool userTablesOnly, bool allowGeometrylessTables ) { QgsDebugMsg( "Entering." ); @@ -181,26 +181,29 @@ bool QgsOracleConn::tableInfo( bool geometryTablesOnly, bool userTablesOnly, boo QString sql, delim; - sql = QString( "SELECT c.owner,c.table_name,c.column_name,%1,t.table_name AS isview" - " FROM %2 c" - " LEFT OUTER JOIN all_tables t ON c.owner=t.owner AND c.table_name=t.table_name%3" ) - .arg( geometryTablesOnly ? "c.srid" : "NULL AS srid" ) - .arg( geometryTablesOnly ? "all_sdo_geom_metadata" : "all_tab_columns" ) - .arg( geometryTablesOnly ? "" : " WHERE c.data_type='SDO_GEOMETRY' AND c.data_type_owner='MDSYS'" ); + QString + prefix( userTablesOnly ? "user" : "all" ), + owner( userTablesOnly ? "user AS owner" : "c.owner" ); + + sql = QString( "SELECT %1,c.table_name,c.column_name,%2,t.table_name AS isview" + " FROM %3_%4 c" + " LEFT OUTER JOIN %3_tables t ON c.table_name=t.table_name%5%6" ) + .arg( owner ) + .arg( geometryColumnsOnly ? "c.srid" : "NULL AS srid" ) + .arg( prefix ) + .arg( geometryColumnsOnly ? "sdo_geom_metadata" : "tab_columns" ) + .arg( userTablesOnly ? "" : " AND c.owner=t.owner" ) + .arg( geometryColumnsOnly ? "" : " WHERE c.data_type='SDO_GEOMETRY' AND c.data_type_owner='MDSYS'" ); if ( allowGeometrylessTables ) { - sql += " UNION SELECT owner,table_name,NULL AS column_name,NULL AS srid,table_name AS isview FROM all_tables" - " UNION SELECT owner,view_name,NULL AS column_name,NULL AS srid,NULL AS isview FROM all_views"; + sql += QString( " UNION SELECT %1,table_name,NULL AS column_name,NULL AS srid,table_name AS isview FROM %2_tables c" + " UNION SELECT %1,view_name,NULL AS column_name,NULL AS srid,NULL AS isview FROM %2_views c" ) + .arg( owner ).arg( prefix ); } sql = "SELECT * FROM (" + sql + ")"; - if ( userTablesOnly ) - { - sql += " WHERE owner=user"; - } - sql += " ORDER BY owner,isview,table_name,column_name"; QSqlQuery qry( mDatabase ); @@ -221,6 +224,12 @@ bool QgsOracleConn::tableInfo( bool geometryTablesOnly, bool userTablesOnly, boo layerProperty.isView = qry.value( 4 ).isNull(); layerProperty.pkCols.clear(); + if ( allowGeometrylessTables ) + { + layerProperty.types << QGis::WKBNoGeometry; + layerProperty.srids << 0; + } + mLayersSupported << layerProperty; } @@ -313,7 +322,11 @@ QString QgsOracleConn::fieldExpression( const QgsField &fld ) void QgsOracleConn::retrieveLayerTypes( QgsOracleLayerProperty &layerProperty, bool useEstimatedMetadata ) { + if ( layerProperty.geometryColName.isEmpty() ) + return; + QgsDebugMsg( "entering: " + layerProperty.toString() ); + QString table; QString where; @@ -569,7 +582,7 @@ void QgsOracleConn::deleteConnection( QString theConnName ) settings.remove( key + "/database" ); settings.remove( key + "/username" ); settings.remove( key + "/password" ); - settings.remove( key + "/publicOnly" ); + settings.remove( key + "/userTablesOnly" ); settings.remove( key + "/geometryColumnsOnly" ); settings.remove( key + "/allowGeometrylessTables" ); settings.remove( key + "/estimatedMetadata" ); @@ -635,12 +648,24 @@ bool QgsOracleConn::userTablesOnly( QString theConnName ) return settings.value( "/Oracle/connections/" + theConnName + "/userTablesOnly", false ).toBool(); } +bool QgsOracleConn::geometryColumnsOnly( QString theConnName ) +{ + QSettings settings; + return settings.value( "/Oracle/connections/" + theConnName + "/geometryColumnsOnly", false ).toBool(); +} + bool QgsOracleConn::allowGeometrylessTables( QString theConnName ) { QSettings settings; return settings.value( "/Oracle/connections/" + theConnName + "/allowGeometrylessTables", false ).toBool(); } +bool QgsOracleConn::estimatedMetadata( QString theConnName ) +{ + QSettings settings; + return settings.value( "/Oracle/connections/" + theConnName + "/estimatedMetadata", false ).toBool(); +} + QString QgsOracleConn::databaseName( QString database, QString host, QString port ) { QString db; diff --git a/src/providers/oracle/qgsoracleconn.h b/src/providers/oracle/qgsoracleconn.h index 25c2927548d..0f828ab478d 100644 --- a/src/providers/oracle/qgsoracleconn.h +++ b/src/providers/oracle/qgsoracleconn.h @@ -147,7 +147,9 @@ class QgsOracleConn : public QThread static void setSelectedConnection( QString theConnName ); static QgsDataSourceURI connUri( QString theConnName ); static bool userTablesOnly( QString theConnName ); + static bool geometryColumnsOnly( QString theConnName ); static bool allowGeometrylessTables( QString theConnName ); + static bool estimatedMetadata( QString theConnName ); static void deleteConnection( QString theConnName ); static QString databaseName( QString database, QString host, QString port ); diff --git a/src/providers/oracle/qgsoracledataitems.cpp b/src/providers/oracle/qgsoracledataitems.cpp index 28df814681f..d17b2afd648 100644 --- a/src/providers/oracle/qgsoracledataitems.cpp +++ b/src/providers/oracle/qgsoracledataitems.cpp @@ -20,6 +20,7 @@ #include "qgslogger.h" #include "qgsdatasourceuri.h" #include "qgsapplication.h" +#include "qgsmessageoutput.h" #include #include @@ -78,73 +79,38 @@ void QgsOracleConnectionItem::refresh() QVector QgsOracleConnectionItem::createChildren() { QgsDebugMsg( "Entered" ); - QVector children; QgsDataSourceURI uri = QgsOracleConn::connUri( mName ); mOwnerMap.clear(); - mConn = QgsOracleConn::connectDb( uri.connectionInfo() ); - if ( !mConn ) - return children; - - QVector layerProperties; - if ( !mConn->supportedLayers( layerProperties, - QgsOracleConn::userTablesOnly( mName ), - QgsOracleConn::allowGeometrylessTables( mName ) ) ) - { - children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) ); - return children; - } - - if ( layerProperties.isEmpty() ) - { - children.append( new QgsErrorItem( this, tr( "No layers found." ), mPath + "/error" ) ); - return children; - } - stop(); - foreach ( QgsOracleLayerProperty layerProperty, layerProperties ) + if ( !mColumnTypeThread ) { - QgsOracleOwnerItem *ownerItem = mOwnerMap.value( layerProperty.ownerName, 0 ); - if ( !ownerItem ) - { - ownerItem = new QgsOracleOwnerItem( this, layerProperty.ownerName, mPath + "/" + layerProperty.ownerName ); - children.append( ownerItem ); - mOwnerMap[ layerProperty.ownerName ] = ownerItem; - } + mColumnTypeThread = new QgsOracleColumnTypeThread( mName, true /* useEstimatedMetadata */ ); - if ( !layerProperty.geometryColName.isNull() ) - { - if ( layerProperty.types.contains( QGis::WKBUnknown ) || layerProperty.srids.isEmpty() ) - { - if ( !mColumnTypeThread ) - { - QgsOracleConn *conn = QgsOracleConn::connectDb( uri.connectionInfo() ); - if ( conn ) - { - mColumnTypeThread = new QgsOracleColumnTypeThread( conn, true /* use estimated metadata */ ); - - connect( mColumnTypeThread, SIGNAL( setLayerType( QgsOracleLayerProperty ) ), - this, SLOT( setLayerType( QgsOracleLayerProperty ) ) ); - connect( this, SIGNAL( addGeometryColumn( QgsOracleLayerProperty ) ), - mColumnTypeThread, SLOT( addGeometryColumn( QgsOracleLayerProperty ) ) ); - } - } - - emit addGeometryColumn( layerProperty ); - } - } - else - { - ownerItem->addLayer( layerProperty ); - } + connect( mColumnTypeThread, SIGNAL( setLayerType( QgsOracleLayerProperty ) ), + this, SLOT( setLayerType( QgsOracleLayerProperty ) ) ); + connect( mColumnTypeThread, SIGNAL( started() ), this, SLOT( threadStarted() ) ); + connect( mColumnTypeThread, SIGNAL( finished() ), this, SLOT( threadFinished() ) ); } if ( mColumnTypeThread ) mColumnTypeThread->start(); - return children; + return QVector(); +} + +void QgsOracleConnectionItem::threadStarted() +{ + QgsDebugMsg( "Entering." ); + qApp->setOverrideCursor( Qt::BusyCursor ); +} + +void QgsOracleConnectionItem::threadFinished() +{ + QgsDebugMsg( "Entering." ); + qApp->restoreOverrideCursor(); } void QgsOracleConnectionItem::setLayerType( QgsOracleLayerProperty layerProperty ) @@ -154,8 +120,10 @@ void QgsOracleConnectionItem::setLayerType( QgsOracleLayerProperty layerProperty QgsOracleOwnerItem *ownerItem = mOwnerMap.value( layerProperty.ownerName, 0 ); if ( !ownerItem ) { - QgsDebugMsg( QString( "owner item for %1 not found." ).arg( layerProperty.ownerName ) ); - return; + ownerItem = new QgsOracleOwnerItem( this, layerProperty.ownerName, mPath + "/" + layerProperty.ownerName ); + QgsDebugMsg( "add owner item: " + layerProperty.ownerName ); + addChildItem( ownerItem, true ); + mOwnerMap[ layerProperty.ownerName ] = ownerItem; } for ( int i = 0 ; i < layerProperty.size(); i++ ) @@ -163,12 +131,15 @@ void QgsOracleConnectionItem::setLayerType( QgsOracleLayerProperty layerProperty QGis::WkbType wkbType = layerProperty.types.at( i ); if ( wkbType == QGis::WKBUnknown ) { - // skip any geometry entry + QgsDebugMsg( "skip unknown geometry type" ); continue; } + QgsDebugMsg( "ADD LAYER" ); ownerItem->addLayer( layerProperty.at( i ) ); } + + QgsDebugMsg( "Leaving" ); } bool QgsOracleConnectionItem::equal( const QgsDataItem *other ) @@ -179,7 +150,7 @@ bool QgsOracleConnectionItem::equal( const QgsDataItem *other ) } const QgsOracleConnectionItem *o = qobject_cast( other ); - return ( mPath == o->mPath && mName == o->mName && o->connection() == connection() ); + return ( mPath == o->mPath && mName == o->mName && o->parent() == parent() ); } QList QgsOracleConnectionItem::actions() @@ -194,6 +165,10 @@ QList QgsOracleConnectionItem::actions() connect( actionDelete, SIGNAL( triggered() ), this, SLOT( deleteConnection() ) ); lst.append( actionDelete ); + QAction* actionRefresh = new QAction( tr( "Refresh" ), this ); + connect( actionRefresh, SIGNAL( triggered() ), this, SLOT( refreshConnection() ) ); + lst.append( actionRefresh ); + return lst; } @@ -215,6 +190,12 @@ void QgsOracleConnectionItem::deleteConnection() mParent->refresh(); } +void QgsOracleConnectionItem::refreshConnection() +{ + // the parent should be updated + refresh(); +} + bool QgsOracleConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction ) { if ( !QgsMimeDataUtils::isUriList( data ) ) @@ -250,7 +231,7 @@ bool QgsOracleConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction uri.setDataSource( QString(), u.name.left( 30 ).toUpper(), "QGS_GEOMETRY" ); uri.setWkbType( srcLayer->wkbType() ); QString authid = srcLayer->crs().authid(); - if( authid.startsWith( "EPSG:", Qt::CaseInsensitive ) ) + if ( authid.startsWith( "EPSG:", Qt::CaseInsensitive ) ) { uri.setSrid( authid.mid( 5 ) ); } @@ -281,15 +262,17 @@ bool QgsOracleConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction if ( hasError ) { - QMessageBox::warning( 0, tr( "Import to Oracle database" ), tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ) ); + QgsMessageOutput *output = QgsMessageOutput::createMessageOutput(); + output->setTitle( tr( "Import to Oracle database" ) ); + output->setMessage( tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ), QgsMessageOutput::MessageText ); + output->showMessage(); } else { QMessageBox::information( 0, tr( "Import to Oracle database" ), tr( "Import was successful." ) ); + refresh(); } - refresh(); - return true; } @@ -328,29 +311,27 @@ void QgsOracleLayerItem::deleteLayer() else { QMessageBox::information( 0, tr( "Delete layer" ), tr( "Layer deleted successfully." ) ); - mParent->refresh(); + deleteLater(); } } QString QgsOracleLayerItem::createUri() { - QString pkColName = mLayerProperty.pkCols.size() > 0 ? mLayerProperty.pkCols.at( 0 ) : QString::null; + Q_ASSERT( mLayerProperty.size() == 1 ); QgsOracleConnectionItem *connItem = qobject_cast( parent() ? parent()->parent() : 0 ); - if ( !connItem ) { QgsDebugMsg( "connection item not found." ); return QString::null; } - QgsDebugMsg( QString( "connInfo: %1" ).arg( connItem->connection()->connInfo() ) ); - - QgsDataSourceURI uri( connItem->connection()->connInfo() ); + QgsDataSourceURI uri = QgsOracleConn::connUri( connItem->name() ); uri.setDataSource( mLayerProperty.ownerName, mLayerProperty.tableName, mLayerProperty.geometryColName, mLayerProperty.sql, QString::null ); - Q_ASSERT( mLayerProperty.size() == 1 ); uri.setSrid( QString::number( mLayerProperty.srids.at( 0 ) ) ); uri.setWkbType( mLayerProperty.types.at( 0 ) ); + if ( mLayerProperty.isView && mLayerProperty.pkCols.size() > 0 ) + uri.setKeyColumn( mLayerProperty.pkCols[0] ); QgsDebugMsg( QString( "layer uri: %1" ).arg( uri.uri() ) ); return uri.uri(); } @@ -415,7 +396,7 @@ void QgsOracleOwnerItem::addLayer( QgsOracleLayerProperty layerProperty ) QgsOracleLayerItem *layerItem = new QgsOracleLayerItem( this, layerProperty.tableName, mPath + "/" + layerProperty.tableName, layerType, layerProperty ); layerItem->setToolTip( tip ); - addChild( layerItem ); + addChildItem( layerItem, true ); } // --------------------------------------------------------------------------- diff --git a/src/providers/oracle/qgsoracledataitems.h b/src/providers/oracle/qgsoracledataitems.h index 0a8896f2955..56bab8f303d 100644 --- a/src/providers/oracle/qgsoracledataitems.h +++ b/src/providers/oracle/qgsoracledataitems.h @@ -63,8 +63,6 @@ class QgsOracleConnectionItem : public QgsDataCollectionItem virtual bool acceptDrop() { return true; } virtual bool handleDrop( const QMimeData * data, Qt::DropAction action ); - QgsOracleConn *connection() const { return mConn; } - void refresh(); signals: @@ -73,12 +71,15 @@ class QgsOracleConnectionItem : public QgsDataCollectionItem public slots: void editConnection(); void deleteConnection(); + void refreshConnection(); void setLayerType( QgsOracleLayerProperty layerProperty ); + void threadStarted(); + void threadFinished(); + private: void stop(); - QgsOracleConn *mConn; QMap mOwnerMap; QgsOracleColumnTypeThread *mColumnTypeThread; }; diff --git a/src/providers/oracle/qgsoracleprovider.cpp b/src/providers/oracle/qgsoracleprovider.cpp index 93c4b01050b..2911c0e1226 100644 --- a/src/providers/oracle/qgsoracleprovider.cpp +++ b/src/providers/oracle/qgsoracleprovider.cpp @@ -46,8 +46,8 @@ QgsOracleProvider::QgsOracleProvider( QString const & uri ) , mPrimaryKeyType( pktUnknown ) , mDetectedGeomType( QGis::WKBUnknown ) , mRequestedGeomType( QGis::WKBUnknown ) - , mSpatialIndex( QString::null ) , mFidCounter( 0 ) + , mSpatialIndex( QString::null ) { static int geomMetaType = -1; if ( geomMetaType < 0 ) @@ -669,7 +669,7 @@ void QgsOracleProvider::appendPkParams( QgsFeatureId fid, QSqlQuery &qry ) const } else { - QgsDebugMsg( QString( "key values for fid %1 not found. " ).arg( fid ) ); + QgsDebugMsg( QString( "key values for fid %1 not found." ).arg( fid ) ); for ( int i = 0; i < mPrimaryKeyAttrs.size(); i++ ) { QgsDebugMsgLevel( QString( "addBindValue pk NULL" ).arg( fid ), 4 ); @@ -1465,7 +1465,7 @@ QString QgsOracleProvider::paramValue( QString fieldValue, const QString &defaul QSqlQuery qry( *mConnection ); if ( !exec( qry, QString( "SELECT %1" ).arg( defaultValue ) ) || !qry.next() ) { - throw OracleException( qry ); + throw OracleException( tr( "Evaluation of default value failed" ), qry ); } return qry.value( 0 ).toString(); @@ -1496,8 +1496,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist ) if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } // Prepare the INSERT statement @@ -1602,11 +1601,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist ) QgsDebugMsgLevel( QString( "SQL prepare: %1" ).arg( insert ), 4 ); if ( !qry.prepare( insert ) ) { - QgsMessageLog::logMessage( tr( "Could not prepare insert statement.\nSQL: %1\nERROR: %2" ) - .arg( qry.lastQuery() ) - .arg( qry.lastError().text() ), - tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not prepare insert statement" ), qry ); } for ( QgsFeatureList::iterator features = flist.begin(); features != flist.end(); features++ ) @@ -1647,7 +1642,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist ) } if ( !qry.exec() ) - throw OracleException( qry ); + throw OracleException( tr( "Could not insert feature %1" ).arg( features->id() ), qry ); if ( mPrimaryKeyType == pktRowId ) { @@ -1660,8 +1655,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist ) if ( !db.commit() ) { - QgsMessageLog::logMessage( tr( "Could not commit transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not commit transaction" ), db ); } // update feature ids @@ -1722,8 +1716,7 @@ bool QgsOracleProvider::deleteFeatures( const QgsFeatureIds & id ) if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } for ( QgsFeatureIds::const_iterator it = id.begin(); it != id.end(); ++it ) @@ -1732,9 +1725,8 @@ bool QgsOracleProvider::deleteFeatures( const QgsFeatureIds & id ) .arg( mQuery ).arg( whereClause( *it ) ); QgsDebugMsg( "delete sql: " + sql ); - //send DELETE statement and do error handling if ( !exec( qry, sql ) ) - throw OracleException( qry ); + throw OracleException( tr( "Deletion of feature %1 failed" ).arg( *it ), qry ); QVariant v = mFidToKey[ *it ]; mFidToKey.remove( *it ); @@ -1745,8 +1737,7 @@ bool QgsOracleProvider::deleteFeatures( const QgsFeatureIds & id ) if ( !db.commit() ) { - QgsMessageLog::logMessage( tr( "Could not commit transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not commit transaction" ), db ); } mFeaturesCounted -= id.size(); @@ -1777,8 +1768,7 @@ bool QgsOracleProvider::addAttributes( const QList &attributes ) if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } for ( QList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter ) @@ -1807,7 +1797,7 @@ bool QgsOracleProvider::addAttributes( const QList &attributes ) QgsDebugMsg( sql ); if ( !exec( qry, sql ) ) - throw OracleException( qry ); + throw OracleException( tr( "Adding attribute %1 failed" ).arg( iter->name() ), qry ); if ( !iter->comment().isEmpty() ) { @@ -1816,7 +1806,7 @@ bool QgsOracleProvider::addAttributes( const QList &attributes ) .arg( quotedIdentifier( iter->name() ) ) .arg( quotedValue( iter->comment() ) ); if ( !exec( qry, sql ) ) - throw OracleException( qry ); + throw OracleException( tr( "Setting comment on %1 failed" ).arg( iter->name() ), qry ); } qry.finish(); @@ -1824,8 +1814,7 @@ bool QgsOracleProvider::addAttributes( const QList &attributes ) if ( !db.commit() ) { - QgsMessageLog::logMessage( tr( "Could not commit transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not commit transaction" ), db ); } } catch ( OracleException &e ) @@ -1855,8 +1844,7 @@ bool QgsOracleProvider::deleteAttributes( const QgsAttributeIds& ids ) if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } qry.finish(); @@ -1873,7 +1861,7 @@ bool QgsOracleProvider::deleteAttributes( const QgsAttributeIds& ids ) //send sql statement and do error handling if ( !exec( qry, sql ) ) - throw OracleException( qry ); + throw OracleException( tr( "Dropping column %1 failed" ).arg( field_it->name() ), qry ); //delete the attribute from mAttributeFields mAttributeFields.remove( *iter ); @@ -1882,8 +1870,7 @@ bool QgsOracleProvider::deleteAttributes( const QgsAttributeIds& ids ) if ( !db.commit() ) { - QgsMessageLog::logMessage( tr( "Could not commit transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not commit transaction" ), db ); } } catch ( OracleException &e ) @@ -1915,8 +1902,7 @@ bool QgsOracleProvider::changeAttributeValues( const QgsChangedAttributesMap & a if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } // cycle through the features @@ -1964,7 +1950,9 @@ bool QgsOracleProvider::changeAttributeValues( const QgsChangedAttributesMap & a sql += QString( " WHERE %1" ).arg( whereClause( fid ) ); if ( !exec( qry, sql ) ) - throw OracleException( qry ); + { + throw OracleException( tr( "Update of feature %1 failed" ).arg( fid ), qry ); + } // update feature id map if key was changed if ( pkChanged && mPrimaryKeyType == pktFidMap ) @@ -1991,8 +1979,7 @@ bool QgsOracleProvider::changeAttributeValues( const QgsChangedAttributesMap & a if ( !db.commit() ) { - QgsMessageLog::logMessage( tr( "Could not commit transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not commit transaction" ), db ); } } catch ( OracleException &e ) @@ -2177,8 +2164,7 @@ bool QgsOracleProvider::changeGeometryValues( QgsGeometryMap & geometry_map ) if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } QString update = QString( "UPDATE %1 SET %2=? WHERE %3" ) @@ -2188,11 +2174,7 @@ bool QgsOracleProvider::changeGeometryValues( QgsGeometryMap & geometry_map ) QgsDebugMsgLevel( QString( "SQL prepare: %1" ).arg( update ), 4 ); if ( !qry.prepare( update ) ) { - QgsMessageLog::logMessage( tr( "Could not prepare update statement.\nSQL: %1\nERROR: %2" ) - .arg( qry.lastQuery() ) - .arg( qry.lastError().text() ), - tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not prepare update statement." ), qry ); } for ( QgsGeometryMap::iterator iter = geometry_map.begin(); @@ -2203,15 +2185,14 @@ bool QgsOracleProvider::changeGeometryValues( QgsGeometryMap & geometry_map ) appendPkParams( iter.key(), qry ); if ( !qry.exec() ) - throw OracleException( qry ); + throw OracleException( tr( "Update of feature %1 failed" ).arg( iter.key() ), qry ); } qry.finish(); if ( !db.commit() ) { - QgsMessageLog::logMessage( tr( "Could not commit transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not commit transaction" ), db ); } } catch ( OracleException &e ) @@ -2412,7 +2393,7 @@ bool QgsOracleProvider::getGeometryDetails() if ( !ownerName.isEmpty() ) { - if ( exec( qry, QString( "SELECT srid FROM all_sdo_geom_metadata WHERE owner=%1 AND table_name=%2 AND column_name=%3" ) + if ( exec( qry, QString( "SELECT srid FROM mdsys.all_sdo_geom_metadata WHERE owner=%1 AND table_name=%2 AND column_name=%3" ) .arg( quotedValue( ownerName ) ) .arg( quotedValue( tableName ) ) .arg( quotedValue( geomCol ) ) ) ) @@ -2562,14 +2543,47 @@ bool QgsOracleProvider::createSpatialIndex() { // TODO: make precision configurable QgsRectangle r( extent() ); - exec( qry, QString( "UPDATE user_sdo_geom_metadata SET diminfo=mdsys.sdo_dim_array(" - "mdsys.sdo_dim_element('X', %1, %2, 0.001)," - "mdsys.sdo_dim_element('Y', %3, %4, 0.001)" - ") WHERE table_name=%5 AND column_name=%6" ) - .arg( r.xMinimum(), 0, 'f', 16 ).arg( r.xMaximum(), 0, 'f', 16 ) - .arg( r.yMinimum(), 0, 'f', 16 ).arg( r.yMaximum(), 0, 'f', 16 ) - .arg( quotedValue( mTableName ) ) - .arg( quotedValue( mGeometryColumn ) ) ); + if ( !exec( qry, QString( "UPDATE mdsys.user_sdo_geom_metadata SET diminfo=mdsys.sdo_dim_array(" + "mdsys.sdo_dim_element('X', %1, %2, 0.001)," + "mdsys.sdo_dim_element('Y', %3, %4, 0.001)" + ") WHERE table_name=%5 AND column_name=%6" ) + .arg( r.xMinimum(), 0, 'f', 16 ).arg( r.xMaximum(), 0, 'f', 16 ) + .arg( r.yMinimum(), 0, 'f', 16 ).arg( r.yMaximum(), 0, 'f', 16 ) + .arg( quotedValue( mTableName ) ) + .arg( quotedValue( mGeometryColumn ) ) ) + ) + { + QgsMessageLog::logMessage( tr( "Could not update metadata for %1.%2.\nSQL:%1\nError: %2" ) + .arg( mTableName ) + .arg( mGeometryColumn ) + .arg( qry.lastQuery() ) + .arg( qry.lastError().text() ), + tr( "Oracle" ) ); + return false; + } + + if ( qry.numRowsAffected() == 0 ) + { + if ( !exec( qry, QString( "INSERT INTO mdsys.user_sdo_geom_metadata(table_name,column_name,srid,diminfo) VALUES (%1,%2,%3,mdsys.sdo_dim_array(" + "mdsys.sdo_dim_element('X', %4, %5, 0.001)," + "mdsys.sdo_dim_element('Y', %6, %7, 0.001)" + "))" ) + .arg( quotedValue( mTableName ) ) + .arg( quotedValue( mGeometryColumn ) ) + .arg( mSrid < 1 ? "NULL" : QString::number( mSrid ) ) + .arg( r.xMinimum(), 0, 'f', 16 ).arg( r.xMaximum(), 0, 'f', 16 ) + .arg( r.yMinimum(), 0, 'f', 16 ).arg( r.yMaximum(), 0, 'f', 16 ) + ) ) + { + QgsMessageLog::logMessage( tr( "Could not insert metadata for %1.%2.\nSQL:%3\nError: %4" ) + .arg( quotedValue( mTableName ) ) + .arg( quotedValue( mGeometryColumn ) ) + .arg( qry.lastQuery() ) + .arg( qry.lastError().text() ), + tr( "Oracle" ) ); + return false; + } + } } else { @@ -2750,12 +2764,12 @@ QgsVectorLayerImport::ImportError QgsOracleProvider::createEmptyLayer( QSqlDatabase db( *conn ); QSqlQuery qry( db ); + bool created = false; try { if ( !db.transaction() ) { - QgsMessageLog::logMessage( tr( "Could not start transaction" ), tr( "Oracle" ) ); - throw OracleException( qry ); + throw OracleException( tr( "Could not start transaction" ), db ); } if ( !exec( qry, QString( "SELECT 1 FROM all_tables WHERE owner=%1 AND table_name=%2" ) @@ -2763,16 +2777,25 @@ QgsVectorLayerImport::ImportError QgsOracleProvider::createEmptyLayer( .arg( quotedValue( tableName ) ) ) ) { - throw OracleException( qry ); + throw OracleException( tr( "Could not determine table existence." ), qry ); } bool exists = qry.next(); - if ( exists && overwrite ) + if ( exists ) { - // delete the table if exists, then re-create it - if ( !exec( qry, QString( "DROP TABLE %1" ).arg( ownerTableName ) ) ) - throw OracleException( qry ); + if ( overwrite ) + { + // delete the table if exists, then re-create it + if ( !exec( qry, QString( "DROP TABLE %1" ).arg( ownerTableName ) ) ) + { + throw OracleException( tr( "Table %1 could not be dropped." ).arg( ownerTableName ), qry ); + } + } + else + { + throw OracleException( tr( "Table %1 already exists." ).arg( ownerTableName ), qry ); + } } QString sql = QString( "CREATE TABLE %1(" ).arg( ownerTableName ); @@ -2790,22 +2813,18 @@ QgsVectorLayerImport::ImportError QgsOracleProvider::createEmptyLayer( if ( !exec( qry, sql ) ) { - throw OracleException( qry ); + throw OracleException( tr( "Table creation failed." ), qry ); } - QStringList parts = srs->authid().split( ":" ); - if ( parts.size() != 2 ) - { - throw OracleException( qry ); - } + created = true; // TODO: make precision configurable QString diminfo; if ( srs->geographicFlag() ) { diminfo = "mdsys.sdo_dim_array(" - "mdsys.sdo_dim_element('Longitude', -180, 180, 0.00001)," - "mdsys.sdo_dim_element('Latitude', -90, 90, 0.00001)" + "mdsys.sdo_dim_element('Longitude', -180, 180, 0.001)," + "mdsys.sdo_dim_element('Latitude', -90, 90, 0.001)" ")"; } else @@ -2816,13 +2835,68 @@ QgsVectorLayerImport::ImportError QgsOracleProvider::createEmptyLayer( ")"; } - if ( !exec( qry, QString( "INSERT INTO user_sdo_geom_metadata(table_name,column_name,srid,diminfo) VALUES (%1,%2,%3,%4)" ) + int srid = 0; + QStringList parts = srs->authid().split( ":" ); + if ( parts.size() == 2 ) + { + if ( !exec( qry, QString( "SELECT srid FROM mdsys.cs_srs WHERE auth_name=%1 AND auth_srid=%2" ) + .arg( quotedValue( parts[0] ) ) + .arg( quotedValue( parts[1] ) ) ) ) + { + throw OracleException( tr( "Could not lookup authid %1:%2" ).arg( parts[0] ).arg( parts[1] ), qry ); + } + + if ( qry.next() ) + { + srid = qry.value( 0 ).toInt(); + } + } + + if ( srid == 0 ) + { + QgsDebugMsg( QString( "%1:%2 not found in mdsys.cs_srs - trying WKT" ).arg( parts[0] ).arg( parts[1] ) ); + + QString wkt = srs->toWkt(); + if ( !exec( qry, QString( "SELECT srid FROM mdsys.cs_srs WHERE wktext=%1" ).arg( quotedValue( wkt ) ) ) ) + { + throw OracleException( tr( "Could not lookup WKT." ), qry ); + } + + if ( qry.next() ) + { + srid = qry.value( 0 ).toInt(); + } + else + { + if ( !exec( qry, "SELECT max(srid)+1 FROM sdo_coord_ref_system" ) || !qry.next() ) + { + throw OracleException( tr( "Could not determine new srid." ), qry ); + } + + srid = qry.value( 0 ).toInt(); + + QString sql; + + if ( !exec( qry, QString( "INSERT" + " INTO sdo_coord_ref_system(srid,coord_ref_sys_name,coord_ref_sys_kind,legacy_wktext,is_valid,is_legacy,information_source)" + " VALUES (%1,%2,%3,%4,'TRUE','TRUE','GDAL/OGR via Quantum GIS')" ) + .arg( srid ) + .arg( quotedValue( srs->description() ) ) + .arg( quotedValue( srs->geographicFlag() ? "GEOGRAPHIC2D" : "PROJECTED" ) ) + .arg( quotedValue( wkt ) ) ) ) + { + throw OracleException( tr( "CRS not found and could not be created." ), qry ); + } + } + } + + if ( !exec( qry, QString( "INSERT INTO mdsys.user_sdo_geom_metadata(table_name,column_name,srid,diminfo) VALUES (%1,%2,%3,%4)" ) .arg( quotedValue( tableName.toUpper() ) ) .arg( quotedValue( geometryColumn.toUpper() ) ) - .arg( parts[1].toInt() ) + .arg( srid ) .arg( diminfo ) ) ) { - throw OracleException( qry ); + throw OracleException( tr( "Could not insert metadata." ), qry ); } if ( !db.commit() ) @@ -2842,6 +2916,16 @@ QgsVectorLayerImport::ImportError QgsOracleProvider::createEmptyLayer( QgsMessageLog::logMessage( tr( "Could not rollback transaction" ), tr( "Oracle" ) ); } + if ( created ) + { + if ( !exec( qry, QString( "DROP TABLE %1" ).arg( ownerTableName ) ) ) + { + QgsMessageLog::logMessage( tr( "Drop created table %1 failed.\nSQL:%2\nError: %3" ) + .arg( qry.lastQuery() ) + .arg( qry.lastError().text() ) , tr( "Oracle" ) ); + } + } + conn->disconnect(); return QgsVectorLayerImport::ErrCreateLayer; @@ -2972,7 +3056,36 @@ QgsVectorLayerImport::ImportError QgsOracleProvider::createEmptyLayer( QgsCoordinateReferenceSystem QgsOracleProvider::crs() { QgsCoordinateReferenceSystem srs; - srs.createFromOgcWmsCrs( QString( "EPSG:%1" ).arg( mSrid ) ); + + QSqlQuery qry( *mConnection ); + + if ( exec( qry, QString( "SELECT auth_name,auth_srid,wktext FROM mdsys.cs_srs WHERE srid=%1" ).arg( mSrid ) ) ) + { + if ( qry.next() ) + { + if ( qry.value( 0 ).toString() == "EPSG" || qry.value( 0 ).isNull() ) + { + srs.createFromOgcWmsCrs( QString( "EPSG:%1" ).arg( qry.value( 1 ).toString() ) ); + } + else + { + srs.createFromWkt( qry.value( 2 ).toString() ); + } + } + else + { + QgsMessageLog::logMessage( tr( "Oracle SRID %1 not found." ).arg( mSrid ), tr( "Oracle" ) ); + } + } + else + { + QgsMessageLog::logMessage( tr( "Lookup of Oracle SRID %1 failed.\nSQL:%2\nError:%3" ) + .arg( mSrid ) + .arg( mQry.lastQuery() ) + .arg( mQry.lastError().text() ), + tr( "Oracle" ) ); + } + return srs; } @@ -3119,7 +3232,7 @@ QGISEXTERN bool deleteLayer( const QString& uri, QString& errCause ) dropTable = QString( "ALTER TABLE %1 DROP COLUMN %2" ) .arg( QgsOracleConn::quotedIdentifier( tableName ) ) .arg( QgsOracleConn::quotedIdentifier( geometryCol ) ); - cleanView = QString( "DELETE FROM user_sdo_geom_metadata WHERE table_name=%1 AND column_name=%2" ) + cleanView = QString( "DELETE FROM mdsys.user_sdo_geom_metadata WHERE table_name=%1 AND column_name=%2" ) .arg( QgsOracleConn::quotedValue( tableName ) ) .arg( QgsOracleConn::quotedValue( geometryCol ) ); } @@ -3128,7 +3241,7 @@ QGISEXTERN bool deleteLayer( const QString& uri, QString& errCause ) // drop the table dropTable = QString( "DROP TABLE %1" ) .arg( QgsOracleConn::quotedIdentifier( tableName ) ); - cleanView = QString( "DELETE FROM user_sdo_geom_metadata WHERE table_name=%1" ) + cleanView = QString( "DELETE FROM mdsys.user_sdo_geom_metadata WHERE table_name=%1" ) .arg( QgsOracleConn::quotedValue( tableName ) ); } diff --git a/src/providers/oracle/qgsoracleprovider.h b/src/providers/oracle/qgsoracleprovider.h index 8c34253e6bf..2f4403de908 100644 --- a/src/providers/oracle/qgsoracleprovider.h +++ b/src/providers/oracle/qgsoracleprovider.h @@ -381,8 +381,19 @@ class QgsOracleProvider : public QgsVectorDataProvider struct OracleException { - OracleException( const QSqlQuery &q ) - : mWhat( tr( "Oracle-Error: %1\nSQL: %2\n" ).arg( q.lastError().text() ).arg( q.lastQuery() ) ) + OracleException( QString msg, const QSqlQuery &q ) + : mWhat( tr( "Oracle error: %1\nSQL: %2\nError: %3" ) + .arg( msg ) + .arg( q.lastError().text() ) + .arg( q.lastQuery() ) + ) + {} + + OracleException( QString msg, const QSqlDatabase &q ) + : mWhat( tr( "Oracle error: %1\nError: %2" ) + .arg( msg ) + .arg( q.lastError().text() ) + ) {} OracleException( const OracleException &e ) diff --git a/src/providers/oracle/qgsoraclesourceselect.cpp b/src/providers/oracle/qgsoraclesourceselect.cpp index beb359fba96..36fa1868785 100644 --- a/src/providers/oracle/qgsoraclesourceselect.cpp +++ b/src/providers/oracle/qgsoraclesourceselect.cpp @@ -462,71 +462,20 @@ void QgsOracleSourceSelect::on_btnConnect_clicked() mConnInfo = uri.connectionInfo(); mUseEstimatedMetadata = uri.useEstimatedMetadata(); - QgsOracleConn *conn = QgsOracleConn::connectDb( uri.connectionInfo() ); - if ( conn ) - { - QApplication::setOverrideCursor( Qt::WaitCursor ); + QApplication::setOverrideCursor( Qt::BusyCursor ); - mIsConnected = true; - mTablesTreeDelegate->setConn( QgsOracleConn::connectDb( uri.connectionInfo() ) ); + mIsConnected = true; + mTablesTreeDelegate->setConn( QgsOracleConn::connectDb( uri.connectionInfo() ) ); - bool userTablesOnly = QgsOracleConn::userTablesOnly( cmbConnections->currentText() ); - bool allowGeometrylessTables = cbxAllowGeometrylessTables->isChecked(); + mColumnTypeThread = new QgsOracleColumnTypeThread( cmbConnections->currentText(), mUseEstimatedMetadata ); - QVector layers; - if ( conn->supportedLayers( layers, userTablesOnly, allowGeometrylessTables ) ) - { - // Add the supported layers to the table - foreach ( QgsOracleLayerProperty layer, layers ) - { - if ( !layer.geometryColName.isNull() ) - { - if ( layer.types.contains( QGis::WKBUnknown ) || layer.srids.isEmpty() ) - { - addSearchGeometryColumn( layer ); - } - } - else - { - QgsDebugMsg( QString( "adding table %1.%2" ).arg( layer.ownerName ).arg( layer.tableName ) ); - layer.types.clear(); - layer.srids.clear(); - mTableModel.addTableEntry( layer ); - } - } + connect( mColumnTypeThread, SIGNAL( setLayerType( QgsOracleLayerProperty ) ), + this, SLOT( setLayerType( QgsOracleLayerProperty ) ) ); + connect( mColumnTypeThread, SIGNAL( finished() ), + this, SLOT( columnThreadFinished() ) ); - if ( mColumnTypeThread ) - { - btnConnect->setText( tr( "Stop" ) ); - mColumnTypeThread->start(); - } - } - - //if we have only one owner item, expand it by default - int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount(); - if ( numTopLevelItems < 2 || mTableModel.tableCount() < 20 ) - { - //expand all the toplevel items - for ( int i = 0; i < numTopLevelItems; ++i ) - { - mTablesTreeView->expand( mProxyModel.mapFromSource( mTableModel.indexFromItem( mTableModel.invisibleRootItem()->child( i ) ) ) ); - } - } - - conn->disconnect(); - - if ( !mColumnTypeThread ) - { - finishList(); - } - } - else - { - // Let user know we couldn't initialise the Oracle provider - QMessageBox::warning( this, - tr( "Oracle Locator Provider" ), - tr( "Could not open the Oracle Locator Provider" ) ); - } + btnConnect->setText( tr( "Stop" ) ); + mColumnTypeThread->start(); } void QgsOracleSourceSelect::finishList() @@ -601,29 +550,6 @@ void QgsOracleSourceSelect::setSql( const QModelIndex &index ) delete vlayer; } -void QgsOracleSourceSelect::addSearchGeometryColumn( QgsOracleLayerProperty layerProperty ) -{ - // store the column details and do the query in a thread - if ( !mColumnTypeThread ) - { - QgsOracleConn *conn = QgsOracleConn::connectDb( mConnInfo ); - if ( conn ) - { - - mColumnTypeThread = new QgsOracleColumnTypeThread( conn, mUseEstimatedMetadata ); - - connect( mColumnTypeThread, SIGNAL( setLayerType( QgsOracleLayerProperty ) ), - this, SLOT( setLayerType( QgsOracleLayerProperty ) ) ); - connect( this, SIGNAL( addGeometryColumn( QgsOracleLayerProperty ) ), - mColumnTypeThread, SLOT( addGeometryColumn( QgsOracleLayerProperty ) ) ); - connect( mColumnTypeThread, SIGNAL( finished() ), - this, SLOT( columnThreadFinished() ) ); - } - } - - emit addGeometryColumn( layerProperty ); -} - QString QgsOracleSourceSelect::fullDescription( QString owner, QString table, QString column, QString type ) { QString full_desc = ""; diff --git a/src/providers/oracle/qgsoraclesourceselect.h b/src/providers/oracle/qgsoraclesourceselect.h index f6342b712c5..e6367f7d55d 100644 --- a/src/providers/oracle/qgsoraclesourceselect.h +++ b/src/providers/oracle/qgsoraclesourceselect.h @@ -85,7 +85,6 @@ class QgsOracleSourceSelect : public QDialog, private Ui::QgsDbSourceSelectBase signals: void addDatabaseLayers( QStringList const & layerPathList, QString const & providerKey ); void connectionsChanged(); - void addGeometryColumn( QgsOracleLayerProperty ); public slots: //! Determines the tables the user selected and closes the dialog diff --git a/src/providers/postgres/qgspostgresdataitems.cpp b/src/providers/postgres/qgspostgresdataitems.cpp index a29ad874aee..25a7157335d 100644 --- a/src/providers/postgres/qgspostgresdataitems.cpp +++ b/src/providers/postgres/qgspostgresdataitems.cpp @@ -20,6 +20,7 @@ #include "qgslogger.h" #include "qgsdatasourceuri.h" #include "qgsapplication.h" +#include "qgsmessageoutput.h" #include #include @@ -271,15 +272,17 @@ bool QgsPGConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction ) if ( hasError ) { - QMessageBox::warning( 0, tr( "Import to PostGIS database" ), tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ) ); + QgsMessageOutput *output = QgsMessageOutput::createMessageOutput(); + output->setTitle( tr( "Import to PostGIS database" ) ); + output->setMessage( tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ), QgsMessageOutput::MessageText ); + output->showMessage(); } else { QMessageBox::information( 0, tr( "Import to PostGIS database" ), tr( "Import was successful." ) ); + refresh(); } - refresh(); - return true; } diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index 9c4a6a7959b..2e369b2098a 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -623,7 +623,7 @@ bool QgsPostgresProvider::nextFeature( QgsFeature& feature ) if ( mFeatureQueue.empty() ) { QString fetch = QString( "FETCH FORWARD %1 FROM %2" ).arg( mFeatureQueueSize ).arg( cursorName ); - QgsDebugMsgLevel( QString( "fetching %1 features." ).arg( mFeatureQueueSize ), 3 ); + QgsDebugMsgLevel( QString( "fetching %1 features." ).arg( mFeatureQueueSize ), 4 ); if ( mConnectionRO->PQsendQuery( fetch ) == 0 ) // fetch features asynchronously { QgsMessageLog::logMessage( tr( "Fetching from cursor %1 failed\nDatabase error: %2" ).arg( cursorName ).arg( mConnectionRO->PQerrorMessage() ), tr( "PostGIS" ) ); diff --git a/src/providers/spatialite/qgsspatialitedataitems.cpp b/src/providers/spatialite/qgsspatialitedataitems.cpp index fa6a32a0f0c..50c6253788a 100644 --- a/src/providers/spatialite/qgsspatialitedataitems.cpp +++ b/src/providers/spatialite/qgsspatialitedataitems.cpp @@ -21,6 +21,7 @@ #include "qgslogger.h" #include "qgsmimedatautils.h" #include "qgsvectorlayerimport.h" +#include "qgsmessageoutput.h" #include #include @@ -226,15 +227,17 @@ bool QgsSLConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction ) if ( hasError ) { - QMessageBox::warning( 0, tr( "Import to SpatiaLite database" ), tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ) ); + QgsMessageOutput *output = QgsMessageOutput::createMessageOutput(); + output->setTitle( tr( "Import to SpatiaLite database" ) ); + output->setMessage( tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ), QgsMessageOutput::MessageText ); + output->showMessage(); } else { QMessageBox::information( 0, tr( "Import to SpatiaLite database" ), tr( "Import was successful." ) ); + refresh(); } - refresh(); - return true; }
LanguageFinished %Translators
German
100.0
Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho
Galician (Spain)
96.2
Xan Vieiro
Spanish
93.9
Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo
Italian
88.7
Paolo Cavallini, Flavio Rigolon, Maurizio Napolitano, Roberto Angeletti, Alessandro Fanna, Michele Beneventi, Marco Braida, Luca Casagrande, Luca Delucchi, Anne Gishla
Swedish
87.6
Lars Luthman, Magnus Homann, Victor Axbom
Dutch
86.4
Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk
Japanese
84.9
BABA Yoshihiko, Yoichi Kayama
Estonian (Estonia)
84.9
Veiko Viil
French
84.8
Eve Rousseau, Marc Monnerat, Lionel Roubeyrie, Jean Roc Morreale, Benjamin Bohard, Jeremy Garniaux, Yves Jacolin, Benjamin Lerre, Stéphane Morel, Marie Silvestre, Tahir Tamba, Xavier M, Mayeul Kauffmann, Mehdi Semchaoui, Robin Cura, Etienne Tourigny, Mathieu Bossaert
Portuguese (Brazil)
84.7
Arthur Nanni
Polish (Poland)
84.7
Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Loskot, Tomasz Paul, Andrzej Swiader
Russian
84.6
Artem Popov
Czech (Czech Republic)
84.1
Martin Landa, Peter Antolik, Martin Dzurov, Jan Helebrant
Hungarian
83.1
Zoltan Siki
Korean (Korea, Republic of)
82.5
BJ Jang
Slovenian (Slovenia)
78.8
Jože Detečnik, Dejan Gregor
Chinese (China)
74.1
Calvin Ngei, Zhang Jun
Latvian
69.3
Maris Nartiss, Pēteris Brūns
Serbian ()
67.5
Goran Ivanković
Serbian ()
67.4
Goran Ivanković
Portuguese (Portugal)
61.0
Giovanni Manghi, Joana Simoes, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva
Indonesian
58.6
Januar V. Simarmata, I Made Anombawa
Croatian (Croatia)
57.7
Zoran Jankovic
Thai
52.2
Man Chao
Ukrainian
48.3
Сергей Якунин
Turkish
46.3
Osman Yilmaz
Chinese (Taiwan, Province of China)
41.8
Nung-yao Lin
Vietnamese
39.9
Bùi Hữu Mạnh
Greek, Modern (1453-) (Greece)
38.1
Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves
Icelandic
35.4
Thordur Ivarsson
German
100.0
Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho
Galician (Spain)
96.3
Xan Vieiro
Spanish
93.7
Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo
Italian
88.5
Paolo Cavallini, Flavio Rigolon, Maurizio Napolitano, Roberto Angeletti, Alessandro Fanna, Michele Beneventi, Marco Braida, Luca Casagrande, Luca Delucchi, Anne Gishla
Swedish
87.4
Lars Luthman, Magnus Homann, Victor Axbom
Dutch
86.2
Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk
Japanese
84.7
BABA Yoshihiko, Yoichi Kayama
Estonian (Estonia)
84.7
Veiko Viil
French
84.6
Eve Rousseau, Marc Monnerat, Lionel Roubeyrie, Jean Roc Morreale, Benjamin Bohard, Jeremy Garniaux, Yves Jacolin, Benjamin Lerre, Stéphane Morel, Marie Silvestre, Tahir Tamba, Xavier M, Mayeul Kauffmann, Mehdi Semchaoui, Robin Cura, Etienne Tourigny, Mathieu Bossaert
Portuguese (Brazil)
84.5
Arthur Nanni
Polish (Poland)
84.5
Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Loskot, Tomasz Paul, Andrzej Swiader
Russian
84.4
Artem Popov
Czech (Czech Republic)
83.9
Martin Landa, Peter Antolik, Martin Dzurov, Jan Helebrant
Hungarian
82.9
Zoltan Siki
Korean (Korea, Republic of)
82.3
BJ Jang
Slovenian (Slovenia)
78.6
Jože Detečnik, Dejan Gregor
Chinese (China)
73.9
Calvin Ngei, Zhang Jun
Latvian
69.1
Maris Nartiss, Pēteris Brūns
Serbian ()
67.3
Goran Ivanković
Serbian ()
67.3
Goran Ivanković
Portuguese (Portugal)
60.8
Giovanni Manghi, Joana Simoes, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva
Indonesian
58.4
Januar V. Simarmata, I Made Anombawa
Croatian (Croatia)
57.6
Zoran Jankovic
Thai
52.1
Man Chao
Ukrainian
48.2
Сергей Якунин
Turkish
46.2
Osman Yilmaz
Chinese (Taiwan, Province of China)
41.7
Nung-yao Lin
Vietnamese
39.8
Bùi Hữu Mạnh
Greek, Modern (1453-) (Greece)
38.0
Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves
Icelandic
35.3
Thordur Ivarsson
Mongolian
33.7
Bayarmaa Enkhtur
Finnish
24.0
Marko Jarvenpaa
Danish (Denmark)
23.7
Preben Lisby
Finnish
23.9
Marko Jarvenpaa
Danish (Denmark)
23.6
Preben Lisby
Georgian (Georgia)
22.6
Shota Murtskhvaladze, George Machitidze
Bulgarian
20.4
Захари Савов, Jordan Tzvetkov
Romanian
20.2
Lonut Losifescu-Enescu, Bogdan Pacurar
Slovak
19.4
Lubos Balazovic
Slovak
19.3
Lubos Balazovic
Albanian (Albania)
17.1
Lao
15.4
Anousak Souphavanh, Soukanh Lathsavong
Persian
4.4
Mola Pahnadayan