Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hdZBD-0003ik-1o for pgadmin-hackers@arkaria.postgresql.org; Wed, 19 Jun 2019 11:55:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hdZBB-0001cU-Bj for pgadmin-hackers@arkaria.postgresql.org; Wed, 19 Jun 2019 11:55:05 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hdZBA-0001by-R1 for pgadmin-hackers@lists.postgresql.org; Wed, 19 Jun 2019 11:55:05 +0000 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hdZB2-0008EF-UB for pgadmin-hackers@postgresql.org; Wed, 19 Jun 2019 11:55:04 +0000 Received: by mail-wr1-x443.google.com with SMTP id n4so3090244wrs.3 for ; Wed, 19 Jun 2019 04:54:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pgadmin.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=MjWOEs2SBlY2L8z6k0XiKb6jN0oUaaL3TnIWClCWijk=; b=i+or1a5ddSmUMbdiFswg2R+uhMNI9lp06mCurzG9z+dy2xZk9VKb7Z9x6Swb5pCmVl 8nwPAe6BSCjDuW8w3EhjNXabSR+AZyFT3xxtEI1l+3WhdVwl7jNR8bgxR8/ysPS+GKPl VtGSe1ect7QKMGMWYJ/4uh7dU+0lI/rO8uzWZtPbMsygIoxoOiByK4gt9GX5BzF+sP8c 4aMJYSZ/RfGMnBf1+bHtJXiwdWapKsGc2PinExKP7JDMHmlm5cZJrQ7Ct6D2EzFim3Hj HuQ0C6TgiEqN8g/eiUctzL98XuvsUwefnjuFiV8wwIr2Y7nrH0TqE+IyKzlTlVf7sJuh NM0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=MjWOEs2SBlY2L8z6k0XiKb6jN0oUaaL3TnIWClCWijk=; b=UmYJv2OUhZ0iIWonj8Nxiq3s63UaSwpws0yEwwKFokawuVvkcUcj5EeSuo3LzKem99 Fcoijk5Cd7p5AsFUQ5aZgNCZBTTr8LVA+bY31MpM0zHZt9CCazGQDI/t0+WV1ip5P90Q 2qoBKaUfzx/hxkQHNydKE1plz3CfJv+4kH4kQ7Pr4vczN7Ohio0vA9XxfK0ywM/PRay7 MgT/7+8GMOkxxtJziJJ4V0VHFIf+pUOFWK3KRIYe86LK3rIM18ywR1BQSI1Os3y7dk7O 7/JM4P5AzxJShF5hiRlyx9uvJVcCqX0AiypzxljTTHsb+TGaCYeRQQxbhA0HdRo6DhJ0 GAcA== X-Gm-Message-State: APjAAAUzmQM6lohpuKrCkpyW1/fNaMyRJDP/3JqUEOPvWBjet5FED1YD tjXujAlplIZNksOeaZw+FXSCK7y9JUrFDnvQy/tHgQ== X-Google-Smtp-Source: APXvYqw599jBt9WeWZKn4qptmyIdy0ifzGat+wI3G6HlEyBwJ5Wk9JIMOiP0OC1sPRKNDqtIyyCYztEIM6i/jHpK7Uc= X-Received: by 2002:adf:f589:: with SMTP id f9mr5264989wro.90.1560945295322; Wed, 19 Jun 2019 04:54:55 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Dave Page Date: Wed, 19 Jun 2019 12:54:43 +0100 Message-ID: Subject: Re: [GSoC][Patch] Automatic Mode Detection V1 To: Yosry Muhammad Cc: pgadmin-hackers , Aditya Toshniwal Content-Type: multipart/mixed; boundary="000000000000d7c3fc058babe549" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --000000000000d7c3fc058babe549 Content-Type: multipart/alternative; boundary="000000000000d7c3fa058babe547" --000000000000d7c3fa058babe547 Content-Type: text/plain; charset="UTF-8" Hi On Wed, Jun 19, 2019 at 6:18 AM Yosry Muhammad wrote: > > Waiting for the icon, will set it up once it is ready. > It's underway :-) > I ran pep8 checks and JS tests on this patch, however I could not run > python tests due to a problem with chromedriver (working on it), please let > me know if any tests fail. > Take a look in the Makefile (or web/regression/README) and you'll see how you can run tests selectively - e.g. to avoid the feature tests when running the Python suite, you can do "python regression/runtests.py --exclude feature_tests" As for chromedriver, there's a utility (tools/get_chromedriver.py) you can use to download and install the correct version. You should save it to somewhere in your path; I'd suggest the bin/ directory in your virtual environment. > > - When revising patches, please send an updated one for the whole thing, >> rather than incremental ones. Incrementals are more work to apply and don't >> give us any benefit in return. >> >> > The attached patch is a single patch including all old and new increments. > :-) Aditya; can you do a quick code review please? Bear in mind it's a work in progress and there are no docs or tests etc. yet. > > - We need to add a "do you want to continue" warning before actions like >> Execute or EXPLAIN are run, if there are unsaved changes in the grid. >> >> - I think we should make the text in any cells that has been edited bold >> until saved, so the user can see where changes have been made (as they can >> with deleted rows). >> > > Both done, new rows are highlighted too. > Nice! I realise it's most likely not your code, but if you can fix the wrapping so it doesn't break mid-word, that would be good. See the attached screenshot to see what I mean. > >> - If I make two data edits and then delete a row, I get 3 entries in the >> History panel, all showing the same delete. I would actually argue that >> data edit queries that pgAdmin generates should not go into the History at >> all, but maybe they should be added albeit with a flag to say they're >> internal queries and an option to hide them. Thoughts? >> > > That was a bug with the existing 'save changes' action of 'View Data', on > which mine is based upon. I fixed the bug, now the queries are shown > correctly. However, the queries are shown in the form in which they are > sent from the backend to the database driver (without parameters - also an > already existing bug in View Data Mode), for example: > > INSERT INTO public.kweek ( >> media_url, username, text, created_at) VALUES ( >> %(media_url)s::character varying, %(username)s::character varying, >> %(text)s::text, %(created_at)s::timestamp without time zone) >> returning id; >> > > I propose two solutions: > 1- Hide pgadmin's generated sql from history (in both modes). > 2- Show the actual sql query that was executed after the parameters are > plugged in (more understandable and potentially helpful). > I like the idea of doing 2 - but I think we should have a checkbox on the history panel to show/hide generated queries (and we should include transaction control - BEGIN, COMMIT etc - in the generated query class). > > >> - We need to think about how data editing fits in with transaction >> control. Right now, it seems to happen entirely outside of it - for >> example, I tend to work with auto commit turned off, so my connection sits >> idle-in-transaction following an initial select, and remains un-affected by >> edits. Please think about this and suggest options for us to discuss. >> > > I integrated the data editing in the transaction control as you noted. Now > the behavior is as follows: > 1- In View Data mode, same existing behavior. > 2- In Query Tool mode: > - If auto-commit is on: the modifications are made and commited once save > is pressed. > - If auto-commit is off: the modifications are made as part of the ongoing > transaction (or a new one if no transaction is ongoing), they are not > commited unless the user executes a commit command (or rollback). > That seems to work. I think we need to make it more obvious that there's a transaction in progress - especially as that can be the case after the user hits the Save button and thinks their data is safe (a side-thought is that perhaps we shouldn't require the Save button to be pressed when auto-commit is turned off, as that's just odd). We should highlight the transaction state more clearly to the user, and make sure we prompt for confirmation if they try to close the tab or the whole window. > I think it makes more sense for filters to be disabled. I mean since the >>> user is already writing SQL it would be more convenient to just edit it >>> directly. >>> >> >> Well we're not going to just disable them - we'll either remove them, or >> try to make them work. I'm leaning strongly towards just removing that code >> entirely. >> >> > I meant disabling them in the query tool while keeping them in the View > Data mode as the user cannot edit the sql in the View Data mode. Do you > want to remove the feature from both modes completely? > I think you misunderstand - I want to remove the View Data mode entirely. Your work should replace it. -- Dave Page Blog: http://pgsnake.blogspot.com Twitter: @pgsnake EnterpriseDB UK: http://www.enterprisedb.com The Enterprise PostgreSQL Company --000000000000d7c3fa058babe547 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi

