codekingpro/portable-devtools
114k
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 — 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> »</li>
38 <li class="nav-item nav-item-1"><a href="contributions.html" accesskey="U">pgAdmin Project Contributions</a> »</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">"""</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"> """</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">'url_prefix'</span><span class="p">,</span> <span class="s1">'/'</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">'template_folder'</span><span class="p">,</span> <span class="s1">'templates'</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">'static_folder'</span><span class="p">,</span> <span class="s1">'static'</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">"""</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"> """</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">'LABEL'</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">'priority'</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">"""</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 -> database -> schema</span>
212<span class="sd"> information.</span>
213<span class="sd"> """</span>
214 <span class="n">operations</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">({</span>
215 <span class="s1">'obj'</span><span class="p">:</span> <span class="p">[</span>
216 <span class="p">{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'properties'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">:</span> <span class="s1">'delete'</span><span class="p">,</span> <span class="s1">'put'</span><span class="p">:</span> <span class="s1">'update'</span><span class="p">},</span>
217 <span class="p">{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'list'</span><span class="p">,</span> <span class="s1">'post'</span><span class="p">:</span> <span class="s1">'create'</span><span class="p">}</span>
218 <span class="p">],</span>
219 <span class="s1">'nodes'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'node'</span><span class="p">},</span> <span class="p">{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'nodes'</span><span class="p">}],</span>
220 <span class="s1">'sql'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'sql'</span><span class="p">}],</span>
221 <span class="s1">'msql'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'modified_sql'</span><span class="p">}],</span>
222 <span class="s1">'stats'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'statistics'</span><span class="p">}],</span>
223 <span class="s1">'dependency'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'dependencies'</span><span class="p">}],</span>
224 <span class="s1">'dependent'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'dependents'</span><span class="p">}],</span>
225 <span class="s1">'children'</span><span class="p">:</span> <span class="p">[{</span><span class="s1">'get'</span><span class="p">:</span> <span class="s1">'children'</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">></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">'cmd'</span><span class="p">:</span> <span class="n">op</span><span class="p">,</span> <span class="s1">'req'</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">'with_id'</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">'methods'</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">"Please set the node_type for this class (</span><span class="si">{0}</span><span class="s2">)"</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">'/'</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">'<</span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1">>/'</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">'type'</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">'id'</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">'</span><span class="si">{0}</span><span class="s1"><</span><span class="si">{1}</span><span class="s1">:</span><span class="si">{2}</span><span class="s1">>'</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">'type'</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="s1">'id'</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">'cmd'</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">'id'</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">'id'</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">'head'</span><span class="p">:</span>
293 <span class="n">http_method</span> <span class="o">=</span> <span class="s1">'get'</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">'Unimplemented command (</span><span class="si">{0}</span><span class="s1">) for </span><span class="si">{1}</span><span class="s1">'</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">></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">></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">></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">'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"> '</span> \
313 <span class="s1">'an id'</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">'requires'</span> <span class="k">if</span> <span class="n">has_id</span> <span class="k">else</span> <span class="s1">'does not require'</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">'Unimplemented method (</span><span class="si">{0}</span><span class="s1">) for this url (</span><span class="si">{1}</span><span class="s1">)'</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">'cmd'</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">)</span>
347 <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s1">'with_id'</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">'/</span><span class="si">{0}{1}</span><span class="s1">'</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">'cmd'</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">'req'</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">'</span><span class="si">{0}{1}</span><span class="s1">'</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">'_id'</span> <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s1">'req'</span><span class="p">]</span> <span class="k">else</span> <span class="s1">''</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">'cmd'</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">'methods'</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">'/</span><span class="si">{0}</span><span class="s1">'</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">'cmd'</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">'cmd'</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">'methods'</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">"""Build a list of treeview nodes from the child nodes."""</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">'label'</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">"""</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"> """</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">"""</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"> """</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">"""</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 -> 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"> """</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> »</li>
718 <li class="nav-item nav-item-1"><a href="contributions.html" >pgAdmin Project Contributions</a> »</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">© 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>