From 26c4aaeb815881f79e4128f207f29c0b02f5553a Mon Sep 17 00:00:00 2001
From: Kazuhiko Shiozaki <kazuhiko@nexedi.com>
Date: Thu, 14 Mar 2013 14:42:38 +0100
Subject: [PATCH] use ZODB.utils.get_pickle_metadata instead of
 pickle.Unpickler.

* it is faster.
* it does not require Products.
---
 erp5/util/zodbanalyze/__init__.py | 29 +++--------------------------
 1 file changed, 3 insertions(+), 26 deletions(-)

diff --git a/erp5/util/zodbanalyze/__init__.py b/erp5/util/zodbanalyze/__init__.py
index a3e4706909..112a11fe3f 100644
--- a/erp5/util/zodbanalyze/__init__.py
+++ b/erp5/util/zodbanalyze/__init__.py
@@ -2,22 +2,9 @@
 
 # Based on a transaction analyzer by Matt Kromer.
 
-import pickle
-import re
 import sys
-import types
 from ZODB.FileStorage import FileStorage
-from cStringIO import StringIO
-
-class FakeError(Exception):
-    def __init__(self, module, name):
-        Exception.__init__(self)
-        self.module = module
-        self.name = name
-
-class FakeUnpickler(pickle.Unpickler):
-    def find_class(self, module, name):
-        raise FakeError(module, name)
+from ZODB.utils import get_pickle_metadata
 
 class Report:
     def __init__(self):
@@ -97,18 +84,8 @@ def analyze_trans(report, txn):
         analyze_rec(report, rec)
 
 def get_type(record):
-    try:
-        unpickled = FakeUnpickler(StringIO(record.data)).load()
-    except FakeError, err:
-        return "%s.%s" % (err.module, err.name)
-    except:
-        raise
-    classinfo = unpickled[0]
-    if isinstance(classinfo, types.TupleType):
-        mod, klass = classinfo
-        return "%s.%s" % (mod, klass)
-    else:
-        return str(classinfo)
+    mod, klass = get_pickle_metadata(record.data)
+    return "%s.%s" % (mod, klass)
 
 def analyze_rec(report, record):
     oid = record.oid
-- 
2.30.9