##############################################################################
#
# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
import os
import threading
import logging

from ZODB.loglevels import BLATHER

LOG_THREAD_ID = 0 # Set this to 1 during heavy debugging

logger = logging.getLogger('ZEO.zrpc')

_label = "%s" % os.getpid()

def new_label():
    global _label
    _label = str(os.getpid())

def log(message, level=BLATHER, label=None, exc_info=False):
    label = label or _label
    if LOG_THREAD_ID:
        label = label + ':' + threading.currentThread().getName()
    logger.log(level, '(%s) %s' % (label, message), exc_info=exc_info)

REPR_LIMIT = 60

def short_repr(obj):
    "Return an object repr limited to REPR_LIMIT bytes."

    # Some of the objects being repr'd are large strings. A lot of memory
    # would be wasted to repr them and then truncate, so they are treated
    # specially in this function.
    # Also handle short repr of a tuple containing a long string.

    # This strategy works well for arguments to StorageServer methods.
    # The oid is usually first and will get included in its entirety.
    # The pickle is near the beginning, too, and you can often fit the
    # module name in the pickle.

    if isinstance(obj, str):
        if len(obj) > REPR_LIMIT:
            r = repr(obj[:REPR_LIMIT])
        else:
            r = repr(obj)
        if len(r) > REPR_LIMIT:
            r = r[:REPR_LIMIT-4] + '...' + r[-1]
        return r
    elif isinstance(obj, (list, tuple)):
        elts = []
        size = 0
        for elt in obj:
            r = short_repr(elt)
            elts.append(r)
            size += len(r)
            if size > REPR_LIMIT:
                break
        if isinstance(obj, tuple):
            r = "(%s)" % (", ".join(elts))
        else:
            r = "[%s]" % (", ".join(elts))
    else:
        r = repr(obj)
    if len(r) > REPR_LIMIT:
        return r[:REPR_LIMIT] + '...'
    else:
        return r