On Wed, Jun 19, 2019 at 6:18 AM Yosry Muhammad <= yosrym93@gmail.com> wrote:
=

Waiting for t= he icon, will set it up once it is ready.

It's underway :-)
=C2=A0
I ran pep8 checks and JS tests on this patch, how= ever I could not run python tests due to a problem with chromedriver (worki= ng on it), please let me know if any tests fail.

Take a look in the Makefile (or web/regre= ssion/README) and you'll see how you can run tests selectively - e.g. t= o avoid the feature tests when running the Python suite, you can do "p= ython regression/runtests.py --exclude feature_tests"

As for chromedriver, there's a utility (tools/get_chromedriver= .py) you can use to download and install the correct version. You should sa= ve it to somewhere in your path; I'd suggest the bin/ directory in your= virtual environment.
=C2=A0

- When revising patches, please = send an updated one for the whole thing, rather than incremental ones. Incr= ementals are more work to apply and don't give us any benefit in return= .


The atta= ched patch is a single patch including all old and new increments.

:-)

Aditya; can you do a quick code review please? Bear in mind it's a wo= rk in progress and there are no docs or tests etc. yet.
=C2=A0
=

- We nee= d to add a "do you want to continue" warning before actions like = Execute or EXPLAIN are run, if there are unsaved changes in the grid.
=

