{"action":"opened","number":5751,"pull_request":{"url":"https://api.github.com/repos/qgis/QGIS/pulls/5751","id":155023130,"html_url":"https://github.com/qgis/QGIS/pull/5751","diff_url":"https://github.com/qgis/QGIS/pull/5751.diff","patch_url":"https://github.com/qgis/QGIS/pull/5751.patch","issue_url":"https://api.github.com/repos/qgis/QGIS/issues/5751","number":5751,"state":"open","locked":false,"title":"Master32.spatialite provider","user":{"login":"mj10777","id":4899405,"avatar_url":"https://avatars2.githubusercontent.com/u/4899405?v=4","gravatar_id":"","url":"https://api.github.com/users/mj10777","html_url":"https://github.com/mj10777","followers_url":"https://api.github.com/users/mj10777/followers","following_url":"https://api.github.com/users/mj10777/following{/other_user}","gists_url":"https://api.github.com/users/mj10777/gists{/gist_id}","starred_url":"https://api.github.com/users/mj10777/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mj10777/subscriptions","organizations_url":"https://api.github.com/users/mj10777/orgs","repos_url":"https://api.github.com/users/mj10777/repos","events_url":"https://api.github.com/users/mj10777/events{/privacy}","received_events_url":"https://api.github.com/users/mj10777/received_events","type":"User","site_admin":false},"body":"## Description\r\nQgsSpatiaLiteProvider reorginised for Spatialite 4.5.0, RasterLite2 and Topology\r\n\r\n## Checklist\r\n\r\n> Reviewing is a process done by project maintainers, mostly on a volunteer basis. We try to keep the overhead as small as possible and appreciate if you help us to do so by completing the following items. Feel free to ask in a comment if you have troubles with any of them.\r\n\r\n- [x ] Commit messages are descriptive and explain the rationale for changes\r\n- [ ] Commits which fix bugs include `fixes #11111` in the commit message next to the description\r\n- [ ] Commits which add new features are tagged with `[FEATURE]` in the commit message\r\n- [ ] Commits which change the UI or existing user workflows are tagged with `[needs-docs]` in the commit message and containt sufficient information in the commit message to be documented\r\n- [x ] I have read the [QGIS Coding Standards](https://docs.qgis.org/testing/en/docs/developers_guide/codingstandards.html) and this PR complies with them\r\n- [x ] This PR passes all existing unit tests (test results will be reported by travis-ci after opening this PR)\r\n- [ ] New unit tests have been added for core changes\r\n- [x ] I have run [the `scripts/prepare-commit.sh` script](https://github.com/qgis/QGIS/blob/master/.github/CONTRIBUTE.md#contributing-to-qgis) before each commit\r\n\r\nThis pull request will correct many known problems and prepare the QgsSpatiaLiteProvider to deal with the many changes in the upcoming Spatialite 4.5.0 with RasterLite2, Topology and SE/SLD Style support.\r\n\r\nThe present approach, to simply list TABLEs and VIEWs that contain Geometries is no longer practicable, since many of the Administration TABLEs also contain geometries which normally should never be displaced.\r\n\r\nAlso the interdependence between Layers (Vector and Raster) with Styles and other information contained in the Database, calls for a different approach to the problem, so that all of the capabilities being offered by Spatialite 4.5.0 can be fully utilized.\r\n\r\n---\r\n\r\nThis is a re fractured version based on master of 2017-11-17, after the switch to spatialite 4.2.0.\r\nWhen needed, a spatialite/rasterlite2 connection is started using the 'load_extension' logic of sqlite3, which has been supported since Spatialite 4.2.0. There is no needed for extra memory to be reserved for a Spatialite/RasterLite2 connections, since this all dealt with from within 'mod_spatialite/rasterlite2'.\r\nThe source dependency for RasterLite2 has been removed, since after  'mod_rasterlite2' only sql-queries are used.\r\n\r\nFull implementation of **QgsLayerItem** for QgsBrowser has been added.\r\n\r\nAll needed information can be gathered **without** a Spatialite/Rasterlite2 connection, avoiding the problem of the maximum 64 connections allowed at one time.\r\n\r\nFor this to work correctly, i.e. avoiding double entries, code must be added to the gdal/ogr versions of **dataItem** to skip files supported by Spatialite/RasterLite2. A part of the process is to read the Magic-Header to determine if it is a sqlite3 file, but also if the Magic-Header is of a file type that is **not** supported by any Provider (such as executable's, libraries etc.) and therefore can be skipped by gdal/ogr.  The whole process becomes noticeably swifter.\r\n\r\nFull implementation of **QgsLayerMetadata**, but due to a lack of support (at present) in **QgsDataProvider** cannot be read in by **QgsVectorLayer** and **QgsRasterLayer** during **setDataProvider**.\r\n\r\nAs an experiment, I added to **QgsDataProvider**:\r\n*     QgsLayerMetadata mLayerMetadata;\r\n\r\nwith corresponding **setLayerMetadata** and **layermetadata()** and in the **setDataProvider** functions:  \r\n* setMetadata( mDataProvider->layermetadata() );\r\n\r\nAll of the Metadata showed up properly both in the standard Layer-Properties as well as in the **QgsLayerItem** properties.\r\n\r\n---\r\n**spatialite_database_unique_ptr**\r\n* is not used (everything needed is done in the **QgsSqliteHandle** class).\r\n\r\nIt is advised to switch to the **load_extension** logic, removing the need of **mSpatialiteContext** and\r\n* spatialite_alloc_connection\r\n* spatialite_init_ex\r\n\r\nand later:\r\n* spatialite_cleanup_ex\r\n\r\n**Crucial** is, however, that **PRAGMA foreign_keys = 1** be executed **before** a spatialite connection is made, enabling Foreign Key constraints.\r\n\r\n---\r\n\r\nFor this three new classes have introduced\r\n* **SpatialiteDbInfo** \r\n   * a class that will contain all needed information about the Database\r\n* **SpatialiteDbLayer**\r\n   * a class that will contain all needed information about a specific Layer within the Database\r\n* **QgsSpatiaLiteUtils**\r\n   * with helper static function (see below)\r\n\r\n**SpatialiteDbInfo**  will contain this list of all available **SpatialiteDbLayer**s\r\n* and will make them available upon demand\r\n\r\n---\r\n\r\n**SpatialiteDbInfo** will be contained in the presently existing **QgsSqliteHandle** class\r\n* with it's sharing capability\r\n\r\nThis portions of this pull request have been placed in **core/providers/spatialite**\r\n* so that they may be made available everywhere where a spatialite connection is needed\r\n\r\nIn a scenario, where 10-50 layers are being loaded from the same Database\r\n* that Database is read only once and the collected information shared between the 10-50 layers\r\n\r\n---\r\nAll classes within the QgsSpatiaLiteProvider access all needed information from **SpatialiteDbInfo** or **SpatialiteDbLayer** are retrieved and stored as member variable.\r\n\r\nInstead of **mSqliteHandle** , **dbSqliteHandle()** is used, so that knowledge of the internal structure of **SpatialiteDbInfo** and **SpatialiteDbLayer** is not needed.\r\n\r\nOtherwise the functionality of the QgsSpatiaLiteProvider, QgsSpatiaLiteFeatureIterator and QgsSpatiaLiteConnection have not changed, only the method on how they attain the needed information has.\r\n\r\nThese classes had contained many functions for the retrieval of information from the Database, some copies of others, which is now dealt with **once** in **SpatialiteDbInfo** and/or **SpatialiteDbLayer**.\r\n\r\nAll of these functions have been removed.\r\nAll static functions (10), that were used in QgsSpatiaLiteProvider, have been moved to a **QgsSpatiaLiteUtils** class. These were mainly functions for the calculation of object sizes or converting from one (internal spatialite specific) format to another.\r\n\r\nGoal was to separate the Database and Provider functionality.\r\nThis should simplify future maintenance of both. \r\n\r\n---\r\nSince **SpatialiteDbInfo** is separate from the QgsSpatiaLiteProvider class, it can be used for other tasks, such as\r\n* is the file a **Sqlite3** container\r\n* is the container supported by QGis through\r\n   * **QgsSpatiaLiteProvider**\r\n   * **QgsOgrProvider**\r\n   * **QgsGdalProvider**\r\n\r\nThis would make it possible to be used within the\r\n* Drag and Drop and Browser logic\r\n\r\nFor 'Drag and Drop', this has been implemented in QgisApp::openLayer, where the QgsSpatiaLiteSourceSelect will be opened if the Droped files is a supported **Sqlite3** container and that there is more than 1 Layer. If only 1 Layer then it will be opened. Otherwise the function will continue as it does now.\r\n\r\nIt can be called in a way to only 'sniff' the Database, returning after determining which container type it is\r\n* Spatialite (from version 2.4 to present)\r\n* FdoOgr\r\n* GeoPackage (Raster/Vector)\r\n* MbTiles\r\n* RasterLite1\r\n* RasterLite2\r\n* Topology\r\n\r\nSince the **QgsOgrProvider** cannot (yet) recognize Spatialite Tables with more than 1 Geometry and since **Ogr** has no support for writable SpatialView's, it would be important that within the Drag and Drop/Browser logic the **QgsSpatiaLiteProvider** would be used as the default.\r\n\r\nThe 'Data Source Manager - Spatialite' has been adapted to use **SpatialiteDbInfo** and **SpatialiteDbLayer**, so that the structure of the different containers can be shown (more to that later).\r\n\r\nAlso **SpatialiteDbInfo** can submit the selected Layers as **QgsVectorLayer** or **QgsRasterLayer** with the proper Provider/Connection Uri's.\r\n\r\nThis would have the advantage, that for a **GeoPackage** source, both the Vector (**QgsOgrProvider**) and Raster (**QgsGdalProvider**) Layers could be added in 1 step.\r\n\r\n---\r\nFor the User, the only noticeable change will be the 'Data Source Manager - Spatialite'.\r\nThe **QgsSpatiaLiteTableModel** (based on **QStandardItemModel**) will now show a TreeView\r\n\r\nHere a sample showing a **GeoPackage** Database:\r\n\r\n![datasourcemanager gpkg select](https://user-images.githubusercontent.com/4899405/29393292-381f1ec0-8303-11e7-84a3-df18cbb84c74.jpg)\r\n\r\nHere you can see that there are 3 tree branches\r\n* Vector\r\n* Raster\r\n* Non-Spatial [will always be the **last** branch]\r\n\r\nso that the User can distinguish between the different types, collapsing what they don't want to see.\r\n\r\nInside the Non-Spatial group, there are also sub-groups, so that a search for Data-Tables, Views can be easily found (without the data beings displayed), since index-tables are in an extra group.\r\n\r\nSince **SpatialiteDbInfo** must collect the Non-Spatial anyway, the CheckBox to turn this on/off has been hidden.\r\n\r\nIn the above Image ,the last selected Item is a Raster.\r\nWhen selected, first any Raster, then Polygons will be submitted, since it seems that Rasters are rendered before any Vectors. Then Linestrings after which any Point will be submitted, so that the Polygons will be over the Rasters, the Linestrings over the Polygons and the Points over the Linestrings.\r\n\r\nHere a view of the result from a Spatialite-Database that contains SE/SLD-Styles:\r\n\r\n![datasourcemanager styles select](https://user-images.githubusercontent.com/4899405/29393819-8230e310-8306-11e7-9eac-a9bad30dd033.jpg)\r\n\r\n\r\nSince **SpatialiteDbInfo** has collected all the needed information about existing Styles and **SpatialiteDbLayer** has retrieved the information which Style it should use,  **SpatialiteDbInfo** will call the **readSld** function of QgsVectorLayer before it is sent to QGis.\r\n\r\n---\r\nAt some time the Browser logic should be adapted to utilize the capability of **SpatialiteDbInfo**  after an initial QGis 3.0 release.\r\n\r\nAlso the **QgsSpatiaLiteTableModel** from **QStandardItemModel** to a **QAbstractItemModel** which would be fine tuned to interact with **SpatialiteDbInfo** and **SpatialiteDbLayer**\r\n* Alessandro Furieri (Sandro of Spatialite), has asked if \r\n\r\n> adding some ad hoc function allowing to drop or rename columns in the most painless way.\r\n\r\nmaking the administration of a Database easier.\r\n\r\nMore work on the QgsRasterLite2 provider will be done during/after the initial release of RasterLite2.\r\n\r\n---\r\nKnown problem: none.\r\n\r\nThe geometry shown in the 2nd image were all created after all changes in QgsSpatiaLiteProvider, QgsSpatiaLiteFeatureIterator and co. were made, so I believe that these changes can be considered stable.\r\n\r\n---\r\nOther changes that come to mind:\r\n* the default values are now correctly shown when creating a new Geometry\r\n* SpatialViews will use the default values of the base TABLE when the column names have not changed (which in a view is possible)\r\n* full Date/DateTime support\r\n\r\n---\r\nPrevious pull requests are redundant.\r\n https://github.com/qgis/QGIS/pull/5033\r\n* already closed\r\n\r\n https://github.com/qgis/QGIS/pull/5146\r\n* already closed\r\n\r\nhttps://github.com/qgis/QGIS/pull/5487\r\n* still open\r\n\r\n---\r\n\r\n\r\n","created_at":"2017-11-28T09:52:06Z","updated_at":"2017-11-28T09:52:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/qgis/QGIS/pulls/5751/commits","review_comments_url":"https://api.github.com/repos/qgis/QGIS/pulls/5751/comments","review_comment_url":"https://api.github.com/repos/qgis/QGIS/pulls/comments{/number}","comments_url":"https://api.github.com/repos/qgis/QGIS/issues/5751/comments","statuses_url":"https://api.github.com/repos/qgis/QGIS/statuses/cfd4a2e8d7fc7be081b18809a9b9b1d0eccbe6fc","head":{"label":"mj10777:master32.spatialite_provider","ref":"master32.spatialite_provider","sha":"cfd4a2e8d7fc7be081b18809a9b9b1d0eccbe6fc","user":{"login":"mj10777","id":4899405,"avatar_url":"https://avatars2.githubusercontent.com/u/4899405?v=4","gravatar_id":"","url":"https://api.github.com/users/mj10777","html_url":"https://github.com/mj10777","followers_url":"https://api.github.com/users/mj10777/followers","following_url":"https://api.github.com/users/mj10777/following{/other_user}","gists_url":"https://api.github.com/users/mj10777/gists{/gist_id}","starred_url":"https://api.github.com/users/mj10777/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mj10777/subscriptions","organizations_url":"https://api.github.com/users/mj10777/orgs","repos_url":"https://api.github.com/users/mj10777/repos","events_url":"https://api.github.com/users/mj10777/events{/privacy}","received_events_url":"https://api.github.com/users/mj10777/received_events","type":"User","site_admin":false},"repo":{"id":71857088,"name":"QGIS","full_name":"mj10777/QGIS","owner":{"login":"mj10777","id":4899405,"avatar_url":"https://avatars2.githubusercontent.com/u/4899405?v=4","gravatar_id":"","url":"https://api.github.com/users/mj10777","html_url":"https://github.com/mj10777","followers_url":"https://api.github.com/users/mj10777/followers","following_url":"https://api.github.com/users/mj10777/following{/other_user}","gists_url":"https://api.github.com/users/mj10777/gists{/gist_id}","starred_url":"https://api.github.com/users/mj10777/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mj10777/subscriptions","organizations_url":"https://api.github.com/users/mj10777/orgs","repos_url":"https://api.github.com/users/mj10777/repos","events_url":"https://api.github.com/users/mj10777/events{/privacy}","received_events_url":"https://api.github.com/users/mj10777/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mj10777/QGIS","description":"QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS)","fork":true,"url":"https://api.github.com/repos/mj10777/QGIS","forks_url":"https://api.github.com/repos/mj10777/QGIS/forks","keys_url":"https://api.github.com/repos/mj10777/QGIS/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mj10777/QGIS/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mj10777/QGIS/teams","hooks_url":"https://api.github.com/repos/mj10777/QGIS/hooks","issue_events_url":"https://api.github.com/repos/mj10777/QGIS/issues/events{/number}","events_url":"https://api.github.com/repos/mj10777/QGIS/events","assignees_url":"https://api.github.com/repos/mj10777/QGIS/assignees{/user}","branches_url":"https://api.github.com/repos/mj10777/QGIS/branches{/branch}","tags_url":"https://api.github.com/repos/mj10777/QGIS/tags","blobs_url":"https://api.github.com/repos/mj10777/QGIS/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mj10777/QGIS/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mj10777/QGIS/git/refs{/sha}","trees_url":"https://api.github.com/repos/mj10777/QGIS/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mj10777/QGIS/statuses/{sha}","languages_url":"https://api.github.com/repos/mj10777/QGIS/languages","stargazers_url":"https://api.github.com/repos/mj10777/QGIS/stargazers","contributors_url":"https://api.github.com/repos/mj10777/QGIS/contributors","subscribers_url":"https://api.github.com/repos/mj10777/QGIS/subscribers","subscription_url":"https://api.github.com/repos/mj10777/QGIS/subscription","commits_url":"https://api.github.com/repos/mj10777/QGIS/commits{/sha}","git_commits_url":"https://api.github.com/repos/mj10777/QGIS/git/commits{/sha}","comments_url":"https://api.github.com/repos/mj10777/QGIS/comments{/number}","issue_comment_url":"https://api.github.com/repos/mj10777/QGIS/issues/comments{/number}","contents_url":"https://api.github.com/repos/mj10777/QGIS/contents/{+path}","compare_url":"https://api.github.com/repos/mj10777/QGIS/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mj10777/QGIS/merges","archive_url":"https://api.github.com/repos/mj10777/QGIS/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mj10777/QGIS/downloads","issues_url":"https://api.github.com/repos/mj10777/QGIS/issues{/number}","pulls_url":"https://api.github.com/repos/mj10777/QGIS/pulls{/number}","milestones_url":"https://api.github.com/repos/mj10777/QGIS/milestones{/number}","notifications_url":"https://api.github.com/repos/mj10777/QGIS/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mj10777/QGIS/labels{/name}","releases_url":"https://api.github.com/repos/mj10777/QGIS/releases{/id}","deployments_url":"https://api.github.com/repos/mj10777/QGIS/deployments","created_at":"2016-10-25T03:47:03Z","updated_at":"2016-10-25T03:47:41Z","pushed_at":"2017-11-28T09:30:13Z","git_url":"git://github.com/mj10777/QGIS.git","ssh_url":"git@github.com:mj10777/QGIS.git","clone_url":"https://github.com/mj10777/QGIS.git","svn_url":"https://github.com/mj10777/QGIS","homepage":"http://qgis.org","size":1330153,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"qgis:master","ref":"master","sha":"0f1f24a1743c1628ebd71b3130027baaef07f9d9","user":{"login":"qgis","id":483444,"avatar_url":"https://avatars3.githubusercontent.com/u/483444?v=4","gravatar_id":"","url":"https://api.github.com/users/qgis","html_url":"https://github.com/qgis","followers_url":"https://api.github.com/users/qgis/followers","following_url":"https://api.github.com/users/qgis/following{/other_user}","gists_url":"https://api.github.com/users/qgis/gists{/gist_id}","starred_url":"https://api.github.com/users/qgis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qgis/subscriptions","organizations_url":"https://api.github.com/users/qgis/orgs","repos_url":"https://api.github.com/users/qgis/repos","events_url":"https://api.github.com/users/qgis/events{/privacy}","received_events_url":"https://api.github.com/users/qgis/received_events","type":"Organization","site_admin":false},"repo":{"id":1690480,"name":"QGIS","full_name":"qgis/QGIS","owner":{"login":"qgis","id":483444,"avatar_url":"https://avatars3.githubusercontent.com/u/483444?v=4","gravatar_id":"","url":"https://api.github.com/users/qgis","html_url":"https://github.com/qgis","followers_url":"https://api.github.com/users/qgis/followers","following_url":"https://api.github.com/users/qgis/following{/other_user}","gists_url":"https://api.github.com/users/qgis/gists{/gist_id}","starred_url":"https://api.github.com/users/qgis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qgis/subscriptions","organizations_url":"https://api.github.com/users/qgis/orgs","repos_url":"https://api.github.com/users/qgis/repos","events_url":"https://api.github.com/users/qgis/events{/privacy}","received_events_url":"https://api.github.com/users/qgis/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/qgis/QGIS","description":"QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS)","fork":false,"url":"https://api.github.com/repos/qgis/QGIS","forks_url":"https://api.github.com/repos/qgis/QGIS/forks","keys_url":"https://api.github.com/repos/qgis/QGIS/keys{/key_id}","collaborators_url":"https://api.github.com/repos/qgis/QGIS/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/qgis/QGIS/teams","hooks_url":"https://api.github.com/repos/qgis/QGIS/hooks","issue_events_url":"https://api.github.com/repos/qgis/QGIS/issues/events{/number}","events_url":"https://api.github.com/repos/qgis/QGIS/events","assignees_url":"https://api.github.com/repos/qgis/QGIS/assignees{/user}","branches_url":"https://api.github.com/repos/qgis/QGIS/branches{/branch}","tags_url":"https://api.github.com/repos/qgis/QGIS/tags","blobs_url":"https://api.github.com/repos/qgis/QGIS/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/qgis/QGIS/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/qgis/QGIS/git/refs{/sha}","trees_url":"https://api.github.com/repos/qgis/QGIS/git/trees{/sha}","statuses_url":"https://api.github.com/repos/qgis/QGIS/statuses/{sha}","languages_url":"https://api.github.com/repos/qgis/QGIS/languages","stargazers_url":"https://api.github.com/repos/qgis/QGIS/stargazers","contributors_url":"https://api.github.com/repos/qgis/QGIS/contributors","subscribers_url":"https://api.github.com/repos/qgis/QGIS/subscribers","subscription_url":"https://api.github.com/repos/qgis/QGIS/subscription","commits_url":"https://api.github.com/repos/qgis/QGIS/commits{/sha}","git_commits_url":"https://api.github.com/repos/qgis/QGIS/git/commits{/sha}","comments_url":"https://api.github.com/repos/qgis/QGIS/comments{/number}","issue_comment_url":"https://api.github.com/repos/qgis/QGIS/issues/comments{/number}","contents_url":"https://api.github.com/repos/qgis/QGIS/contents/{+path}","compare_url":"https://api.github.com/repos/qgis/QGIS/compare/{base}...{head}","merges_url":"https://api.github.com/repos/qgis/QGIS/merges","archive_url":"https://api.github.com/repos/qgis/QGIS/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/qgis/QGIS/downloads","issues_url":"https://api.github.com/repos/qgis/QGIS/issues{/number}","pulls_url":"https://api.github.com/repos/qgis/QGIS/pulls{/number}","milestones_url":"https://api.github.com/repos/qgis/QGIS/milestones{/number}","notifications_url":"https://api.github.com/repos/qgis/QGIS/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/qgis/QGIS/labels{/name}","releases_url":"https://api.github.com/repos/qgis/QGIS/releases{/id}","deployments_url":"https://api.github.com/repos/qgis/QGIS/deployments","created_at":"2011-05-02T08:06:26Z","updated_at":"2017-11-28T07:03:25Z","pushed_at":"2017-11-28T08:07:55Z","git_url":"git://github.com/qgis/QGIS.git","ssh_url":"git@github.com:qgis/QGIS.git","clone_url":"https://github.com/qgis/QGIS.git","svn_url":"https://github.com/qgis/QGIS","homepage":"http://qgis.org","size":1338773,"stargazers_count":1686,"watchers_count":1686,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1143,"mirror_url":null,"archived":false,"open_issues_count":107,"forks":1143,"open_issues":107,"watchers":1686,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/qgis/QGIS/pulls/5751"},"html":{"href":"https://github.com/qgis/QGIS/pull/5751"},"issue":{"href":"https://api.github.com/repos/qgis/QGIS/issues/5751"},"comments":{"href":"https://api.github.com/repos/qgis/QGIS/issues/5751/comments"},"review_comments":{"href":"https://api.github.com/repos/qgis/QGIS/pulls/5751/comments"},"review_comment":{"href":"https://api.github.com/repos/qgis/QGIS/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/qgis/QGIS/pulls/5751/commits"},"statuses":{"href":"https://api.github.com/repos/qgis/QGIS/statuses/cfd4a2e8d7fc7be081b18809a9b9b1d0eccbe6fc"}},"author_association":"CONTRIBUTOR","merged":false,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"maintainer_can_modify":true,"commits":2,"additions":27215,"deletions":6820,"changed_files":30}}
{"actor":{"display_login":"mj10777"}}