PATCH: Debugger Redesign

Поиск
Список
Период
Сортировка
От Ashesh Vashi
Тема PATCH: Debugger Redesign
Дата
Msg-id CAG7mmoywJyUd9VD+WhQAoBGa0kt=Fq56eePt3iEPNcLKb5hTfg@mail.gmail.com
обсуждение исходный текст
Ответы Re: PATCH: Debugger Redesign  (Dave Page <dpage@pgadmin.org>)
Список pgadmin-hackers
Hi All,

    We always wanted to redesign the plpgsql debugger in pgAdmin III from very long time due to very long list of bug
Reports of the debugger. We were not able crack down variety of cases across the platforms.  For many cases - resolving
On one platform, we ended up introducing other issues on another platforms. This inability of handling variety of cases
Across platforms made us to redesign the debugger from the scratch.

Let me list down few the limitations/flaws with the current implementation of the debugger:
- Uses its own mechanism for making connection, querying (async/sync) & handing results instead of using the common
  available classes, which are used by all other components in pgAdmin III.
  i.e.
    dbgConn, dbgResult, dbgPgThread, etc.

  Because of this, the improvements in the existing infrastructure were never reflected in the debugger.
  i.e.
    The connection with debugger were never be created with the SSL support.
    Because - dbgConn never supported the SSL.
  This is also results for the many bugs.
  i.e.
    The dbgPgThread has its own mechanism to run queries asynchronously and resulted into many bugs. It generates few
  events, which shouldn't be done after the completion of the debugger operations. And, that leads to crash.  Using
  TestDestroy() function for JOINABLE threads were unnecessary and never required. But - it is using it.

- A hidden windows is taking care of the events generated during the debugging the actual window. It could have been
  Good, if all the tasks having intialited and handled from by this central mechanism, instead we do have different
  places for handling both the direct/indirect debugging. And, that introduced a lot of issues. And, that made the
  things very confusing even to understand the existing mechanism.

And, many more.

We had to made changes in the existing infrastructure/classes to use it with the debugger.
* pgConn:
  + Report error quietly (if told) while error found in execution, this allows these functions to be used from any
    Thread. Otherwise, it used to throw an error.
  + Set/Reset the PGcancel object before and after the query execution, which will be useful for us to use the new
    Mechanism of libpq (of course, not very new) to cancel any query execution from in between.
  + Allow new application name, while duplicating the connection
  + Save the version and the features list, while duplicating the connection, this will avoid/reduce the duplicate calls
    To the database server.
* pgQueryThread:
  + Allow to specify the custom notice processor and handler
  + Allow to run multiple queries by creating queue
  + Allow to use the EnterpriseDB's callable statement from the pgQueryThread (if available)
  + Proper cancellation mechanism implementation
  + Send a custom event to the caller (instead of standard event) for successful execution or on different errors
    (but - not if it is explicitly cancelled by the user.) This allows us to send more information to the developer.
  + Allows the developer to add a batch queries (which should run asynchronously) even after starting of the thread.
  + Allow to use the PGparam now, to avoid generating the queries dynamically

The new design is based on the MVC (Model-View-Controller) architecture.
* Controller (dbgController)
  - A central mechanism to handle all the operations.
* View (frmDebugger - mostly reused)
  - Responsible for presentation and interaction with the end-user
  i.e.
    code viewer, different variable windows, stack window, etc.
  - It also controls other part of view.
* Model (dbgModel)
 - Handles/Contains all the data
 - It contains the information about the target function/procedure.

For any operation, View and Model will ask the Controller to handle it.

Summary of the changes:

 INSERTED|   DELETED| FILENAME                                    | SUMMARY