- I think we should make the text in any cells that has= been edited bold until saved, so the user can see where changes have been = made (as they can with deleted rows).
Both done, new rows are highlighted too.

Nice! I realise it's most likel= y not your code, but if you can fix the wrapping so it doesn't break mi= d-word, that would be good. See the attached screenshot to see what I mean.=
=C2=A0

- If I make two data edits and then delete a row, I g= et 3 entries in the History panel, all showing the same delete. I would act= ually argue that data edit queries that pgAdmin generates should not go int= o the History at all, but maybe they should be added albeit with a flag to = say they're internal queries and an option to hide them. Thoughts?

That was a bug with the exist= ing 'save changes' action of 'View Data', on which mine is = based upon. I fixed the bug, now the queries are shown correctly. However, = the queries are shown in the form in which they are sent from the backend t= o the database driver (without parameters - also an already existing bug in= View Data Mode), for example:

INSERT INT= O public.kweek (
media_url, username, text, created_at) VALUES (
%(me= dia_url)s::character varying, %(username)s::character varying, %(text)s::te= xt, %(created_at)s::timestamp without time zone)
=C2=A0returning id;
=C2=A0
I propose two solutions:
1- = Hide pgadmin's generated sql from history (in both modes).
2-= Show the actual sql query that was executed after the parameters are plugg= ed in (more understandable and potentially helpful).
<= /div>

I like the idea of doing 2 - bu= t I think we should have a checkbox on the history panel to show/hide gener= ated queries (and we should include transaction control - BEGIN, COMMIT etc= - in the generated query class).
=C2=A0


- We need to think about how data editing fits in with transaction = control. Right now, it seems to happen entirely outside of it - for example= , I tend to work with auto commit turned off, so my connection sits idle-in= -transaction following an initial select, and remains un-affected by edits.= Please think about this and suggest options for us to discuss.
=

I integrated the data editing in the= transaction control as you noted. Now the behavior is as follows:
1- In View Data mode, same existing behavior.
2- In Query T= ool mode:
- If auto-commit is on: the modifications are made and = commited once save is pressed.
- If auto-commit is off: the modif= ications are made as part of the ongoing transaction (or a new one if no tr= ansaction is ongoing), they are not commited unless the user executes a com= mit command (or rollback).
That seems to work. I think we need to make it more obvious tha= t there's a transaction in progress - especially as that can be the cas= e after the user hits the Save button and thinks their data is safe (a side= -thought is that perhaps we shouldn't require the Save button to be pre= ssed when auto-commit is turned off, as that's just odd). We should hig= hlight the transaction state more clearly to the user, and make sure we pro= mpt for confirmation if they try to close the tab or the whole window.
=C2=A0
I think it makes more sense for filters to be disabled. I mean si= nce the user is already writing SQL it would be more convenient to just edi= t it directly.

Well we= 9;re not going to just disable them - we'll either remove them, or try = to make them work. I'm leaning strongly towards just removing that code= entirely.

=C2=A0
I meant disabling them in the query tool while keeping them in the View = Data mode as the user cannot edit the sql in the View Data mode. Do you wan= t to remove the feature from both modes completely?

