Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
code_snippets.html733 linesDownload Raw Back to html
1
2
3<!DOCTYPE html>
4
5<html lang="en" data-content_root="./">
6  <head>
7    <meta charset="utf-8" />
8    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
9
10    <title>Code Snippets &#8212; pgAdmin 4 8.6 documentation</title>
11    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
12    <link rel="stylesheet" type="text/css" href="_static/style.css?v=d36593c3" />
13    
14    <script src="_static/documentation_options.js?v=d4c83366"></script>
15    <script src="_static/doctools.js?v=9a2dae69"></script>
16    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
17    
18    <script src="_static/sidebar.js"></script>
19    
20    <link rel="index" title="Index" href="genindex.html" />
21    <link rel="search" title="Search" href="search.html" />
22    <link rel="next" title="Code Review Notes" href="code_review.html" />
23    <link rel="prev" title="Coding Standards" href="coding_standards.html" /> 
24  </head><body>
25    <div class="related" role="navigation" aria-label="related navigation">
26      <h3>Navigation</h3>
27      <ul>
28        <li class="right" style="margin-right: 10px">
29          <a href="genindex.html" title="General Index"
30             accesskey="I">index</a></li>
31        <li class="right" >
32          <a href="code_review.html" title="Code Review Notes"
33             accesskey="N">next</a> |</li>
34        <li class="right" >
35          <a href="coding_standards.html" title="Coding Standards"
36             accesskey="P">previous</a> |</li>
37        <li class="nav-item nav-item-0"><a href="index.html">pgAdmin 4 8.6 documentation</a> &#187;</li>
38          <li class="nav-item nav-item-1"><a href="contributions.html" accesskey="U">pgAdmin Project Contributions</a> &#187;</li>
39        <li class="nav-item nav-item-this"><a href="">Code Snippets</a></li> 
40      </ul>
41    </div>  
42
43    <div class="document">
44      <div class="documentwrapper">
45        <div class="bodywrapper">
46          <div class="body" role="main">
47            
48  <section id="code-snippets">
49<h1>Code Snippets<a class="headerlink" href="#code-snippets" title="Link to this heading">¶</a></h1>
50<p>This document contains code for some of the important classes, listed as
51below:</p>
52<ul class="simple">
53<li><p><a class="reference internal" href="#pgadminmodule">PgAdminModule</a></p></li>
54<li><p><a class="reference internal" href="#nodeview">NodeView</a></p></li>
55<li><p><a class="reference internal" href="#basedriver">BaseDriver</a></p></li>
56<li><p><a class="reference internal" href="#baseconnection">BaseConnection</a></p></li>
57</ul>
58<section id="pgadminmodule">
59<span id="id1"></span><h2>PgAdminModule<a class="headerlink" href="#pgadminmodule" title="Link to this heading">¶</a></h2>
60<p>PgAdminModule is inherited from Flask.Blueprint module.
61This module defines a set of methods, properties and attributes,
62that every module should implement.</p>
63<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">PgAdminModule</span><span class="p">(</span><span class="n">Blueprint</span><span class="p">):</span>
64<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
65<span class="sd">    Base class for every PgAdmin Module.</span>
66
67<span class="sd">    This class defines a set of method and attributes that</span>
68<span class="sd">    every module should implement.</span>
69<span class="sd">    &quot;&quot;&quot;</span>
70
71    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">import_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
72        <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;url_prefix&#39;</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="n">name</span><span class="p">)</span>
73        <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;template_folder&#39;</span><span class="p">,</span> <span class="s1">&#39;templates&#39;</span><span class="p">)</span>
74        <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;static_folder&#39;</span><span class="p">,</span> <span class="s1">&#39;static&#39;</span><span class="p">)</span>
75        <span class="bp">self</span><span class="o">.</span><span class="n">submodules</span> <span class="o">=</span> <span class="p">[]</span>
76        <span class="bp">self</span><span class="o">.</span><span class="n">parentmodules</span> <span class="o">=</span> <span class="p">[]</span>
77
78        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">import_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
79
80    <span class="k">def</span> <span class="nf">register_preferences</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
81        <span class="c1"># To be implemented by child classes</span>
82        <span class="k">pass</span>
83
84    <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">app</span><span class="p">,</span> <span class="n">options</span><span class="p">):</span>
85<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
86<span class="sd">        Override the default register function to automagically register</span>
87<span class="sd">        sub-modules at once.</span>
88<span class="sd">        &quot;&quot;&quot;</span>
89
90        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
91
92        <span class="k">def</span> <span class="nf">create_module_preference</span><span class="p">():</span>
93            <span class="c1"># Create preference for each module by default</span>
94            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;LABEL&#39;</span><span class="p">):</span>
95                <span class="bp">self</span><span class="o">.</span><span class="n">preference</span> <span class="o">=</span> <span class="n">Preferences</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">LABEL</span><span class="p">)</span>
96            <span class="k">else</span><span class="p">:</span>
97                <span class="bp">self</span><span class="o">.</span><span class="n">preference</span> <span class="o">=</span> <span class="n">Preferences</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
98
99            <span class="bp">self</span><span class="o">.</span><span class="n">register_preferences</span><span class="p">()</span>
100
101        <span class="c1"># Create and register the module preference object and preferences for</span>
102        <span class="c1"># it just before starting app</span>
103        <span class="n">app</span><span class="o">.</span><span class="n">register_before_app_start</span><span class="p">(</span><span class="n">create_module_preference</span><span class="p">)</span>
104
105        <span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">submodules</span><span class="p">:</span>
106            <span class="n">module</span><span class="o">.</span><span class="n">parentmodules</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
107            <span class="k">if</span> <span class="n">app</span><span class="o">.</span><span class="n">blueprints</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
108                <span class="n">app</span><span class="o">.</span><span class="n">register_blueprint</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
109                <span class="n">app</span><span class="o">.</span><span class="n">register_logout_hook</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
110
111    <span class="k">def</span> <span class="nf">get_own_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
112<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
113<span class="sd">        Returns:</span>
114<span class="sd">            dict: the i18n messages used by this module, not including any</span>
115<span class="sd">                messages needed by the submodules.</span>
116<span class="sd">        &quot;&quot;&quot;</span>
117        <span class="k">return</span> <span class="nb">dict</span><span class="p">()</span>
118
119    <span class="k">def</span> <span class="nf">get_own_menuitems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
120<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
121<span class="sd">        Returns:</span>
122<span class="sd">            dict: the menuitems for this module, not including</span>
123<span class="sd">                any needed from the submodules.</span>
124<span class="sd">        &quot;&quot;&quot;</span>
125        <span class="k">return</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
126
127    <span class="k">def</span> <span class="nf">get_exposed_url_endpoints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
128<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
129<span class="sd">        Returns:</span>
130<span class="sd">            list: a list of url endpoints exposed to the client.</span>
131<span class="sd">        &quot;&quot;&quot;</span>
132        <span class="k">return</span> <span class="p">[]</span>
133
134    <span class="nd">@property</span>
135    <span class="k">def</span> <span class="nf">messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
136        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_own_messages</span><span class="p">()</span>
137
138        <span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">submodules</span><span class="p">:</span>
139            <span class="n">res</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">messages</span><span class="p">)</span>
140        <span class="k">return</span> <span class="n">res</span>
141
142    <span class="nd">@property</span>
143    <span class="k">def</span> <span class="nf">menu_items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
144        <span class="n">menu_items</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_own_menuitems</span><span class="p">()</span>
145        <span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">submodules</span><span class="p">:</span>
146            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">module</span><span class="o">.</span><span class="n">menu_items</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
147                <span class="n">menu_items</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
148        <span class="n">menu_items</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">attrgetter</span><span class="p">(</span><span class="s1">&#39;priority&#39;</span><span class="p">)))</span>
149                          <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">menu_items</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
150        <span class="k">return</span> <span class="n">menu_items</span>
151
152    <span class="nd">@property</span>
153    <span class="k">def</span> <span class="nf">exposed_endpoints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
154        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exposed_url_endpoints</span><span class="p">()</span>
155
156        <span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">submodules</span><span class="p">:</span>
157            <span class="n">res</span> <span class="o">+=</span> <span class="n">module</span><span class="o">.</span><span class="n">exposed_endpoints</span>
158
159        <span class="k">return</span> <span class="n">res</span>
160</pre></div>
161</div>
162</section>
163<section id="nodeview">
164<span id="id2"></span><h2>NodeView<a class="headerlink" href="#nodeview" title="Link to this heading">¶</a></h2>
165<p>The NodeView class exposes basic REST APIs for different operations used by
166the pgAdmin Browser. The basic idea has been taken from <a class="reference external" href="http://flask.pocoo.org/docs/1.0/api/#flask.views.MethodView">Flask’s MethodView</a> class. Because
167we need a lot more operations (not, just CRUD), we can not use it directly.</p>
168<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">NodeView</span><span class="p">(</span><span class="n">View</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="nb">type</span><span class="p">(</span><span class="n">MethodView</span><span class="p">)):</span>
169<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
170<span class="sd">    A PostgreSQL Object has so many operaions/functions apart from CRUD</span>
171<span class="sd">    (Create, Read, Update, Delete):</span>
172<span class="sd">    i.e.</span>
173<span class="sd">    - Reversed Engineered SQL</span>
174<span class="sd">    - Modified Query for parameter while editing object attributes</span>
175<span class="sd">      i.e. ALTER TABLE ...</span>
176<span class="sd">    - Statistics of the objects</span>
177<span class="sd">    - List of dependents</span>
178<span class="sd">    - List of dependencies</span>
179<span class="sd">    - Listing of the children object types for the certain node</span>
180<span class="sd">      It will used by the browser tree to get the children nodes</span>
181
182<span class="sd">    This class can be inherited to achieve the diffrent routes for each of the</span>
183<span class="sd">    object types/collections.</span>
184
185<span class="sd">       OPERATION   |             URL             | HTTP Method |    Method</span>
186<span class="sd">    ---------------+-----------------------------+-------------+--------------</span>
187<span class="sd">    List           | /obj/[Parent URL]/          | GET         | list</span>
188<span class="sd">    Properties     | /obj/[Parent URL]/id        | GET         | properties</span>
189<span class="sd">    Create         | /obj/[Parent URL]/          | POST        | create</span>
190<span class="sd">    Delete         | /obj/[Parent URL]/id        | DELETE      | delete</span>
191<span class="sd">    Update         | /obj/[Parent URL]/id        | PUT         | update</span>
192
193<span class="sd">    SQL (Reversed  | /sql/[Parent URL]/id        | GET         | sql</span>
194<span class="sd">    Engineering)   |</span>
195<span class="sd">    SQL (Modified  | /msql/[Parent URL]/id       | GET         | modified_sql</span>
196<span class="sd">    Properties)    |</span>
197
198<span class="sd">    Statistics     | /stats/[Parent URL]/id      | GET         | statistics</span>
199<span class="sd">    Dependencies   | /dependency/[Parent URL]/id | GET         | dependencies</span>
200<span class="sd">    Dependents     | /dependent/[Parent URL]/id  | GET         | dependents</span>
201
202<span class="sd">    Nodes          | /nodes/[Parent URL]/        | GET         | nodes</span>
203<span class="sd">    Current Node   | /nodes/[Parent URL]/id      | GET         | node</span>
204
205<span class="sd">    Children       | /children/[Parent URL]/id   | GET         | children</span>
206
207<span class="sd">    NOTE:</span>
208<span class="sd">    Parent URL can be seen as the path to identify the particular node.</span>
209
210<span class="sd">    i.e.</span>
211<span class="sd">    In order to identify the TABLE object, we need server -&gt; database -&gt; schema</span>
212<span class="sd">    information.</span>
213<span class="sd">    &quot;&quot;&quot;</span>
214    <span class="n">operations</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">({</span>
215        <span class="s1">&#39;obj&#39;</span><span class="p">:</span> <span class="p">[</span>
216            <span class="p">{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;properties&#39;</span><span class="p">,</span> <span class="s1">&#39;delete&#39;</span><span class="p">:</span> <span class="s1">&#39;delete&#39;</span><span class="p">,</span> <span class="s1">&#39;put&#39;</span><span class="p">:</span> <span class="s1">&#39;update&#39;</span><span class="p">},</span>
217            <span class="p">{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;list&#39;</span><span class="p">,</span> <span class="s1">&#39;post&#39;</span><span class="p">:</span> <span class="s1">&#39;create&#39;</span><span class="p">}</span>
218        <span class="p">],</span>
219        <span class="s1">&#39;nodes&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;node&#39;</span><span class="p">},</span> <span class="p">{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;nodes&#39;</span><span class="p">}],</span>
220        <span class="s1">&#39;sql&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;sql&#39;</span><span class="p">}],</span>
221        <span class="s1">&#39;msql&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;modified_sql&#39;</span><span class="p">}],</span>
222        <span class="s1">&#39;stats&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;statistics&#39;</span><span class="p">}],</span>
223        <span class="s1">&#39;dependency&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;dependencies&#39;</span><span class="p">}],</span>
224        <span class="s1">&#39;dependent&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;dependents&#39;</span><span class="p">}],</span>
225        <span class="s1">&#39;children&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;get&#39;</span><span class="p">:</span> <span class="s1">&#39;children&#39;</span><span class="p">}]</span>
226    <span class="p">})</span>
227
228    <span class="nd">@classmethod</span>
229    <span class="k">def</span> <span class="nf">generate_ops</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
230        <span class="n">cmds</span> <span class="o">=</span> <span class="p">[]</span>
231        <span class="k">for</span> <span class="n">op</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">operations</span><span class="p">:</span>
232            <span class="n">idx</span> <span class="o">=</span> <span class="mi">0</span>
233            <span class="k">for</span> <span class="n">ops</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="n">op</span><span class="p">]:</span>
234                <span class="n">meths</span> <span class="o">=</span> <span class="p">[]</span>
235                <span class="k">for</span> <span class="n">meth</span> <span class="ow">in</span> <span class="n">ops</span><span class="p">:</span>
236                    <span class="n">meths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">meth</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span>
237                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">meths</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
238                    <span class="n">cmds</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
239                        <span class="s1">&#39;cmd&#39;</span><span class="p">:</span> <span class="n">op</span><span class="p">,</span> <span class="s1">&#39;req&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">idx</span> <span class="o">==</span> <span class="mi">0</span><span class="p">),</span>
240                        <span class="s1">&#39;with_id&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">idx</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">),</span> <span class="s1">&#39;methods&#39;</span><span class="p">:</span> <span class="n">meths</span>
241                    <span class="p">})</span>
242                <span class="n">idx</span> <span class="o">+=</span> <span class="mi">1</span>
243        <span class="k">return</span> <span class="n">cmds</span>
244
245    <span class="c1"># Inherited class needs to modify these parameters</span>
246    <span class="n">node_type</span> <span class="o">=</span> <span class="kc">None</span>
247    <span class="c1"># Inherited class needs to modify these parameters</span>
248    <span class="n">node_label</span> <span class="o">=</span> <span class="kc">None</span>
249    <span class="c1"># This must be an array object with attributes (type and id)</span>
250    <span class="n">parent_ids</span> <span class="o">=</span> <span class="p">[]</span>
251    <span class="c1"># This must be an array object with attributes (type and id)</span>
252    <span class="n">ids</span> <span class="o">=</span> <span class="p">[]</span>
253
254    <span class="nd">@classmethod</span>
255    <span class="k">def</span> <span class="nf">get_node_urls</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
256        <span class="k">assert</span> <span class="bp">cls</span><span class="o">.</span><span class="n">node_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">,</span> \
257            <span class="s2">&quot;Please set the node_type for this class (</span><span class="si">{0}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
258                <span class="nb">str</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
259        <span class="n">common_url</span> <span class="o">=</span> <span class="s1">&#39;/&#39;</span>
260        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">parent_ids</span><span class="p">:</span>
261            <span class="n">common_url</span> <span class="o">+=</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1">&gt;/&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]),</span> <span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]))</span>
262
263        <span class="n">id_url</span> <span class="o">=</span> <span class="kc">None</span>
264        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">ids</span><span class="p">:</span>
265            <span class="n">id_url</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">&lt;</span><span class="si">{1}</span><span class="s1">:</span><span class="si">{2}</span><span class="s1">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
266                <span class="n">common_url</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">id_url</span> <span class="k">else</span> <span class="n">id_url</span><span class="p">,</span>
267                <span class="n">p</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
268
269        <span class="k">return</span> <span class="n">id_url</span><span class="p">,</span> <span class="n">common_url</span>
270
271    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
272        <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">]</span>
273
274    <span class="c1"># Check the existance of all the required arguments from parent_ids</span>
275    <span class="c1"># and return combination of has parent arguments, and has id arguments</span>
276    <span class="k">def</span> <span class="nf">check_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
277        <span class="n">has_id</span> <span class="o">=</span> <span class="n">has_args</span> <span class="o">=</span> <span class="kc">True</span>
278        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent_ids</span><span class="p">:</span>
279            <span class="k">if</span> <span class="n">p</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
280                <span class="n">has_args</span> <span class="o">=</span> <span class="kc">False</span>
281                <span class="k">break</span>
282
283        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">:</span>
284            <span class="k">if</span> <span class="n">p</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
285                <span class="n">has_id</span> <span class="o">=</span> <span class="kc">False</span>
286                <span class="k">break</span>
287
288        <span class="k">return</span> <span class="n">has_args</span><span class="p">,</span> <span class="n">has_id</span> <span class="ow">and</span> <span class="n">has_args</span>
289
290    <span class="k">def</span> <span class="nf">dispatch_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
291        <span class="n">http_method</span> <span class="o">=</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
292        <span class="k">if</span> <span class="n">http_method</span> <span class="o">==</span> <span class="s1">&#39;head&#39;</span><span class="p">:</span>
293            <span class="n">http_method</span> <span class="o">=</span> <span class="s1">&#39;get&#39;</span>
294
295        <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">,</span> \
296            <span class="s1">&#39;Unimplemented command (</span><span class="si">{0}</span><span class="s1">) for </span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
297                <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">,</span>
298                <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
299            <span class="p">)</span>
300
301        <span class="n">has_args</span><span class="p">,</span> <span class="n">has_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_args</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
302
303        <span class="k">assert</span> <span class="p">(</span>
304            <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span> <span class="ow">and</span>
305            <span class="p">(</span><span class="n">has_id</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">])</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span>
306             <span class="n">http_method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="ow">or</span>
307            <span class="p">(</span><span class="ow">not</span> <span class="n">has_id</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">])</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span>
308             <span class="n">http_method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="ow">or</span>
309            <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">])</span> <span class="o">&gt;</span> <span class="mi">2</span> <span class="ow">and</span>
310             <span class="n">http_method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">2</span><span class="p">])</span>
311        <span class="p">),</span> \
312            <span class="s1">&#39;Unimplemented method (</span><span class="si">{0}</span><span class="s1">) for command (</span><span class="si">{1}</span><span class="s1">), which </span><span class="si">{2}</span><span class="s1"> &#39;</span> \
313            <span class="s1">&#39;an id&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">http_method</span><span class="p">,</span>
314                           <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">,</span>
315                           <span class="s1">&#39;requires&#39;</span> <span class="k">if</span> <span class="n">has_id</span> <span class="k">else</span> <span class="s1">&#39;does not require&#39;</span><span class="p">)</span>
316        <span class="n">meth</span> <span class="o">=</span> <span class="kc">None</span>
317        <span class="k">if</span> <span class="n">has_id</span><span class="p">:</span>
318            <span class="n">meth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">http_method</span><span class="p">]</span>
319        <span class="k">elif</span> <span class="n">has_args</span> <span class="ow">and</span> <span class="n">http_method</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">1</span><span class="p">]:</span>
320            <span class="n">meth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">http_method</span><span class="p">]</span>
321        <span class="k">else</span><span class="p">:</span>
322            <span class="n">meth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="p">][</span><span class="mi">2</span><span class="p">][</span><span class="n">http_method</span><span class="p">]</span>
323
324        <span class="n">method</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">meth</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
325
326        <span class="k">if</span> <span class="n">method</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
327            <span class="k">return</span> <span class="n">make_json_response</span><span class="p">(</span>
328                <span class="n">status</span><span class="o">=</span><span class="mi">406</span><span class="p">,</span>
329                <span class="n">success</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
330                <span class="n">errormsg</span><span class="o">=</span><span class="n">gettext</span><span class="p">(</span>
331                    <span class="s1">&#39;Unimplemented method (</span><span class="si">{0}</span><span class="s1">) for this url (</span><span class="si">{1}</span><span class="s1">)&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
332                        <span class="n">meth</span><span class="p">,</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">path</span>
333                <span class="p">)</span>
334            <span class="p">)</span>
335
336        <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
337
338    <span class="nd">@classmethod</span>
339    <span class="k">def</span> <span class="nf">register_node_view</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">blueprint</span><span class="p">):</span>
340        <span class="bp">cls</span><span class="o">.</span><span class="n">blueprint</span> <span class="o">=</span> <span class="n">blueprint</span>
341        <span class="n">id_url</span><span class="p">,</span> <span class="n">url</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">get_node_urls</span><span class="p">()</span>
342
343        <span class="n">commands</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">generate_ops</span><span class="p">()</span>
344
345        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">commands</span><span class="p">:</span>
346            <span class="n">cmd</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span>
347            <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s1">&#39;with_id&#39;</span><span class="p">]:</span>
348                <span class="n">blueprint</span><span class="o">.</span><span class="n">add_url_rule</span><span class="p">(</span>
349                    <span class="s1">&#39;/</span><span class="si">{0}{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
350                        <span class="n">c</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">],</span> <span class="n">id_url</span> <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s1">&#39;req&#39;</span><span class="p">]</span> <span class="k">else</span> <span class="n">url</span>
351                    <span class="p">),</span>
352                    <span class="n">view_func</span><span class="o">=</span><span class="bp">cls</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span>
353                        <span class="s1">&#39;</span><span class="si">{0}{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
354                            <span class="n">cmd</span><span class="p">,</span> <span class="s1">&#39;_id&#39;</span> <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s1">&#39;req&#39;</span><span class="p">]</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
355                        <span class="p">),</span>
356                        <span class="n">cmd</span><span class="o">=</span><span class="n">c</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">]</span>
357                    <span class="p">),</span>
358                    <span class="n">methods</span><span class="o">=</span><span class="n">c</span><span class="p">[</span><span class="s1">&#39;methods&#39;</span><span class="p">]</span>
359                <span class="p">)</span>
360            <span class="k">else</span><span class="p">:</span>
361                <span class="n">blueprint</span><span class="o">.</span><span class="n">add_url_rule</span><span class="p">(</span>
362                    <span class="s1">&#39;/</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">]),</span>
363                    <span class="n">view_func</span><span class="o">=</span><span class="bp">cls</span><span class="o">.</span><span class="n">as_view</span><span class="p">(</span>
364                        <span class="n">cmd</span><span class="p">,</span> <span class="n">cmd</span><span class="o">=</span><span class="n">c</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">]</span>
365                    <span class="p">),</span>
366                    <span class="n">methods</span><span class="o">=</span><span class="n">c</span><span class="p">[</span><span class="s1">&#39;methods&#39;</span><span class="p">]</span>
367                <span class="p">)</span>
368
369    <span class="k">def</span> <span class="nf">children</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
370<span class="w">        </span><span class="sd">&quot;&quot;&quot;Build a list of treeview nodes from the child nodes.&quot;&quot;&quot;</span>
371        <span class="n">children</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_children_nodes</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
372
373        <span class="c1"># Return sorted nodes based on label</span>
374        <span class="k">return</span> <span class="n">make_json_response</span><span class="p">(</span>
375            <span class="n">data</span><span class="o">=</span><span class="nb">sorted</span><span class="p">(</span>
376                <span class="n">children</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="n">c</span><span class="p">[</span><span class="s1">&#39;label&#39;</span><span class="p">]</span>
377            <span class="p">)</span>
378        <span class="p">)</span>
379
380    <span class="k">def</span> <span class="nf">get_children_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
381<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
382<span class="sd">        Returns the list of children nodes for the current nodes. Override this</span>
383<span class="sd">        function for special cases only.</span>
384
385<span class="sd">        :param args:</span>
386<span class="sd">        :param kwargs: Parameters to generate the correct set of tree node.</span>
387<span class="sd">        :return: List of the children nodes</span>
388<span class="sd">        &quot;&quot;&quot;</span>
389        <span class="n">children</span> <span class="o">=</span> <span class="p">[]</span>
390
391        <span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">blueprint</span><span class="o">.</span><span class="n">submodules</span><span class="p">:</span>
392            <span class="n">children</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
393
394        <span class="k">return</span> <span class="n">children</span>
395</pre></div>
396</div>
397</section>
398<section id="basedriver">
399<span id="id3"></span><h2>BaseDriver<a class="headerlink" href="#basedriver" title="Link to this heading">¶</a></h2>
400<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">BaseDriver</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">DriverRegistry</span><span class="p">):</span>
401<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
402<span class="sd">    class BaseDriver():</span>
403
404<span class="sd">    This is a base class for different server types.</span>
405<span class="sd">    Inherit this class to implement different type of database driver</span>
406<span class="sd">    implementation.</span>
407
408<span class="sd">    (For PostgreSQL/EDB Postgres Advanced Server, we will be using psycopg)</span>
409
410<span class="sd">    Abstract Properties:</span>
411<span class="sd">    -------- ----------</span>
412<span class="sd">    * Version (string):</span>
413<span class="sd">        Current version string for the database server</span>
414
415<span class="sd">    * libpq_version (string):</span>
416<span class="sd">        Current version string for the used libpq library</span>
417
418<span class="sd">    Abstract Methods:</span>
419<span class="sd">    -------- -------</span>
420<span class="sd">    * get_connection(*args, **kwargs)</span>
421<span class="sd">    - It should return a Connection class object, which may/may not be</span>
422<span class="sd">      connected to the database server.</span>
423
424<span class="sd">    * release_connection(*args, **kwargs)</span>
425<span class="sd">    - Implement the connection release logic</span>
426
427<span class="sd">    * gc()</span>
428<span class="sd">    - Implement this function to release the connections assigned in the</span>
429<span class="sd">      session, which has not been pinged from more than the idle timeout</span>
430<span class="sd">      configuration.</span>
431<span class="sd">    &quot;&quot;&quot;</span>
432
433    <span class="nd">@property</span>
434    <span class="nd">@abstractmethod</span>
435    <span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
436        <span class="k">pass</span>
437
438    <span class="nd">@property</span>
439    <span class="nd">@abstractmethod</span>
440    <span class="k">def</span> <span class="nf">libpq_version</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
441        <span class="k">pass</span>
442
443    <span class="nd">@abstractmethod</span>
444    <span class="k">def</span> <span class="nf">get_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
445        <span class="k">pass</span>
446
447    <span class="nd">@abstractmethod</span>
448    <span class="k">def</span> <span class="nf">release_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
449        <span class="k">pass</span>
450
451    <span class="nd">@abstractmethod</span>
452    <span class="k">def</span> <span class="nf">gc_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
453        <span class="k">pass</span>
454</pre></div>
455</div>
456</section>
457<section id="baseconnection">
458<span id="id4"></span><h2>BaseConnection<a class="headerlink" href="#baseconnection" title="Link to this heading">¶</a></h2>
459<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">BaseConnection</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">ABCMeta</span><span class="p">):</span>
460<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
461<span class="sd">    class BaseConnection()</span>
462
463<span class="sd">        It is a base class for database connection. A different connection</span>
464<span class="sd">        drive must implement this to expose abstract methods for this server.</span>
465
466<span class="sd">        General idea is to create a wrapper around the actual driver</span>
467<span class="sd">        implementation. It will be instantiated by the driver factory</span>
468<span class="sd">        basically. And, they should not be instantiated directly.</span>
469
470
471<span class="sd">    Abstract Methods:</span>
472<span class="sd">    -------- -------</span>
473<span class="sd">    * connect(**kwargs)</span>
474<span class="sd">      - Define this method to connect the server using that particular driver</span>
475<span class="sd">        implementation.</span>
476
477<span class="sd">    * execute_scalar(query, params, formatted_exception_msg)</span>
478<span class="sd">      - Implement this method to execute the given query and returns single</span>
479<span class="sd">        datum result.</span>
480
481<span class="sd">    * execute_async(query, params, formatted_exception_msg)</span>
482<span class="sd">      - Implement this method to execute the given query asynchronously and</span>
483<span class="sd">      returns result.</span>
484
485<span class="sd">    * execute_void(query, params, formatted_exception_msg)</span>
486<span class="sd">      - Implement this method to execute the given query with no result.</span>
487
488<span class="sd">    * execute_2darray(query, params, formatted_exception_msg)</span>
489<span class="sd">      - Implement this method to execute the given query and returns the result</span>
490<span class="sd">        as a 2 dimensional array.</span>
491
492<span class="sd">    * execute_dict(query, params, formatted_exception_msg)</span>
493<span class="sd">      - Implement this method to execute the given query and returns the result</span>
494<span class="sd">        as an array of dict (column name -&gt; value) format.</span>
495
496<span class="sd">    * def async_fetchmany_2darray(records=-1, formatted_exception_msg=False):</span>
497<span class="sd">      - Implement this method to retrieve result of asynchronous connection and</span>
498<span class="sd">        polling with no_result flag set to True.</span>
499<span class="sd">        This returns the result as a 2 dimensional array.</span>
500<span class="sd">        If records is -1 then fetchmany will behave as fetchall.</span>
501
502<span class="sd">    * connected()</span>
503<span class="sd">      - Implement this method to get the status of the connection. It should</span>
504<span class="sd">        return True for connected, otherwise False</span>
505
506<span class="sd">    * reset()</span>
507<span class="sd">      - Implement this method to reconnect the database server (if possible)</span>
508
509<span class="sd">    * transaction_status()</span>
510<span class="sd">      - Implement this method to get the transaction status for this</span>
511<span class="sd">        connection. Range of return values different for each driver type.</span>
512
513<span class="sd">    * ping()</span>
514<span class="sd">      - Implement this method to ping the server. There are times, a connection</span>
515<span class="sd">        has been lost, but - the connection driver does not know about it. This</span>
516<span class="sd">        can be helpful to figure out the actual reason for query failure.</span>
517
518<span class="sd">    * _release()</span>
519<span class="sd">      - Implement this method to release the connection object. This should not</span>
520<span class="sd">        be directly called using the connection object itself.</span>
521
522<span class="sd">      NOTE: Please use BaseDriver.release_connection(...) for releasing the</span>
523<span class="sd">            connection object for better memory management, and connection pool</span>
524<span class="sd">            management.</span>
525
526<span class="sd">    * _wait(conn)</span>
527<span class="sd">      - Implement this method to wait for asynchronous connection to finish the</span>
528<span class="sd">        execution, hence - it must be a blocking call.</span>
529
530<span class="sd">    * _wait_timeout(conn, time)</span>
531<span class="sd">      - Implement this method to wait for asynchronous connection with timeout.</span>
532<span class="sd">        This must be a non blocking call.</span>
533
534<span class="sd">    * poll(formatted_exception_msg, no_result)</span>
535<span class="sd">      - Implement this method to poll the data of query running on asynchronous</span>
536<span class="sd">        connection.</span>
537
538<span class="sd">    * cancel_transaction(conn_id, did=None)</span>
539<span class="sd">      - Implement this method to cancel the running transaction.</span>
540
541<span class="sd">    * messages()</span>
542<span class="sd">      - Implement this method to return the list of the messages/notices from</span>
543<span class="sd">        the database server.</span>
544
545<span class="sd">    * rows_affected()</span>
546<span class="sd">      - Implement this method to get the rows affected by the last command</span>
547<span class="sd">        executed on the server.</span>
548<span class="sd">    &quot;&quot;&quot;</span>
549
550    <span class="n">ASYNC_OK</span> <span class="o">=</span> <span class="mi">1</span>
551    <span class="n">ASYNC_READ_TIMEOUT</span> <span class="o">=</span> <span class="mi">2</span>
552    <span class="n">ASYNC_WRITE_TIMEOUT</span> <span class="o">=</span> <span class="mi">3</span>
553    <span class="n">ASYNC_NOT_CONNECTED</span> <span class="o">=</span> <span class="mi">4</span>
554    <span class="n">ASYNC_EXECUTION_ABORTED</span> <span class="o">=</span> <span class="mi">5</span>
555    <span class="n">ASYNC_TIMEOUT</span> <span class="o">=</span> <span class="mf">0.2</span>
556    <span class="n">ASYNC_WAIT_TIMEOUT</span> <span class="o">=</span> <span class="mi">2</span>
557    <span class="n">ASYNC_NOTICE_MAXLENGTH</span> <span class="o">=</span> <span class="mi">100000</span>
558
559    <span class="nd">@abstractmethod</span>
560    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
561        <span class="k">pass</span>
562
563    <span class="nd">@abstractmethod</span>
564    <span class="k">def</span> <span class="nf">execute_scalar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
565                       <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
566        <span class="k">pass</span>
567
568    <span class="nd">@abstractmethod</span>
569    <span class="k">def</span> <span class="nf">execute_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
570                      <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
571        <span class="k">pass</span>
572
573    <span class="nd">@abstractmethod</span>
574    <span class="k">def</span> <span class="nf">execute_void</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
575                     <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
576        <span class="k">pass</span>
577
578    <span class="nd">@abstractmethod</span>
579    <span class="k">def</span> <span class="nf">execute_2darray</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
580                        <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
581        <span class="k">pass</span>
582
583    <span class="nd">@abstractmethod</span>
584    <span class="k">def</span> <span class="nf">execute_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
585                     <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
586        <span class="k">pass</span>
587
588    <span class="nd">@abstractmethod</span>
589    <span class="k">def</span> <span class="nf">async_fetchmany_2darray</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">records</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
590                                <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
591        <span class="k">pass</span>
592
593    <span class="nd">@abstractmethod</span>
594    <span class="k">def</span> <span class="nf">connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
595        <span class="k">pass</span>
596
597    <span class="nd">@abstractmethod</span>
598    <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
599        <span class="k">pass</span>
600
601    <span class="nd">@abstractmethod</span>
602    <span class="k">def</span> <span class="nf">transaction_status</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
603        <span class="k">pass</span>
604
605    <span class="nd">@abstractmethod</span>
606    <span class="k">def</span> <span class="nf">ping</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
607        <span class="k">pass</span>
608
609    <span class="nd">@abstractmethod</span>
610    <span class="k">def</span> <span class="nf">_release</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
611        <span class="k">pass</span>
612
613    <span class="nd">@abstractmethod</span>
614    <span class="k">def</span> <span class="nf">_wait</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">):</span>
615        <span class="k">pass</span>
616
617    <span class="nd">@abstractmethod</span>
618    <span class="k">def</span> <span class="nf">_wait_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
619        <span class="k">pass</span>
620
621    <span class="nd">@abstractmethod</span>
622    <span class="k">def</span> <span class="nf">poll</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">formatted_exception_msg</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">no_result</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
623        <span class="k">pass</span>
624
625    <span class="nd">@abstractmethod</span>
626    <span class="k">def</span> <span class="nf">status_message</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
627        <span class="k">pass</span>
628
629    <span class="nd">@abstractmethod</span>
630    <span class="k">def</span> <span class="nf">rows_affected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
631        <span class="k">pass</span>
632
633    <span class="nd">@abstractmethod</span>
634    <span class="k">def</span> <span class="nf">cancel_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn_id</span><span class="p">,</span> <span class="n">did</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
635        <span class="k">pass</span>
636</pre></div>
637</div>
638</section>
639</section>
640
641
642            <div class="clearer"></div>
643          </div>
644        </div>
645      </div>
646      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
647        <div class="sphinxsidebarwrapper">
648  <div>
649    <h3><a href="index.html">Table of Contents</a></h3>
650    <ul>
651<li><a class="reference internal" href="#">Code Snippets</a><ul>
652<li><a class="reference internal" href="#pgadminmodule">PgAdminModule</a></li>
653<li><a class="reference internal" href="#nodeview">NodeView</a></li>
654<li><a class="reference internal" href="#basedriver">BaseDriver</a></li>
655<li><a class="reference internal" href="#baseconnection">BaseConnection</a></li>
656</ul>
657</li>
658</ul>
659
660  </div>
661<h3><a href="index.html">Table of Contents</a></h3>
662<ul class="current">
663<li class="toctree-l1"><a class="reference internal" href="getting_started.html">Getting Started</a></li>
664<li class="toctree-l1"><a class="reference internal" href="external_database.html">External database for pgAdmin user settings</a></li>
665<li class="toctree-l1"><a class="reference internal" href="connecting.html">Connecting To A Server</a></li>
666<li class="toctree-l1"><a class="reference internal" href="managing_cluster_objects.html">Managing Cluster Objects</a></li>
667<li class="toctree-l1"><a class="reference internal" href="managing_database_objects.html">Managing Database Objects</a></li>
668<li class="toctree-l1"><a class="reference internal" href="modifying_tables.html">Creating or Modifying a Table</a></li>
669<li class="toctree-l1"><a class="reference internal" href="management_basics.html">Management Basics</a></li>
670<li class="toctree-l1"><a class="reference internal" href="backup_and_restore.html">Backup and Restore</a></li>
671<li class="toctree-l1"><a class="reference internal" href="developer_tools.html">Developer Tools</a></li>
672<li class="toctree-l1"><a class="reference internal" href="processes.html">Processes</a></li>
673<li class="toctree-l1"><a class="reference internal" href="pgagent.html">pgAgent</a></li>
674<li class="toctree-l1 current"><a class="reference internal" href="contributions.html">pgAdmin Project Contributions</a><ul class="current">
675<li class="toctree-l2"><a class="reference internal" href="submitting_pull_requests.html">Submitting Pull Requests</a></li>
676<li class="toctree-l2"><a class="reference internal" href="code_overview.html">Code Overview</a></li>
677<li class="toctree-l2"><a class="reference internal" href="coding_standards.html">Coding Standards</a></li>
678<li class="toctree-l2 current"><a class="current reference internal" href="#">Code Snippets</a></li>
679<li class="toctree-l2"><a class="reference internal" href="code_review.html">Code Review Notes</a></li>
680<li class="toctree-l2"><a class="reference internal" href="translations.html">Translations</a></li>
681</ul>
682</li>
683<li class="toctree-l1"><a class="reference internal" href="release_notes.html">Release Notes</a></li>
684<li class="toctree-l1"><a class="reference internal" href="licence.html">Licence</a></li>
685</ul>
686
687<search id="searchbox" style="display: none" role="search">
688  <h3 id="searchlabel">Quick search</h3>
689    <div class="searchformwrapper">
690    <form class="search" action="search.html" method="get">
691      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
692      <input type="submit" value="Go" />
693    </form>
694    </div>
695</search>
696<script>document.getElementById('searchbox').style.display = "block"</script>
697        </div>
698<div id="sidebarbutton" title="Collapse sidebar">
699<span>«</span>
700</div>
701
702      </div>
703      <div class="clearer"></div>
704    </div>
705    <div class="related" role="navigation" aria-label="related navigation">
706      <h3>Navigation</h3>
707      <ul>
708        <li class="right" style="margin-right: 10px">
709          <a href="genindex.html" title="General Index"
710             >index</a></li>
711        <li class="right" >
712          <a href="code_review.html" title="Code Review Notes"
713             >next</a> |</li>
714        <li class="right" >
715          <a href="coding_standards.html" title="Coding Standards"
716             >previous</a> |</li>
717        <li class="nav-item nav-item-0"><a href="index.html">pgAdmin 4 8.6 documentation</a> &#187;</li>
718          <li class="nav-item nav-item-1"><a href="contributions.html" >pgAdmin Project Contributions</a> &#187;</li>
719        <li class="nav-item nav-item-this"><a href="">Code Snippets</a></li> 
720      </ul>
721    </div>
722    <div class="footer" role="contentinfo">
723        <div class="related" role="navigation" aria-label="related navigation">
724          <ul>
725              <li class="left" style="margin-left: 10px">&#169; Copyright (C) 2013 - 2024, The pgAdmin Development Team.</li>
726            <li class="right" style="margin-right: 10px"><a href="genindex.html" title="General Index" accesskey="I">index</a></li>
727            <li class="right" ><a href="code_review.html" title="Code Review Notes" accesskey="N">next</a> |</li>
728            <li class="right" ><a href="coding_standards.html" title="Coding Standards" accesskey="P">previous</a> |</li>
729          </ul>
730        </div>
731    </div>
732  </body>
733</html>
codekingpro/portable-devtools · Team Ai