• Kirill Smelkov's avatar
    util/sqlite_connect: Allow 8-bit strings · af7de08e
    Kirill Smelkov authored
    Because e.g. for the following instance parameters
        <?xml version='1.0' encoding='utf-8'?>
          <parameter id="text">Привет Мир!</parameter>
    we get the following DB query
        'UPDATE %s SET slap_state="busy" ,software_release=? ,partition_reference=? ,requested_by=? ,software_type=? ,xml=? WHERE
    reference=? AND computer_reference=?',
        ['http://sr//', 'myinstance', 'slappart0', 'default',
         '<?xml version=\'1.0\' encoding=\'utf-8\'?>\n<instance>\n  <parameter id="text">\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\xd0\x9c\xd0\xb8\xd1\x80!</parameter>\n</instance>\n',
         'slappart6', 'computer']
    which fails the following way:
      File ".../site-packages/flask/app.py", line 1817, in wsgi_app
        response = self.full_dispatch_request()
      File ".../site-packages/flask/app.py", line 1477, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File ".../site-packages/flask/app.py", line 1381, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File ".../site-packages/flask/app.py", line 1475, in full_dispatch_request
        rv = self.dispatch_request()
      File ".../site-packages/flask/app.py", line 1461, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "slapos/proxy/views.py", line 393, in requestComputerPartition
        software_instance = requestNotSlave(**parsed_request_dict)
      File "slapos/proxy/views.py", line 609, in requestNotSlave
        execute_db('partition', q, args)
      File "slapos/proxy/views.py", line 142, in execute_db
        cur = db.execute(query, args)
    ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
    our instance parameters is always XML UTF-8 encoded, and thus it is not
    unicode and we cannot go the 'use unicode always' way.
    So autotune sqlite connections on open to support 8-bit strings.
util.py 3.27 KB