.. docs/source/administrator/server_third_party_installation.rst
.. Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
Created by Rudolf Cardinal (rnc1001@cam.ac.uk).
.
This file is part of CamCOPS.
.
CamCOPS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
CamCOPS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with CamCOPS. If not, see .
(MANUAL) Installing third-party software
========================================
.. include:: include_this_is_manual_see_docker.rst
This sections contains some instructions and tips on installing third-party
software. It's particularly relevant for Windows, which doesn't have a good "X
depends on Y" software package system.
.. contents::
:local:
:depth: 3
.. _windows_install_python:
Installing Python (with tkinter) for Windows
--------------------------------------------
Install Python (https://www.python.org); for example, Python 3.6.7 for Windows.
If you have a 64-bit computer, use the "x86-64" version. Download and run the
installer. (These days, the installer includes Tk/tkinter without asking, which
is helpful.) By default, it will install to your user directory, so consider
customizing the installation as follows:
Optional features:
- [✓] Documentation
- [✓] pip
- [✓] tcl/tk and IDLE
- [✓] Python test suite
- [✓] py launcher [✓] for all users (requires elevation)
Advanced options:
- [✓] Install for all users
- [✓] Associate files with Python (requires the py launcher)
- [✓] Create shortcuts for installed applications
- [✓] Add Python to environment variables
- [✓] Precompile standard library
- Customize install location = ``C:\Python36``
Also, you may want to allow the installer to extend the system ``MAX_PATH``
length limit
(https://python.readthedocs.io/en/stable/using/windows.html#removing-the-max-path-limitation).
.. _windows_install_imagemagick:
Installing ImageMagick for Windows
----------------------------------
See
http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows.
Note that for Wand 0.4.x, you need ImageMagick 6.x (7.x won't work).
ImageMagick 7 support is in Wand 0.5, as yet unreleased as of 2018-12-02.
If, despite installing ImageMagick, CamCOPS fails to start regardless with the
message:
.. code-block:: none
ImportError: MagickWand shared library not found.
You probably had not installed ImageMagick library.
Try to install:
http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows
then
- one possibility is that your Python interpreter and your ImageMagick
libraries do not match in terms of 32- versus 64-bitness.
To check Python, run ``python`` then check if ``sys.maxsize > 2**32`` (see
https://stackoverflow.com/questions/1405913/); if so, it's 64-bit Python. To
check ImageMagick, a quick way is to run its ImageMagick Display (IMDisplay)
program, then :menuselection:`Help --> About`.
- Another possibility is that you failed to tick **"Install development headers
and libraries for C and C++"** (see the Wand instructions). Retry with that
ticked.
- ImageMagick 7.x doesn't work with Wand 0.4.x; you need ImageMagick 6.x (e.g.
6.9.10) (see https://stackoverflow.com/questions/25003117/;
http://docs.wand-py.org/en/latest/changes.html). Binary downloads are at
https://www.imagemagick.org/download/binaries/. This fixed it for us. Use
e.g.
``https://imagemagick.org/download/binaries/ImageMagick-6.9.10-14-Q16-x64-dll.exe``
for a 64-bit system.
.. _windows_install_sql_server:
Installing SQL Server for Windows
---------------------------------
A short guide to installing the Developer edition of SQL Server:
- SQL Server 2017 Developer Edition won't install with the Visual C++ 2017
redistributables installed (see
https://dba.stackexchange.com/questions/190090/), so uninstall that
first.
- Install the free SQL Server 2017 Developer Edition from
https://www.microsoft.com/en-us/sql-server/sql-server-downloads; basic
install, default options. After installation, it should say "Installation
has completed successfully!" and "SQL Server Configuration Manager"
should be available as a program. The defaults are an instance name of
``MSSQLSERVER``, and a connection string of
``Server=localhost;Database=master;Trusted_Connection=True;``. The
"Connect Now" button should work. The Windows service "SQL Server
(MSSQLSERVER)" should be present and running. (Re-install if it doesn't
get that far the first time!)
- Install SSMS (SQL Server Management Studio) too (e.g.
https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms).
May need to reboot then restart the installer. After installation,
"Microsoft SQL Server Management Studio" should be available.
- Run SSMS and provide "localhost" as the server name; this should connect.
.. _windows_create_sql_server_database:
Creating an SQL Server database with an ODBC connection
-------------------------------------------------------
First install SQL Server (see :ref:`Installing SQL Server for Windows
`). Then, to create a database named
``camcops_db`` and create an ODBC connection to it:
- Create a database named ``camcops_db``: :menuselection:`[right-click]
Databases --> New database` and supply the name.
- Create a user named ``camcops_user``: :menuselection:`Security -->
[right-click] Logins -> New login`; supply the name; choose "SQL Server
authentication" and specify a password; untick "User must change password at
next login".
- Give the user permission to access the database. Right-click the new user and
choose "Properties". Under "User Mapping", tick the "Map" tickbox for the
``camcops_db`` database. In the box marked "Database role membership for:
camcops", tick ``db_owner`` or some other suitable combination (e.g.
``db_ddladmin + db_datareader + db_datawriter``). See
https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/database-level-roles?view=sql-server-2017.
- Ensure the server allows logins via username/password combinations.
- Right-click the top-level database object in the SSMS tree.
- :menuselection:`Properties --> Security`
- Ensure "Server authentication" is set to "SQL Server and Windows
Authentication mode" (not "Windows Authentication mode").
- Restart SQL Server (from Windows Services; the "SQL Server (MSSQLSERVER)"
services).
Without this, you will get errors like ``[Microsoft][ODBC Driver 13 for SQL
Server][SQL Server]Login failed for user 'camcops_user'. (18456)``.
- Create an ODBC data source.
- :menuselection:`Start --> ODBC Data Sources (64-bit)`.
- :menuselection:`System DSN --> Add --> ODBC Driver 13 for SQL Server`.
- Let's call this data source ``camcops_dsn``.
- Give it a description (e.g. "CamCOPS test database").
- The SQL Server will be "localhost". Next.
- Use "SQL Server authentication using a login ID and password entered by
the user". Next.
- "Change the default database to" ``camcops_db``. Next. Finish.
- As you're saving it, you'll see that it has not enabled Multiple Active
Result Sets (MARS), and you were not offered the option to do so.
- Therefore, you also need to do this from a *privileged* Windows command
prompt (via "run as administrator"):
.. code-block:: bat
odbcconf /a {CONFIGSYSDSN "ODBC Driver 13 for SQL Server" "DSN=camcops_dsn|MARS_Connection=Yes"}
- To check it worked, run *ODBC Data Source Administrator (64-bit)* again,
choose and configure your DSN again, and click "Next" until you get to the
end, without changing anything; you should now see that MARS is enabled.
If you use the ``pyodbc`` driver for SQLAlchemy, the SQLAlchemy URL for the
database should now be:
.. code-block:: none
mssql+pyodbc://camcops_user:PASSWORD@camcops_dsn
SQL Server tips
---------------
Show running queries
~~~~~~~~~~~~~~~~~~~~
Modified from
https://blog.sqlauthority.com/2009/01/07/sql-server-find-currently-running-query-t-sql/:
.. code-block:: sql
SELECT
sqltext.text,
req.start_time,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time -- this is in milliseconds
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext
ORDER BY req.start_time ASC
For details, see
https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-requests-transact-sql?view=sql-server-2017.
Note that this query contributes exactly one row to its own results.
.. _sql_server_delete_takes_forever:
DELETE takes forever
~~~~~~~~~~~~~~~~~~~~
(By "forever" I mean at more than half an hour to delete zero rows.)
- Lots of foreign key checks? See
- https://stackoverflow.com/questions/56070/delete-statement-hangs-on-sql-server-for-no-apparent-reason
- https://stackoverflow.com/questions/10901299/delete-statement-in-sql-is-very-slow
- Use the query above to show all running queries and find the ``session_id``
for the query that's freezing.
To show more detail for that session:
.. code-block:: sql
SELECT *
FROM sys.dm_exec_requests
WHERE session_id =
In an example we had, a query ``DELETE FROM _idnum_index`` was taking a
phenomenally long time and was suspended; serially, a lot of queries were being
executed like ``SELECT tr.name AS [Name], tr.object_id AS [ID] FROM
sys.triggers AS tr WHERE (tr.parent_class = 0) ORDER BY [Name] ASC``. So that's
an indication that the ``DELETE`` is causing a large set of triggers to be
searched.
- Remember that any working CamCOPS server its DDL (for any supported database
engine), so you can use a working Linux/MySQL server to show DDL for SQL
Server.
- Remember the ``DB_ECHO`` parameter in the CamCOPS config file for "routine"
SQL, and the ``--show_sql_only`` parameter to the ``upgrade_db`` command.
Potential solutions:
- https://stackoverflow.com/questions/155246/how-do-you-truncate-all-tables-in-a-database-using-tsql#156813
- https://stackoverflow.com/questions/123558/sql-server-2005-t-sql-to-temporarily-disable-a-trigger#123966
MySQL tips
----------
Create an entity relationship (ER) diagram for a MySQL database
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In MySQL Workbench, :menuselection:`Database --> Reverse Engineer`. Choose
the connection and database. The default is to create a diagram of all tables.
At the "Select Objects to Reverse Engineer / Import MySQL Table Objects" stage,
click "Show Filter" to restrict which tables are used (left column to include,
right column to exclude).