{"action":"created","comment":{"url":"https://api.github.com/repos/irods/irods/pulls/comments/235024942","pull_request_review_id":176794304,"id":235024942,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNTAyNDk0Mg==","diff_hunk":"@@ -0,0 +1,460 @@\n+#ifndef IRODS_QUERY_HPP\n+#define IRODS_QUERY_HPP\n+\n+#ifdef RODS_SERVER\n+#include \"rsGenQuery.hpp\"\n+#include \"specificQuery.h\"\n+#include \"rsSpecificQuery.hpp\"\n+#else\n+#include \"genQuery.h\"\n+#include \"specificQuery.h\"\n+#endif\n+\n+#include \"rcMisc.h\"\n+\n+#include <algorithm>\n+\n+char *getCondFromString( char * t );\n+\n+namespace irods {\n+    namespace query_helper {\n+#ifdef RODS_SERVER\n+        typedef rsComm_t comm_type;\n+        static const std::function<\n+            int(rsComm_t*,\n+                genQueryInp_t*,\n+                genQueryOut_t**)>\n+                    gen_query_fcn{rsGenQuery};\n+        static const std::function<\n+            int(rsComm_t*,\n+                specificQueryInp_t*,\n+                genQueryOut_t**)>\n+                    spec_query_fcn{rsSpecificQuery};\n+#else\n+        typedef rcComm_t comm_type;\n+        static const std::function<\n+            int(rcComm_t*,\n+                genQueryInp_t*,\n+                genQueryOut_t**)>\n+                    gen_query_fcn{rcGenQuery};\n+        static const std::function<\n+            int(rcComm_t*,\n+                specificQueryInp_t*,\n+                genQueryOut_t**)>\n+                    spec_query_fcn{rcSpecificQuery};\n+#endif\n+    };\n+\n+    class query {\n+    public:\n+        typedef std::vector<std::string> value_type;\n+\n+        enum query_type {\n+            GENERAL = 0,\n+            SPECIFIC = 1\n+        };\n+\n+        static query_type convert_string_to_query_type(\n+                const std::string& _str) {\n+            // default option\n+            if(_str.empty()) {\n+                return GENERAL;\n+            }\n+\n+            const std::string GEN_STR{\"general\"};\n+            const std::string SPEC_STR{\"specific\"};\n+\n+            std::string lowered{_str};\n+            std::transform(\n+                lowered.begin(),\n+                lowered.end(),\n+                lowered.begin(),\n+                ::tolower);\n+\n+            if(GEN_STR == lowered) {\n+                return GENERAL;\n+            }\n+            else if(SPEC_STR == lowered) {\n+                return SPECIFIC;\n+            }\n+            else {\n+                THROW(\n+                    SYS_INVALID_INPUT_PARAM,\n+                    _str + \" - is not a query type\");\n+            }\n+        } // convert_string_to_query_type\n+\n+        class query_impl_base {\n+            public:\n+\n+            size_t size() {\n+                if(!gen_output_) {\n+                    return 0;\n+                }\n+                return gen_output_->rowCnt;\n+            }\n+\n+            int cont_idx() {\n+                return gen_output_->continueInx;\n+            }\n+\n+            int row_cnt() {\n+                return gen_output_->rowCnt;\n+            }\n+\n+            std::string query_string() {\n+                return query_string_;\n+            }\n+\n+            bool page_in_flight(const int row_idx_) {\n+                if(row_idx_ < row_cnt()) {\n+                    return true;\n+                }\n+                return false;\n+            }\n+\n+            bool query_complete() {\n+                // finished page, and out of pages\n+                if(cont_idx() <= 0) {\n+                    return true;\n+                }\n+                return false;\n+            }\n+\n+            value_type capture_results(int _row_idx) {\n+                value_type res;\n+                for(int attr_idx = 0; attr_idx < gen_output_->attriCnt; ++attr_idx) {\n+                    uint32_t offset = gen_output_->sqlResult[attr_idx].len * _row_idx;\n+                    std::string str{&gen_output_->sqlResult[attr_idx].value[offset]};\n+                    res.push_back(str);\n+                }\n+                return res;\n+            }\n+\n+            bool results_valid() {\n+                if(gen_output_) {\n+                    return (gen_output_->rowCnt > 0);\n+                }\n+                else {\n+                    return false;\n+                }\n+            }\n+\n+            virtual int fetch_page() = 0;\n+            virtual ~query_impl_base() {\n+            }\n+\n+            query_impl_base(\n+                query_helper::comm_type* _comm,\n+                const std::string&       _q) :\n+                comm_{_comm},\n+                query_string_{_q},\n+                gen_output_{} {\n+            };\n+            protected:\n+            query_helper::comm_type* comm_;\n+            const std::string& query_string_;\n+            genQueryOut_t* gen_output_;\n+        }; // class query_impl_base\n+\n+        class gen_query_impl : public query_impl_base {\n+            public:\n+            virtual ~gen_query_impl() {\n+                // Close all statements for this query\n+                gen_input_.continueInx = gen_output_->continueInx + 1;\n+                freeGenQueryOut(&gen_output_);\n+                gen_input_.maxRows = 0;\n+                while (gen_input_.continueInx > 0) {\n+                    auto err = query_helper::gen_query_fcn(\n+                                   comm_,\n+                                   &gen_input_,\n+                                   &gen_output_);\n+                    if (err < 0) {\n+                        irods::log(ERROR(err, (boost::format(\n+                                    \"[%s] - Failed to close statement with continueInx [%d]\") %\n+                                    __FUNCTION__ % gen_input_.continueInx).str()));\n+                        break;\n+                    }\n+                    gen_input_.continueInx--;\n+                }\n+            }\n+\n+            int fetch_page() {\n+                if(gen_output_) {\n+                    gen_input_.continueInx = gen_output_->continueInx;\n+                    freeGenQueryOut(&gen_output_);\n+                }\n+\n+                int ret = query_helper::gen_query_fcn(\n+                           comm_,\n+                           &gen_input_,\n+                           &gen_output_);\n+                return ret;\n+            } // fetch_page\n+\n+            gen_query_impl(\n+                query_helper::comm_type* _comm,\n+                int                      _max_rows,\n+                const std::string&       _query_string) :\n+                query_impl_base(_comm, _query_string) {\n+\n+                memset(&gen_input_, 0, sizeof(gen_input_));\n+                gen_input_.maxRows = _max_rows;\n+                const int fill_err = fillGenQueryInpFromStrCond(\n+                                         const_cast<char*>(_query_string.c_str()),\n+                                         &gen_input_);\n+                if(fill_err < 0) {\n+                    THROW(\n+                        fill_err,\n+                        boost::format(\"query fill failed for [%s]\") %\n+                        _query_string);\n+                }\n+            } // ctor\n+\n+            private:\n+            genQueryInp_t gen_input_; \n+        }; // class gen_query_impl\n+\n+        class spec_query_impl : public query_impl_base {\n+            public:\n+            virtual ~spec_query_impl() {\n+                // Close all statements for this query\n+                spec_input_.continueInx = gen_output_->continueInx + 1;\n+                freeGenQueryOut(&gen_output_);\n+                spec_input_.maxRows = 0;\n+                while (spec_input_.continueInx > 0) {\n+                    auto err = query_helper::spec_query_fcn(\n+                                   comm_,\n+                                   &spec_input_,\n+                                   &gen_output_);\n+                    if (err < 0) {\n+                        irods::log(ERROR(\n+                                    err, (boost::format(\n+                                    \"[%s] - Failed to close statement with continueInx [%d]\") %\n+                                    __FUNCTION__ % spec_input_.continueInx).str()));\n+                        break;\n+                    }\n+                    spec_input_.continueInx--;\n+                }\n+            }\n+\n+            int fetch_page() {\n+                if(gen_output_) {\n+                    spec_input_.continueInx = gen_output_->continueInx;\n+                    freeGenQueryOut(&gen_output_);\n+                }\n+\n+                int ret = query_helper::spec_query_fcn(\n+                           comm_,\n+                           &spec_input_,\n+                           &gen_output_);\n+                return ret;\n+            } // fetch_page\n+\n+            spec_query_impl(\n+                query_helper::comm_type* _comm,\n+                int                      _max_rows,\n+                const std::string&       _query_string) :\n+                query_impl_base(_comm, _query_string) {\n+\n+                memset(&spec_input_, 0, sizeof(spec_input_));\n+                spec_input_.maxRows = _max_rows;\n+                spec_input_.sql = const_cast<char*>(_query_string.c_str());\n+\n+                int spec_err = query_helper::spec_query_fcn(\n+                                   _comm,\n+                                   &spec_input_,\n+                                   &gen_output_);\n+                if(spec_err < 0) {\n+                    THROW(\n+                        spec_err,\n+                        boost::format(\"query fill failed for [%s]\") %\n+                        _query_string);\n+                }\n+            } // ctor\n+\n+            private:\n+            specificQueryInp_t spec_input_; \n+        }; // class spec_query_impl\n+\n+        class iterator {\n+            query_helper::comm_type* comm_;\n+            const std::string query_string_;\n+            uintmax_t max_rows_;//const uintmax_t max_rows_;","path":"lib/core/include/irods_query.hpp","position":283,"original_position":283,"commit_id":"d4f8e50c86ac4675cb48919d103718738d23e7cb","original_commit_id":"d4f8e50c86ac4675cb48919d103718738d23e7cb","user":{"login":"trel","id":55238,"node_id":"MDQ6VXNlcjU1MjM4","avatar_url":"https://avatars3.githubusercontent.com/u/55238?v=4","gravatar_id":"","url":"https://api.github.com/users/trel","html_url":"https://github.com/trel","followers_url":"https://api.github.com/users/trel/followers","following_url":"https://api.github.com/users/trel/following{/other_user}","gists_url":"https://api.github.com/users/trel/gists{/gist_id}","starred_url":"https://api.github.com/users/trel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/trel/subscriptions","organizations_url":"https://api.github.com/users/trel/orgs","repos_url":"https://api.github.com/users/trel/repos","events_url":"https://api.github.com/users/trel/events{/privacy}","received_events_url":"https://api.github.com/users/trel/received_events","type":"User","site_admin":false},"body":"const?  if not, remove comment...","created_at":"2018-11-20T14:34:06Z","updated_at":"2018-11-20T14:34:38Z","html_url":"https://github.com/irods/irods/pull/4177#discussion_r235024942","pull_request_url":"https://api.github.com/repos/irods/irods/pulls/4177","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/irods/irods/pulls/comments/235024942"},"html":{"href":"https://github.com/irods/irods/pull/4177#discussion_r235024942"},"pull_request":{"href":"https://api.github.com/repos/irods/irods/pulls/4177"}}},"pull_request":{"url":"https://api.github.com/repos/irods/irods/pulls/4177","id":232323612,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMyMzIzNjEy","html_url":"https://github.com/irods/irods/pull/4177","diff_url":"https://github.com/irods/irods/pull/4177.diff","patch_url":"https://github.com/irods/irods/pull/4177.patch","issue_url":"https://api.github.com/repos/irods/irods/issues/4177","number":4177,"state":"open","locked":false,"title":"[#4171] Copied irods_query.hpp file from irods/irods_capability_storage_tiering repo.","user":{"login":"korydraughn","id":5543107,"node_id":"MDQ6VXNlcjU1NDMxMDc=","avatar_url":"https://avatars2.githubusercontent.com/u/5543107?v=4","gravatar_id":"","url":"https://api.github.com/users/korydraughn","html_url":"https://github.com/korydraughn","followers_url":"https://api.github.com/users/korydraughn/followers","following_url":"https://api.github.com/users/korydraughn/following{/other_user}","gists_url":"https://api.github.com/users/korydraughn/gists{/gist_id}","starred_url":"https://api.github.com/users/korydraughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/korydraughn/subscriptions","organizations_url":"https://api.github.com/users/korydraughn/orgs","repos_url":"https://api.github.com/users/korydraughn/repos","events_url":"https://api.github.com/users/korydraughn/events{/privacy}","received_events_url":"https://api.github.com/users/korydraughn/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-11-20T13:49:28Z","updated_at":"2018-11-20T14:34:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"50e0b02a03a9ba38cbb2dc623d84b2d4567fe4e0","assignee":null,"assignees":[],"requested_reviewers":[{"login":"jasoncoposky","id":1790140,"node_id":"MDQ6VXNlcjE3OTAxNDA=","avatar_url":"https://avatars3.githubusercontent.com/u/1790140?v=4","gravatar_id":"","url":"https://api.github.com/users/jasoncoposky","html_url":"https://github.com/jasoncoposky","followers_url":"https://api.github.com/users/jasoncoposky/followers","following_url":"https://api.github.com/users/jasoncoposky/following{/other_user}","gists_url":"https://api.github.com/users/jasoncoposky/gists{/gist_id}","starred_url":"https://api.github.com/users/jasoncoposky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jasoncoposky/subscriptions","organizations_url":"https://api.github.com/users/jasoncoposky/orgs","repos_url":"https://api.github.com/users/jasoncoposky/repos","events_url":"https://api.github.com/users/jasoncoposky/events{/privacy}","received_events_url":"https://api.github.com/users/jasoncoposky/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/irods/irods/pulls/4177/commits","review_comments_url":"https://api.github.com/repos/irods/irods/pulls/4177/comments","review_comment_url":"https://api.github.com/repos/irods/irods/pulls/comments{/number}","comments_url":"https://api.github.com/repos/irods/irods/issues/4177/comments","statuses_url":"https://api.github.com/repos/irods/irods/statuses/d4f8e50c86ac4675cb48919d103718738d23e7cb","head":{"label":"korydraughn:issue_4171_42s","ref":"issue_4171_42s","sha":"d4f8e50c86ac4675cb48919d103718738d23e7cb","user":{"login":"korydraughn","id":5543107,"node_id":"MDQ6VXNlcjU1NDMxMDc=","avatar_url":"https://avatars2.githubusercontent.com/u/5543107?v=4","gravatar_id":"","url":"https://api.github.com/users/korydraughn","html_url":"https://github.com/korydraughn","followers_url":"https://api.github.com/users/korydraughn/followers","following_url":"https://api.github.com/users/korydraughn/following{/other_user}","gists_url":"https://api.github.com/users/korydraughn/gists{/gist_id}","starred_url":"https://api.github.com/users/korydraughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/korydraughn/subscriptions","organizations_url":"https://api.github.com/users/korydraughn/orgs","repos_url":"https://api.github.com/users/korydraughn/repos","events_url":"https://api.github.com/users/korydraughn/events{/privacy}","received_events_url":"https://api.github.com/users/korydraughn/received_events","type":"User","site_admin":false},"repo":{"id":123980098,"node_id":"MDEwOlJlcG9zaXRvcnkxMjM5ODAwOTg=","name":"irods","full_name":"korydraughn/irods","private":false,"owner":{"login":"korydraughn","id":5543107,"node_id":"MDQ6VXNlcjU1NDMxMDc=","avatar_url":"https://avatars2.githubusercontent.com/u/5543107?v=4","gravatar_id":"","url":"https://api.github.com/users/korydraughn","html_url":"https://github.com/korydraughn","followers_url":"https://api.github.com/users/korydraughn/followers","following_url":"https://api.github.com/users/korydraughn/following{/other_user}","gists_url":"https://api.github.com/users/korydraughn/gists{/gist_id}","starred_url":"https://api.github.com/users/korydraughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/korydraughn/subscriptions","organizations_url":"https://api.github.com/users/korydraughn/orgs","repos_url":"https://api.github.com/users/korydraughn/repos","events_url":"https://api.github.com/users/korydraughn/events{/privacy}","received_events_url":"https://api.github.com/users/korydraughn/received_events","type":"User","site_admin":false},"html_url":"https://github.com/korydraughn/irods","description":"Open Source Data Management Software","fork":true,"url":"https://api.github.com/repos/korydraughn/irods","forks_url":"https://api.github.com/repos/korydraughn/irods/forks","keys_url":"https://api.github.com/repos/korydraughn/irods/keys{/key_id}","collaborators_url":"https://api.github.com/repos/korydraughn/irods/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/korydraughn/irods/teams","hooks_url":"https://api.github.com/repos/korydraughn/irods/hooks","issue_events_url":"https://api.github.com/repos/korydraughn/irods/issues/events{/number}","events_url":"https://api.github.com/repos/korydraughn/irods/events","assignees_url":"https://api.github.com/repos/korydraughn/irods/assignees{/user}","branches_url":"https://api.github.com/repos/korydraughn/irods/branches{/branch}","tags_url":"https://api.github.com/repos/korydraughn/irods/tags","blobs_url":"https://api.github.com/repos/korydraughn/irods/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/korydraughn/irods/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/korydraughn/irods/git/refs{/sha}","trees_url":"https://api.github.com/repos/korydraughn/irods/git/trees{/sha}","statuses_url":"https://api.github.com/repos/korydraughn/irods/statuses/{sha}","languages_url":"https://api.github.com/repos/korydraughn/irods/languages","stargazers_url":"https://api.github.com/repos/korydraughn/irods/stargazers","contributors_url":"https://api.github.com/repos/korydraughn/irods/contributors","subscribers_url":"https://api.github.com/repos/korydraughn/irods/subscribers","subscription_url":"https://api.github.com/repos/korydraughn/irods/subscription","commits_url":"https://api.github.com/repos/korydraughn/irods/commits{/sha}","git_commits_url":"https://api.github.com/repos/korydraughn/irods/git/commits{/sha}","comments_url":"https://api.github.com/repos/korydraughn/irods/comments{/number}","issue_comment_url":"https://api.github.com/repos/korydraughn/irods/issues/comments{/number}","contents_url":"https://api.github.com/repos/korydraughn/irods/contents/{+path}","compare_url":"https://api.github.com/repos/korydraughn/irods/compare/{base}...{head}","merges_url":"https://api.github.com/repos/korydraughn/irods/merges","archive_url":"https://api.github.com/repos/korydraughn/irods/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/korydraughn/irods/downloads","issues_url":"https://api.github.com/repos/korydraughn/irods/issues{/number}","pulls_url":"https://api.github.com/repos/korydraughn/irods/pulls{/number}","milestones_url":"https://api.github.com/repos/korydraughn/irods/milestones{/number}","notifications_url":"https://api.github.com/repos/korydraughn/irods/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/korydraughn/irods/labels{/name}","releases_url":"https://api.github.com/repos/korydraughn/irods/releases{/id}","deployments_url":"https://api.github.com/repos/korydraughn/irods/deployments","created_at":"2018-03-05T21:18:35Z","updated_at":"2018-11-19T14:11:41Z","pushed_at":"2018-11-20T14:00:23Z","git_url":"git://github.com/korydraughn/irods.git","ssh_url":"git@github.com:korydraughn/irods.git","clone_url":"https://github.com/korydraughn/irods.git","svn_url":"https://github.com/korydraughn/irods","homepage":"https://irods.org","size":39753,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"irods:4-2-stable","ref":"4-2-stable","sha":"ebb46540b8044c3da91c3a5cc1e2cd9f926bb785","user":{"login":"irods","id":1790166,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3OTAxNjY=","avatar_url":"https://avatars0.githubusercontent.com/u/1790166?v=4","gravatar_id":"","url":"https://api.github.com/users/irods","html_url":"https://github.com/irods","followers_url":"https://api.github.com/users/irods/followers","following_url":"https://api.github.com/users/irods/following{/other_user}","gists_url":"https://api.github.com/users/irods/gists{/gist_id}","starred_url":"https://api.github.com/users/irods/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/irods/subscriptions","organizations_url":"https://api.github.com/users/irods/orgs","repos_url":"https://api.github.com/users/irods/repos","events_url":"https://api.github.com/users/irods/events{/privacy}","received_events_url":"https://api.github.com/users/irods/received_events","type":"Organization","site_admin":false},"repo":{"id":14724975,"node_id":"MDEwOlJlcG9zaXRvcnkxNDcyNDk3NQ==","name":"irods","full_name":"irods/irods","private":false,"owner":{"login":"irods","id":1790166,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3OTAxNjY=","avatar_url":"https://avatars0.githubusercontent.com/u/1790166?v=4","gravatar_id":"","url":"https://api.github.com/users/irods","html_url":"https://github.com/irods","followers_url":"https://api.github.com/users/irods/followers","following_url":"https://api.github.com/users/irods/following{/other_user}","gists_url":"https://api.github.com/users/irods/gists{/gist_id}","starred_url":"https://api.github.com/users/irods/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/irods/subscriptions","organizations_url":"https://api.github.com/users/irods/orgs","repos_url":"https://api.github.com/users/irods/repos","events_url":"https://api.github.com/users/irods/events{/privacy}","received_events_url":"https://api.github.com/users/irods/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/irods/irods","description":"Open Source Data Management Software","fork":false,"url":"https://api.github.com/repos/irods/irods","forks_url":"https://api.github.com/repos/irods/irods/forks","keys_url":"https://api.github.com/repos/irods/irods/keys{/key_id}","collaborators_url":"https://api.github.com/repos/irods/irods/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/irods/irods/teams","hooks_url":"https://api.github.com/repos/irods/irods/hooks","issue_events_url":"https://api.github.com/repos/irods/irods/issues/events{/number}","events_url":"https://api.github.com/repos/irods/irods/events","assignees_url":"https://api.github.com/repos/irods/irods/assignees{/user}","branches_url":"https://api.github.com/repos/irods/irods/branches{/branch}","tags_url":"https://api.github.com/repos/irods/irods/tags","blobs_url":"https://api.github.com/repos/irods/irods/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/irods/irods/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/irods/irods/git/refs{/sha}","trees_url":"https://api.github.com/repos/irods/irods/git/trees{/sha}","statuses_url":"https://api.github.com/repos/irods/irods/statuses/{sha}","languages_url":"https://api.github.com/repos/irods/irods/languages","stargazers_url":"https://api.github.com/repos/irods/irods/stargazers","contributors_url":"https://api.github.com/repos/irods/irods/contributors","subscribers_url":"https://api.github.com/repos/irods/irods/subscribers","subscription_url":"https://api.github.com/repos/irods/irods/subscription","commits_url":"https://api.github.com/repos/irods/irods/commits{/sha}","git_commits_url":"https://api.github.com/repos/irods/irods/git/commits{/sha}","comments_url":"https://api.github.com/repos/irods/irods/comments{/number}","issue_comment_url":"https://api.github.com/repos/irods/irods/issues/comments{/number}","contents_url":"https://api.github.com/repos/irods/irods/contents/{+path}","compare_url":"https://api.github.com/repos/irods/irods/compare/{base}...{head}","merges_url":"https://api.github.com/repos/irods/irods/merges","archive_url":"https://api.github.com/repos/irods/irods/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/irods/irods/downloads","issues_url":"https://api.github.com/repos/irods/irods/issues{/number}","pulls_url":"https://api.github.com/repos/irods/irods/pulls{/number}","milestones_url":"https://api.github.com/repos/irods/irods/milestones{/number}","notifications_url":"https://api.github.com/repos/irods/irods/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/irods/irods/labels{/name}","releases_url":"https://api.github.com/repos/irods/irods/releases{/id}","deployments_url":"https://api.github.com/repos/irods/irods/deployments","created_at":"2013-11-26T18:10:18Z","updated_at":"2018-11-18T02:52:39Z","pushed_at":"2018-11-20T14:00:24Z","git_url":"git://github.com/irods/irods.git","ssh_url":"git@github.com:irods/irods.git","clone_url":"https://github.com/irods/irods.git","svn_url":"https://github.com/irods/irods","homepage":"https://irods.org","size":38922,"stargazers_count":238,"watchers_count":238,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":79,"mirror_url":null,"archived":false,"open_issues_count":568,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":79,"open_issues":568,"watchers":238,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/irods/irods/pulls/4177"},"html":{"href":"https://github.com/irods/irods/pull/4177"},"issue":{"href":"https://api.github.com/repos/irods/irods/issues/4177"},"comments":{"href":"https://api.github.com/repos/irods/irods/issues/4177/comments"},"review_comments":{"href":"https://api.github.com/repos/irods/irods/pulls/4177/comments"},"review_comment":{"href":"https://api.github.com/repos/irods/irods/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/irods/irods/pulls/4177/commits"},"statuses":{"href":"https://api.github.com/repos/irods/irods/statuses/d4f8e50c86ac4675cb48919d103718738d23e7cb"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"trel"}}