diff --git a/examples/server_side_script.py b/examples/server_side_script.py new file mode 100755 index 0000000000000000000000000000000000000000..71bd9c05b4e86133cc356e1c15359701642a9486 --- /dev/null +++ b/examples/server_side_script.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# ** header v3.0 +# This file is a part of the CaosDB Project. +# +# Copyright (C) 2018 Research Group Biomedical Physics, +# Max-Planck-Institute for Dynamics and Self-Organization Göttingen +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# ** end header +# +"""server_side_script.py. + +An example which implements a minimal server-side script. + +1) This script expects to find a *.txt file in the .upload_files dir which is +printed to stdout. + +2) It executes a "Count stars" query and prints the result to stdout. + +3) It will return with code 0 if everything is ok, or with any code that is +specified with the commandline option --exit +""" + +import sys +from os import listdir +from caosdb import configure_connection, execute_query + + +# parse --auth-token option and configure connection +CODE = 0 +QUERY = "COUNT stars" +for arg in sys.argv: + if arg.startswith("--auth-token="): + auth_token = arg[13:] + configure_connection(auth_token=auth_token) + if arg.startswith("--exit="): + CODE = int(arg[7:]) + if arg.startswith("--query="): + QUERY = arg[8:] + + +############################################################ +# 1 # find and print *.txt file ############################ +############################################################ + +try: + for fname in listdir(".upload_files"): + if fname.endswith(".txt"): + with open(".upload_files/{}".format(fname)) as f: + print(f.read()) +except FileNotFoundError: + pass + + +############################################################ +# 2 # query "COUNT stars" ################################## +############################################################ + +RESULT = execute_query(QUERY) +print(RESULT) + +############################################################ +# 3 ######################################################## +############################################################ + +sys.exit(CODE) diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py index 8c32b94877d38b52caeed722c4b9821033f82cdf..e07f97134035b79b66f1bfb9c33ee3b6d33ac97d 100644 --- a/src/caosdb/common/models.py +++ b/src/caosdb/common/models.py @@ -2129,6 +2129,8 @@ class Container(list): corresponding entity e2 from C2 via e1._sync(c2). 2) Add any leftover entity from C2 to C1. """ + # TODO: This method is extremely slow. E.g. 30 seconds for 1000 + # entities. sync_dict = self._calc_sync_dict( remote_container=container, diff --git a/src/caosdb/connection/connection.py b/src/caosdb/connection/connection.py index 9c35e7cf5997854dfff97e7de8822461e5708d89..10674e71fc1ae6a1d3a85e871d484593f58fd879 100644 --- a/src/caosdb/connection/connection.py +++ b/src/caosdb/connection/connection.py @@ -67,6 +67,9 @@ class _WrappedHTTPResponse(CaosDBHTTPResponse): def getheaders(self): return self.response.getheaders() + def close(self): + self.response.close() + class _DefaultCaosDBServerConnection(CaosDBServerConnection): def __init__(self): diff --git a/src/caosdb/connection/interface.py b/src/caosdb/connection/interface.py index 1e0c7adb4b1c85862c3e3c385acfef6feca05cb2..58acf60985c9e318d1642301660bf7de8e984715 100644 --- a/src/caosdb/connection/interface.py +++ b/src/caosdb/connection/interface.py @@ -57,6 +57,20 @@ class CaosDBHTTPResponse(ABC): def getheaders(self): """Return all headers.""" + def __enter__(self): + pass + + def __exit__(self, type, value, traceback): + self.close() + + @abstractmethod + def close(self): + """close. + + Close this response. Depending on the implementation this might also + close underlying streams, sockets etc. + """ + class CaosDBServerConnection(ABC): """Abstract class which defines the interface for sending requests to the diff --git a/src/caosdb/connection/mockup.py b/src/caosdb/connection/mockup.py index ed9a25eaecb0802fb85b4a5dfc47b9867c18faca..abde5d03da4d553b523c3ecc63ff7552696cc865 100644 --- a/src/caosdb/connection/mockup.py +++ b/src/caosdb/connection/mockup.py @@ -66,6 +66,9 @@ class MockUpResponse(CaosDBHTTPResponse): def getheaders(self): return self.headers + def close(self): + pass + class MockUpServerConnection(CaosDBServerConnection): """The mock-up connection which does not actually connect to anything but diff --git a/src/caosdb/connection/streaminghttp.py b/src/caosdb/connection/streaminghttp.py index dc8d4fffd1635da7474aaa7186ff8ec5d6d0069b..fa97a964149ff1630bb3bbb3fd1cccf8029f8d6b 100644 --- a/src/caosdb/connection/streaminghttp.py +++ b/src/caosdb/connection/streaminghttp.py @@ -137,7 +137,7 @@ class StreamingHTTPSConnection(client.HTTPSConnection, object): if self.debuglevel > 0: print("sendIng a byte-like") self.sock.sendall(value) - except socket.error: - if socket.error[0] == 32: # Broken pipe + except socket.error as err: + if err.args[0] == 32: # Broken pipe self.close() raise