I think you misunderstand - I want to = remove the View Data mode entirely. Your work should replace it.
=
--
Dave Page=
Blog: http://= pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprised= b.com
The Enterprise PostgreSQL Company
--000000000000d7c3fa058babe547-- --000000000000d7c3fc058babe549 Content-Type: image/png; name="Screenshot 2019-06-19 at 12.44.52.png" Content-Disposition: attachment; filename="Screenshot 2019-06-19 at 12.44.52.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jx3676m20 iVBORw0KGgoAAAANSUhEUgAAAmMAAACmCAYAAACWcohTAAABfGlDQ1BJQ0MgUHJvZmlsZQAAKJFj YGAqSSwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxK 8/x506a1fP4WNq+ZclYlOrj1gQF3SmpxMgMDIweQnZxSnJwLZOcA2TrJBUUlQPYMIFu3vKQAxD4B ZIsUAR0IZN8BsdMh7A8gdhKYzcQCVhMS5AxkSwDZAkkQtgaInQ5hW4DYyRmJKUC2B8guiBvAgNPD RcHcwFLXkYC7SQa5OaUwO0ChxZOaFxoMcgcQyzB4MLgwKDCYMxgwWDLoMjiWpFaUgBQ65xdUFmWm Z5QoOAJDNlXBOT+3oLQktUhHwTMvWU9HwcjA0ACkDhRnEKM/B4FNZxQ7jxDLX8jAYKnMwMDcgxBL msbAsH0PA4PEKYSYyjwGBn5rBoZt5woSixLhDmf8xkKIX5xmbARh8zgxMLDe+///sxoDA/skBoa/ E////73o//+/i4H2A+PsQA4AJHdp4IxrEg8AAAGdaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8 eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQu MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1y ZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg ICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAg ICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjYxMTwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAg ICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xNjY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAg ICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4Kqz75dAAAOiFJ REFUeAHtnQmgHtP5/597E1tCgpAICbU0sSdI6GKn9iBEF6K2orZaKihBLLE0Re1/aq2gVUostVOi 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 XkHq0xYuvp2s//SnP8kTTzzRKq35v//7Pzn//PNbpWy/0K+//lrGjBkjM2bM8INrvl2vemre8GYU +OmnnxrT//3vf5b722+/1UmQ7qQWgf+hhx6So446yo7x1KlTm1FLmGXChAny97//PTf/66+/Lmee eWZuGkbmE6hXf8xvBWPbigCuX5W4tu5r6etBpe2uZN9akibdrryy6sXwwQcflPHjx+c1hXEegTYb pvzlL38piy++eNm/L7/8UlpTjE2aNEkuuOACD0X5zW+++UaQ/osvviifqEwMOutpp51WFzFWj3rK 7GZdgz/55BNj+vHHH1u9P//5z+WQQw6J2wARtu+++wqO21NPPSUvvPBCHFftxh133CG33357braW Xtxacn7lNiyKBK8XX3yxkqRtlqaa/ugaieOKawhuRHQLNoEVVlhB/vKXvxTuRLV97dVXX5UPP/yw sNxKE/jXg0svvVTWWWedSrO2ajq/XemK0v2/Wobp8ir1U4xVSipMVxJjZlgoWReqK6b61Oedd57d IHCTOPTQQ2X55ZeP/QhbeOGFqy+0lXJ89NFHst5660lLLCyt1DQWqwROP/10Oe6444wFxO/NN98s l19+uVxyySXyt7/9TXbbbbd2zam1z6/7779fNt9883bNoDmNu+aaa8wievXVVzcnO/O0IwKwPm+/ /fY1b9Hw4cMrEnnNqfhnP/uZXH/99c3JWtc8HbX/1xVizStrqrW61ryOCgtcdtllBX9wSy+9tCy0 0ELyve99z/zpBYYq//Wvf9kNZaONNkpEv/POO3L33XdLQ0OD7LrrribqEgk8z6OPPmqWku9///vy 3XffeTHh0BbKeeWVV+THP/6x/TU2NppAxMkMd+utt8rcuXPlBz/4gfmffPJJa9eqq64q2223nXTr 1s3CsxYYOkN+tBfiYOWVV46TIS6rbpdg3rx5cu+998rs2bNll112yd3Hr776ykzD06dPN14//OEP XTG2zuMFIQNGzz33nAwaNEh22GEHy4OyHnvsMdlpp51sHzAkuMcee8iSSy6ZKBselHHdddfZsXjg gQdk2rRpsskmm8jGG29sLPG0tNpqq8m2226bENywcmFo8Y033hC0ebPNNkuUjSdcMFpiiSUs3o/E EHD37t3tHLrpppsE4gaWFhwPnC8QZz/96U+lZ8+elg1PiuCJfFtvvbUJbVcejsUtt9wib731lmy6 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 0f8HYkozFhIi6VAAAAAASUVORK5CYII= --000000000000d7c3fc058babe549--