mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
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
This commit is contained in:
parent
fcb5045571
commit
831f99a401
@ -1,42 +1,42 @@
|
||||
<style>table {font-size:80%;}th {text-align:left; }.bartodo{ background-color:red;width:100px;height:20px;}.bardone{ background-color:green;width:80px;height:20px;font-size:80%;text-align:center;padding-top:4px;height:16px;color:white;}</style><table><tr><th colspan="2" style="width:250px;">Language</th><th>Finished %</th><th>Translators</th></tr>
|
||||
|
||||
<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:9000 unfinished:0 untranslated:0" class="bartodo"><div class="bardone" style="width:100px">100.0</div></div></td><td>Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/gl_ES.png"></td><td>Galician (Spain)</td><td><div title="finished:8547 unfinished:221 untranslated:232" class="bartodo"><div class="bardone" style="width:96px">96.2</div></div></td><td>Xan Vieiro</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/es.png"></td><td>Spanish</td><td><div title="finished:8438 unfinished:22 untranslated:58" class="bartodo"><div class="bardone" style="width:93px">93.9</div></div></td><td>Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/it.png"></td><td>Italian</td><td><div title="finished:7967 unfinished:28 untranslated:515" class="bartodo"><div class="bardone" style="width:88px">88.7</div></div></td><td>Paolo Cavallini, Flavio Rigolon, Maurizio Napolitano, Roberto Angeletti, Alessandro Fanna, Michele Beneventi, Marco Braida, Luca Casagrande, Luca Delucchi, Anne Gishla</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sv.png"></td><td>Swedish</td><td><div title="finished:7316 unfinished:1131 untranslated:109" class="bartodo"><div class="bardone" style="width:87px">87.6</div></div></td><td>Lars Luthman, Magnus Homann, Victor Axbom</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/nl.png"></td><td>Dutch</td><td><div title="finished:7573 unfinished:399 untranslated:543" class="bartodo"><div class="bardone" style="width:86px">86.4</div></div></td><td>Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:7412 unfinished:461 untranslated:630" class="bartodo"><div class="bardone" style="width:84px">84.9</div></div></td><td>BABA Yoshihiko, Yoichi Kayama</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/et_EE.png"></td><td>Estonian (Estonia)</td><td><div title="finished:7412 unfinished:452 untranslated:639" class="bartodo"><div class="bardone" style="width:84px">84.9</div></div></td><td>Veiko Viil</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:7407 unfinished:449 untranslated:647" class="bartodo"><div class="bardone" style="width:84px">84.8</div></div></td><td>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</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:7412 unfinished:429 untranslated:662" class="bartodo"><div class="bardone" style="width:84px">84.7</div></div></td><td>Arthur Nanni</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/pl_PL.png"></td><td>Polish (Poland)</td><td><div title="finished:7412 unfinished:419 untranslated:672" class="bartodo"><div class="bardone" style="width:84px">84.7</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Loskot, Tomasz Paul, Andrzej Swiader </td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:7412 unfinished:407 untranslated:684" class="bartodo"><div class="bardone" style="width:84px">84.6</div></div></td><td>Artem Popov</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/cs_CZ.png"></td><td>Czech (Czech Republic)</td><td><div title="finished:7337 unfinished:463 untranslated:703" class="bartodo"><div class="bardone" style="width:84px">84.1</div></div></td><td>Martin Landa, Peter Antolik, Martin Dzurov, Jan Helebrant</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:7249 unfinished:456 untranslated:798" class="bartodo"><div class="bardone" style="width:83px">83.1</div></div></td><td>Zoltan Siki</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ko_KR.png"></td><td>Korean (Korea, Republic of)</td><td><div title="finished:7208 unfinished:440 untranslated:855" class="bartodo"><div class="bardone" style="width:82px">82.5</div></div></td><td>BJ Jang</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sl_SI.png"></td><td>Slovenian (Slovenia)</td><td><div title="finished:6891 unfinished:395 untranslated:1217" class="bartodo"><div class="bardone" style="width:78px">78.8</div></div></td><td>Jože Detečnik, Dejan Gregor</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/zh_CN.png"></td><td>Chinese (China)</td><td><div title="finished:6507 unfinished:323 untranslated:1673" class="bartodo"><div class="bardone" style="width:74px">74.1</div></div></td><td>Calvin Ngei, Zhang Jun</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:5906 unfinished:654 untranslated:1943" class="bartodo"><div class="bardone" style="width:69px">69.3</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sr_Latn.png"></td><td>Serbian ()</td><td><div title="finished:5610 unfinished:921 untranslated:1989" class="bartodo"><div class="bardone" style="width:67px">67.5</div></div></td><td>Goran Ivanković</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sr_Cyrl.png"></td><td>Serbian ()</td><td><div title="finished:5646 unfinished:845 untranslated:2029" class="bartodo"><div class="bardone" style="width:67px">67.4</div></div></td><td>Goran Ivanković</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:3913 unfinished:3151 untranslated:1439" class="bartodo"><div class="bardone" style="width:60px">61.0</div></div></td><td>Giovanni Manghi, Joana Simoes, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:4803 unfinished:936 untranslated:2764" class="bartodo"><div class="bardone" style="width:58px">58.6</div></div></td><td>Januar V. Simarmata, I Made Anombawa</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/hr_HR.png"></td><td>Croatian (Croatia)</td><td><div title="finished:4914 unfinished:557 untranslated:3032" class="bartodo"><div class="bardone" style="width:57px">57.7</div></div></td><td>Zoran Jankovic</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/th.png"></td><td>Thai</td><td><div title="finished:4139 unfinished:1125 untranslated:3239" class="bartodo"><div class="bardone" style="width:52px">52.2</div></div></td><td>Man Chao</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/uk.png"></td><td>Ukrainian</td><td><div title="finished:3754 unfinished:1182 untranslated:3731" class="bartodo"><div class="bardone" style="width:48px">48.3</div></div></td><td>Сергей Якунин</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:3698 unfinished:938 untranslated:3867" class="bartodo"><div class="bardone" style="width:46px">46.3</div></div></td><td>Osman Yilmaz</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/zh_TW.png"></td><td>Chinese (Taiwan, Province of China)</td><td><div title="finished:2447 unfinished:2630 untranslated:3426" class="bartodo"><div class="bardone" style="width:41px">41.8</div></div></td><td>Nung-yao Lin</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:2795 unfinished:1592 untranslated:4116" class="bartodo"><div class="bardone" style="width:39px">39.9</div></div></td><td>Bùi Hữu Mạnh</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/el_GR.png"></td><td>Greek, Modern (1453-) (Greece)</td><td><div title="finished:2989 unfinished:874 untranslated:4640" class="bartodo"><div class="bardone" style="width:38px">38.1</div></div></td><td>Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/is.png"></td><td>Icelandic</td><td><div title="finished:2853 unfinished:662 untranslated:4988" class="bartodo"><div class="bardone" style="width:35px">35.4</div></div></td><td>Thordur Ivarsson</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:9021 unfinished:0 untranslated:0" class="bartodo"><div class="bardone" style="width:100px">100.0</div></div></td><td>Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/gl_ES.png"></td><td>Galician (Spain)</td><td><div title="finished:8574 unfinished:219 untranslated:223" class="bartodo"><div class="bardone" style="width:96px">96.3</div></div></td><td>Xan Vieiro</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/es.png"></td><td>Spanish</td><td><div title="finished:8438 unfinished:22 untranslated:58" class="bartodo"><div class="bardone" style="width:93px">93.7</div></div></td><td>Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/it.png"></td><td>Italian</td><td><div title="finished:7967 unfinished:28 untranslated:515" class="bartodo"><div class="bardone" style="width:88px">88.5</div></div></td><td>Paolo Cavallini, Flavio Rigolon, Maurizio Napolitano, Roberto Angeletti, Alessandro Fanna, Michele Beneventi, Marco Braida, Luca Casagrande, Luca Delucchi, Anne Gishla</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sv.png"></td><td>Swedish</td><td><div title="finished:7316 unfinished:1131 untranslated:109" class="bartodo"><div class="bardone" style="width:87px">87.4</div></div></td><td>Lars Luthman, Magnus Homann, Victor Axbom</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/nl.png"></td><td>Dutch</td><td><div title="finished:7573 unfinished:399 untranslated:543" class="bartodo"><div class="bardone" style="width:86px">86.2</div></div></td><td>Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:7412 unfinished:461 untranslated:630" class="bartodo"><div class="bardone" style="width:84px">84.7</div></div></td><td>BABA Yoshihiko, Yoichi Kayama</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/et_EE.png"></td><td>Estonian (Estonia)</td><td><div title="finished:7412 unfinished:452 untranslated:639" class="bartodo"><div class="bardone" style="width:84px">84.7</div></div></td><td>Veiko Viil</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:7407 unfinished:449 untranslated:647" class="bartodo"><div class="bardone" style="width:84px">84.6</div></div></td><td>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</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:7412 unfinished:429 untranslated:662" class="bartodo"><div class="bardone" style="width:84px">84.5</div></div></td><td>Arthur Nanni</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/pl_PL.png"></td><td>Polish (Poland)</td><td><div title="finished:7412 unfinished:419 untranslated:672" class="bartodo"><div class="bardone" style="width:84px">84.5</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Loskot, Tomasz Paul, Andrzej Swiader </td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:7412 unfinished:407 untranslated:684" class="bartodo"><div class="bardone" style="width:84px">84.4</div></div></td><td>Artem Popov</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/cs_CZ.png"></td><td>Czech (Czech Republic)</td><td><div title="finished:7337 unfinished:463 untranslated:703" class="bartodo"><div class="bardone" style="width:83px">83.9</div></div></td><td>Martin Landa, Peter Antolik, Martin Dzurov, Jan Helebrant</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:7249 unfinished:456 untranslated:798" class="bartodo"><div class="bardone" style="width:82px">82.9</div></div></td><td>Zoltan Siki</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ko_KR.png"></td><td>Korean (Korea, Republic of)</td><td><div title="finished:7208 unfinished:440 untranslated:855" class="bartodo"><div class="bardone" style="width:82px">82.3</div></div></td><td>BJ Jang</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sl_SI.png"></td><td>Slovenian (Slovenia)</td><td><div title="finished:6891 unfinished:395 untranslated:1217" class="bartodo"><div class="bardone" style="width:78px">78.6</div></div></td><td>Jože Detečnik, Dejan Gregor</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/zh_CN.png"></td><td>Chinese (China)</td><td><div title="finished:6507 unfinished:323 untranslated:1673" class="bartodo"><div class="bardone" style="width:73px">73.9</div></div></td><td>Calvin Ngei, Zhang Jun</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:5906 unfinished:654 untranslated:1943" class="bartodo"><div class="bardone" style="width:69px">69.1</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sr_Latn.png"></td><td>Serbian ()</td><td><div title="finished:5610 unfinished:921 untranslated:1989" class="bartodo"><div class="bardone" style="width:67px">67.3</div></div></td><td>Goran Ivanković</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sr_Cyrl.png"></td><td>Serbian ()</td><td><div title="finished:5646 unfinished:845 untranslated:2029" class="bartodo"><div class="bardone" style="width:67px">67.3</div></div></td><td>Goran Ivanković</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:3913 unfinished:3151 untranslated:1439" class="bartodo"><div class="bardone" style="width:60px">60.8</div></div></td><td>Giovanni Manghi, Joana Simoes, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:4803 unfinished:936 untranslated:2764" class="bartodo"><div class="bardone" style="width:58px">58.4</div></div></td><td>Januar V. Simarmata, I Made Anombawa</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/hr_HR.png"></td><td>Croatian (Croatia)</td><td><div title="finished:4914 unfinished:557 untranslated:3032" class="bartodo"><div class="bardone" style="width:57px">57.6</div></div></td><td>Zoran Jankovic</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/th.png"></td><td>Thai</td><td><div title="finished:4139 unfinished:1125 untranslated:3239" class="bartodo"><div class="bardone" style="width:52px">52.1</div></div></td><td>Man Chao</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/uk.png"></td><td>Ukrainian</td><td><div title="finished:3754 unfinished:1182 untranslated:3731" class="bartodo"><div class="bardone" style="width:48px">48.2</div></div></td><td>Сергей Якунин</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:3698 unfinished:938 untranslated:3867" class="bartodo"><div class="bardone" style="width:46px">46.2</div></div></td><td>Osman Yilmaz</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/zh_TW.png"></td><td>Chinese (Taiwan, Province of China)</td><td><div title="finished:2447 unfinished:2630 untranslated:3426" class="bartodo"><div class="bardone" style="width:41px">41.7</div></div></td><td>Nung-yao Lin</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:2795 unfinished:1592 untranslated:4116" class="bartodo"><div class="bardone" style="width:39px">39.8</div></div></td><td>Bùi Hữu Mạnh</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/el_GR.png"></td><td>Greek, Modern (1453-) (Greece)</td><td><div title="finished:2989 unfinished:874 untranslated:4640" class="bartodo"><div class="bardone" style="width:37px">38.0</div></div></td><td>Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/is.png"></td><td>Icelandic</td><td><div title="finished:2853 unfinished:662 untranslated:4988" class="bartodo"><div class="bardone" style="width:35px">35.3</div></div></td><td>Thordur Ivarsson</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/mn.png"></td><td>Mongolian</td><td><div title="finished:2488 unfinished:1098 untranslated:4917" class="bartodo"><div class="bardone" style="width:33px">33.7</div></div></td><td>Bayarmaa Enkhtur</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/fi.png"></td><td>Finnish</td><td><div title="finished:1547 unfinished:1226 untranslated:5730" class="bartodo"><div class="bardone" style="width:24px">24.0</div></div></td><td>Marko Jarvenpaa</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/da_DK.png"></td><td>Danish (Denmark)</td><td><div title="finished:1739 unfinished:788 untranslated:5976" class="bartodo"><div class="bardone" style="width:23px">23.7</div></div></td><td>Preben Lisby</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/fi.png"></td><td>Finnish</td><td><div title="finished:1547 unfinished:1226 untranslated:5730" class="bartodo"><div class="bardone" style="width:23px">23.9</div></div></td><td>Marko Jarvenpaa</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/da_DK.png"></td><td>Danish (Denmark)</td><td><div title="finished:1739 unfinished:788 untranslated:5976" class="bartodo"><div class="bardone" style="width:23px">23.6</div></div></td><td>Preben Lisby</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ka_GE.png"></td><td>Georgian (Georgia)</td><td><div title="finished:1264 unfinished:1542 untranslated:5697" class="bartodo"><div class="bardone" style="width:22px">22.6</div></div></td><td>Shota Murtskhvaladze, George Machitidze</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/bg.png"></td><td>Bulgarian</td><td><div title="finished:1064 unfinished:1549 untranslated:5890" class="bartodo"><div class="bardone" style="width:20px">20.4</div></div></td><td>Захари Савов, Jordan Tzvetkov</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:1100 unfinished:1443 untranslated:6255" class="bartodo"><div class="bardone" style="width:20px">20.2</div></div></td><td>Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:736 unfinished:2014 untranslated:5753" class="bartodo"><div class="bardone" style="width:19px">19.4</div></div></td><td>Lubos Balazovic</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:736 unfinished:2014 untranslated:5753" class="bartodo"><div class="bardone" style="width:19px">19.3</div></div></td><td>Lubos Balazovic</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/sq_AL.png"></td><td>Albanian (Albania)</td><td><div title="finished:844 unfinished:1396 untranslated:6263" class="bartodo"><div class="bardone" style="width:17px">17.1</div></div></td><td></td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/lo.png"></td><td>Lao</td><td><div title="finished:563 unfinished:1654 untranslated:6598" class="bartodo"><div class="bardone" style="width:15px">15.4</div></div></td><td>Anousak Souphavanh, Soukanh Lathsavong</td></tr>
|
||||
<tr><td><img src="qrc:/images/flags/fa.png"></td><td>Persian</td><td><div title="finished:240 unfinished:319 untranslated:7944" class="bartodo"><div class="bardone" style="width:4px">4.4</div></div></td><td>Mola Pahnadayan</td></tr>
|
||||
|
1677
i18n/qgis_de.ts
1677
i18n/qgis_de.ts
File diff suppressed because it is too large
Load Diff
@ -16,22 +16,18 @@ email : jef at norbit dot de
|
||||
***************************************************************************/
|
||||
|
||||
#include "qgsoraclecolumntypethread.h"
|
||||
#include "qgslogger.h"
|
||||
|
||||
#include <QMetaType>
|
||||
|
||||
QgsOracleColumnTypeThread::QgsOracleColumnTypeThread( QgsOracleConn *conn, bool useEstimatedMetaData )
|
||||
QgsOracleColumnTypeThread::QgsOracleColumnTypeThread( QString name, bool useEstimatedMetadata )
|
||||
: QThread()
|
||||
, mConn( conn )
|
||||
, mUseEstimatedMetadata( useEstimatedMetaData )
|
||||
, mName( name )
|
||||
, mUseEstimatedMetadata( useEstimatedMetadata )
|
||||
{
|
||||
qRegisterMetaType<QgsOracleLayerProperty>( "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<QgsOracleLayerProperty> 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();
|
||||
}
|
||||
|
@ -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<QgsOracleLayerProperty> layerProperties;
|
||||
|
@ -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;
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "qgslogger.h"
|
||||
#include "qgsdatasourceuri.h"
|
||||
#include "qgsapplication.h"
|
||||
#include "qgsmessageoutput.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QProgressDialog>
|
||||
@ -78,73 +79,38 @@ void QgsOracleConnectionItem::refresh()
|
||||
QVector<QgsDataItem*> QgsOracleConnectionItem::createChildren()
|
||||
{
|
||||
QgsDebugMsg( "Entered" );
|
||||
QVector<QgsDataItem*> children;
|
||||
QgsDataSourceURI uri = QgsOracleConn::connUri( mName );
|
||||
|
||||
mOwnerMap.clear();
|
||||
|
||||
mConn = QgsOracleConn::connectDb( uri.connectionInfo() );
|
||||
if ( !mConn )
|
||||
return children;
|
||||
|
||||
QVector<QgsOracleLayerProperty> 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<QgsDataItem*>();
|
||||
}
|
||||
|
||||
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<const QgsOracleConnectionItem *>( other );
|
||||
return ( mPath == o->mPath && mName == o->mName && o->connection() == connection() );
|
||||
return ( mPath == o->mPath && mName == o->mName && o->parent() == parent() );
|
||||
}
|
||||
|
||||
QList<QAction*> QgsOracleConnectionItem::actions()
|
||||
@ -194,6 +165,10 @@ QList<QAction*> 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<QgsOracleConnectionItem *>( 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 );
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
@ -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<QString, QgsOracleOwnerItem * > mOwnerMap;
|
||||
QgsOracleColumnTypeThread *mColumnTypeThread;
|
||||
};
|
||||
|
@ -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<QgsField> &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<QgsField>::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter )
|
||||
@ -1807,7 +1797,7 @@ bool QgsOracleProvider::addAttributes( const QList<QgsField> &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<QgsField> &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<QgsField> &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 ) );
|
||||
}
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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<QgsOracleLayerProperty> 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 = "";
|
||||
|
@ -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
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "qgslogger.h"
|
||||
#include "qgsdatasourceuri.h"
|
||||
#include "qgsapplication.h"
|
||||
#include "qgsmessageoutput.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QProgressDialog>
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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" ) );
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "qgslogger.h"
|
||||
#include "qgsmimedatautils.h"
|
||||
#include "qgsvectorlayerimport.h"
|
||||
#include "qgsmessageoutput.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QMessageBox>
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user