---------+----------+---------------------------------------------|----------------------------
        3|         1| pgadmin/ctl/ctlSQLResult.cpp                | - Call cancel thread execution on exit, if already
                                                                  | running for nice exit handling
      196|        18| pgadmin/db/pgConn.cpp                       | - Set/Reset the PGcancel object
                                                                  | - Saving settings and new application name, while
                                                                  | cloning
       31|        24| pgadmin/include/db/pgConn.h                 |
      245|        33| pgadmin/include/db/pgQueryThread.h          |
      647|       111| pgadmin/db/pgQueryThread.cpp                | - Multiple queries execution support (one-by-one)
        8|         0| pgadmin/include/db/pgSet.h                  | - Introduce a new function GetCommandStatus for the
                                                                  | result
        0|         1| pgadmin/db/pgSet.cpp                        | - Removed unnecessary header inclusion
        0|      1563| pgadmin/debugger/ctlCodeWindow.cpp          | - Omitted/Removed it completely
        0|       250| pgadmin/include/debugger/ctlCodeWindow.h    |
        9|         9| pgadmin/debugger/ctlMessageWindow.cpp       | - Standardize the function naming conversion with the
                                                                  | other components
        5|        12| pgadmin/include/debugger/ctlMessageWindow.h |
       28|        27| pgadmin/debugger/ctlResultGrid.cpp          | - Using the standard querying mechanism (pgSet)
                                                                  | instead of libpq's PGresult directly
        4|         3| pgadmin/include/debugger/ctlResultGrid.h    |
        4|         7| pgadmin/debugger/ctlStackWindow.cpp         | - Standardize the function naming conversion with the
                                                                  | other components
        2|         2| pgadmin/include/debugger/ctlStackWindow.h   |
       50|        56| pgadmin/debugger/ctlTabWindow.cpp           | - Standardize the function naming conversion with the
                                                                  | other components
       20|        17| pgadmin/include/debugger/ctlTabWindow.h     |
       60|        55| pgadmin/debugger/ctlVarWindow.cpp           | - Standardize the function naming conversion with the
                                                                  | other components
       17|        15| pgadmin/include/debugger/ctlVarWindow.h     |
      819|         0| pgadmin/debugger/dbgController.cpp          | - Central of the debugger (it takes care of all the
                                                                  | operations, the frmDebugger (view) and dbgModel
                                                                  | (model) interact with it.
      173|         0| pgadmin/include/debugger/dbgController.h    |
        0|        21| pgadmin/debugger/dbgDbResult.cpp            | - Omitted/Removed it completely
      703|         0| pgadmin/debugger/dbgEvents.cpp              | - Added new file, which contains all the event
                                                                  | handling functions of the dbgController to reduce
                                                                  | the size of dbgController and separating them from
                                                                  | the direct operations
       63|         0| pgadmin/debugger/dbgModel.cpp               | - Contains all the information regarding the
                                                                  | target.
      143|         0| pgadmin/include/debugger/dbgModel.h         |
        0|       544| pgadmin/debugger/dbgPgConn.cpp              | - Omitted/Removed it completely
        0|       363| pgadmin/debugger/dbgPgThread.cpp            | - Omitted/Removed it completely
        0|       157| pgadmin/debugger/dbgResultset.cpp           | - Omitted/Removed it completely
      536|       194| pgadmin/debugger/dbgTargetInfo.cpp          | - It fetches and saves the target information from
                                                                  | the database server (it is no more using the
                                                                  | deprecated pldbg_target_info function).
      146|        75| pgadmin/include/debugger/dbgTargetInfo.h    |
       44|       101| pgadmin/debugger/debugger.cpp               | - Debugger menu factory, modified accordingly new
                                                                  | design
      770|       682| pgadmin/debugger/dlgDirectDbg.cpp           | - Handles now only taking input from the end-user
                                                                  | - It also takes care of converting an expression
                                                                  | input to a proper value
                                                                  | - It also allows the end-user to use the default
                                                                  | value of an argument through UI.
                                                                  | - It does not control the debugger execution any
                                                                  | more
       74|        48| pgadmin/include/debugger/dlgDirectDbg.h     |
      734|       165| pgadmin/debugger/frmDebugger.cpp            | - Mostly reused
                                                                  | - Works as presentation layer and takes input from
                                                                  | from the end-user
                                                                  | i.e. set/reset break-points, changing parameter
                                                                  |      values, showing the target code, showing
                                                                  |      current parameter values, etc.
      114|        92| pgadmin/include/debugger/frmDebugger.h      |
        3|         5| pgadmin/debugger/module.mk                  |
        5|         1| pgadmin/dlg/dlgClasses.cpp                  | - Call cancel thread execution on exit, if already
                                                                  | running for nice exit handling (ExecutionDialog)
        4|         1| pgadmin/frm/frmEditGrid.cpp                 | - Call cancel thread execution on abort
        2|         2| pgadmin/frm/frmQuery.cpp                    | - Modified to use new custom event on query
                                                                  |  execution completion
        2|         1| pgadmin/include/frm/frmQuery.h              |
        1|         1| pgadmin/include/db/module.mk                |
       79|         0| pgadmin/include/db/pgQueryResultEvent.h     | - Introduced a new custom event for handling the
                                                                  | query execution error/success (pgQueryThread)
       14|        21| pgadmin/include/debugger/dbgBreakPoint.h    | - Reformatted the break-point according to new design
        0|        38| pgadmin/include/debugger/dbgConnProp.h      | - Omitted/Removed it completely
       57|        10| pgadmin/include/debugger/dbgConst.h         |
        0|        53| pgadmin/include/debugger/dbgDbResult.h      | - Omitted/Removed it completely
        0|        99| pgadmin/include/debugger/dbgPgConn.h        | - Omitted/Removed it completely
        0|        95| pgadmin/include/debugger/dbgPgThread.h      | - Omitted/Removed it completely
        0|        52| pgadmin/include/debugger/dbgResultset.h     | - Omitted/Removed it completely
        2|         6| pgadmin/include/debugger/module.mk          |
        3|         6| pgadmin/include/precomp.h                   |
        7|        12| pgadmin/pgAdmin3.vcxproj                    | - Window build script changes
       10|        28| pgadmin/pgAdmin3.vcxproj.filters            |
        3|         3| pgadmin/ii/dlgDirectDbg.xrc                 | - Input Arguments dialog change (changed the
                                                                  | dimensions.)
       44|        44| pgadmin/ii/xrcDialogs.cpp                   |


--

Thanks & Regards,

Ashesh Vashi
EnterpriseDB INDIA:
Enterprise PostgreSQL Company


http://www.linkedin.com/in/asheshvashi

Вложения

В списке pgadmin-hackers по дате отправления:

Предыдущее
От: Dave Page
Дата:
Сообщение: Re: pgAdmin with SSHTunneling support
Следующее
От: Dave Page
Дата:
Сообщение: Re: pgAdmin with SSHTunneling support