mirror of https://github.com/tp4a/teleport
70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
# Copyright 2012 Pinterest.com
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import logging
|
|
import pickle
|
|
|
|
try:
|
|
from cStringIO import StringIO
|
|
except ImportError:
|
|
from StringIO import StringIO
|
|
|
|
|
|
FLAG_PICKLE = 1 << 0
|
|
FLAG_INTEGER = 1 << 1
|
|
FLAG_LONG = 1 << 2
|
|
|
|
|
|
def python_memcache_serializer(key, value):
|
|
flags = 0
|
|
|
|
if isinstance(value, str):
|
|
pass
|
|
elif isinstance(value, int):
|
|
flags |= FLAG_INTEGER
|
|
value = "%d" % value
|
|
elif isinstance(value, long):
|
|
flags |= FLAG_LONG
|
|
value = "%d" % value
|
|
else:
|
|
flags |= FLAG_PICKLE
|
|
output = StringIO()
|
|
pickler = pickle.Pickler(output, 0)
|
|
pickler.dump(value)
|
|
value = output.getvalue()
|
|
|
|
return value, flags
|
|
|
|
|
|
def python_memcache_deserializer(key, value, flags):
|
|
if flags == 0:
|
|
return value
|
|
|
|
if flags & FLAG_INTEGER:
|
|
return int(value)
|
|
|
|
if flags & FLAG_LONG:
|
|
return long(value)
|
|
|
|
if flags & FLAG_PICKLE:
|
|
try:
|
|
buf = StringIO(value)
|
|
unpickler = pickle.Unpickler(buf)
|
|
return unpickler.load()
|
|
except Exception:
|
|
logging.info('Pickle error', exc_info=True)
|
|
return None
|
|
|
|
return value
|