sql: use publisher unpickler to unpickle sql data (#36697)

This commit is contained in:
Frédéric Péters 2019-10-04 16:18:43 +02:00
parent fdd25e474c
commit a6dfbcf669
1 changed files with 13 additions and 7 deletions

View File

@ -14,6 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
from cStringIO import StringIO
import psycopg2
import psycopg2.extensions
import datetime
@ -26,6 +27,7 @@ from . import qommon
from .qommon.storage import _take, parse_clause as parse_storage_clause
from .qommon.substitution import invalidate_substitution_cache
from .qommon import get_cfg
from .publisher import UnpicklerClass
import wcs.categories
import wcs.carddata
@ -57,6 +59,10 @@ SQL_TYPE_MAPPING = {
}
def pickle_loads(value):
return UnpicklerClass(StringIO(value)).load()
class Criteria(qommon.storage.Criteria):
def __init__(self, attribute, value, **kwargs):
self.attribute = attribute.replace('-', '_')
@ -1172,7 +1178,7 @@ class SqlMixin(object):
if sql_type == 'date':
value = value.timetuple()
elif sql_type == 'bytea':
value = cPickle.loads(str(value))
value = pickle_loads(str(value))
obdata[field.id] = value
i += 1
if field.store_display_value:
@ -1182,7 +1188,7 @@ class SqlMixin(object):
if field.store_structured_value:
value = row[i]
if value is not None:
obdata['%s_structured' % field.id] = cPickle.loads(str(value))
obdata['%s_structured' % field.id] = pickle_loads(str(value))
if obdata['%s_structured' % field.id] is None:
del obdata['%s_structured' % field.id]
i += 1
@ -1288,7 +1294,7 @@ class SqlDataMixin(SqlMixin):
if o.time:
o.time = o.time.timetuple()
if row[6]:
o.parts = cPickle.loads(str(row[6]))
o.parts = pickle_loads(str(row[6]))
return o
def set_evolution(self, value):
@ -1504,11 +1510,11 @@ class SqlDataMixin(SqlMixin):
if o.receipt_time:
o.receipt_time = o.receipt_time.timetuple()
if o.workflow_data:
o.workflow_data = cPickle.loads(str(o.workflow_data))
o.workflow_data = pickle_loads(str(o.workflow_data))
if o.workflow_roles:
o.workflow_roles = cPickle.loads(str(o.workflow_roles))
o.workflow_roles = pickle_loads(str(o.workflow_roles))
if o.submission_context:
o.submission_context = cPickle.loads(str(o.submission_context))
o.submission_context = pickle_loads(str(o.submission_context))
o.geolocations = {}
for i, field in enumerate((cls._formdef.geolocations or {}).keys()):
@ -1904,7 +1910,7 @@ class Session(SqlMixin, wcs.sessions.BasicSession):
def _row2ob(cls, row):
o = cls.__new__(cls)
cls.id = str_encode(row[0])
session_data = cPickle.loads(str(row[1]))
session_data = pickle_loads(str(row[1]))
for k, v in session_data.items():
setattr(o, k, v)
return o