Fixed #27843 -- Fixed truncate_name() when the name contains a username.
This commit is contained in:
parent
1f7ca85866
commit
b935190572
|
@ -2,6 +2,7 @@ import datetime
|
||||||
import decimal
|
import decimal
|
||||||
import hashlib
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -178,13 +179,19 @@ def rev_typecast_decimal(d):
|
||||||
|
|
||||||
|
|
||||||
def truncate_name(name, length=None, hash_len=4):
|
def truncate_name(name, length=None, hash_len=4):
|
||||||
"""Shortens a string to a repeatable mangled version with the given length.
|
|
||||||
"""
|
"""
|
||||||
if length is None or len(name) <= length:
|
Shorten a string to a repeatable mangled version with the given length.
|
||||||
|
If a quote stripped name contains a username, e.g. USERNAME"."TABLE,
|
||||||
|
truncate the table portion only.
|
||||||
|
"""
|
||||||
|
match = re.match('([^"]+)"\."([^"]+)', name)
|
||||||
|
table_name = match.group(2) if match else name
|
||||||
|
|
||||||
|
if length is None or len(table_name) <= length:
|
||||||
return name
|
return name
|
||||||
|
|
||||||
hsh = hashlib.md5(force_bytes(name)).hexdigest()[:hash_len]
|
hsh = hashlib.md5(force_bytes(table_name)).hexdigest()[:hash_len]
|
||||||
return '%s%s' % (name[:length - hash_len], hsh)
|
return '%s%s%s' % (match.group(1) + '"."' if match else '', table_name[:length - hash_len], hsh)
|
||||||
|
|
||||||
|
|
||||||
def format_number(value, max_digits, decimal_places):
|
def format_number(value, max_digits, decimal_places):
|
||||||
|
|
|
@ -20,3 +20,7 @@ class TestLoadBackend(SimpleTestCase):
|
||||||
self.assertEqual(truncate_name('some_long_table', 10), 'some_la38a')
|
self.assertEqual(truncate_name('some_long_table', 10), 'some_la38a')
|
||||||
self.assertEqual(truncate_name('some_long_table', 10, 3), 'some_loa38')
|
self.assertEqual(truncate_name('some_long_table', 10, 3), 'some_loa38')
|
||||||
self.assertEqual(truncate_name('some_long_table'), 'some_long_table')
|
self.assertEqual(truncate_name('some_long_table'), 'some_long_table')
|
||||||
|
# "user"."table" syntax
|
||||||
|
self.assertEqual(truncate_name('username"."some_table', 10), 'username"."some_table')
|
||||||
|
self.assertEqual(truncate_name('username"."some_long_table', 10), 'username"."some_la38a')
|
||||||
|
self.assertEqual(truncate_name('username"."some_long_table', 10, 3), 'username"."some_loa38')
|
||||||
|
|
Loading…
Reference in New Issue