Commit af7de08e authored by Kirill Smelkov's avatar Kirill Smelkov

util/sqlite_connect: Allow 8-bit strings

Because e.g. for the following instance parameters

    <?xml version='1.0' encoding='utf-8'?>
    <instance>
      <parameter id="text">Привет Мир!</parameter>
    </instance>

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.
parent 8bf68261
...@@ -99,4 +99,5 @@ def string_to_boolean(string): ...@@ -99,4 +99,5 @@ def string_to_boolean(string):
def sqlite_connect(dburi): def sqlite_connect(dburi):
conn = sqlite3.connect(dburi) conn = sqlite3.connect(dburi)
conn.text_factory = str # allow 8-bit strings
return conn return conn
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment