jueves, 15 de marzo de 2012

Schema kmkey_document en SQL

0 comentarios
 
Algunas configuraciones de KMKey, especialmente de calidad, tienen el schema kmkey_document en SQL. Hemos detectado que eso, junto con el uso de DiskFile, puede provocar serios problemas en la gestión de las transacciones, que además no resultan fácilmente reproducibles. Es por ello que aconsejamos a todos los usuarios que cambien su configuración, si se dá el caso descrito. Básicamente la solución consiste en separar el schema kmkey_document en dos, uno sin Diskfile y en SQL, y otro con Diskfile y sin SQL. Para un entorno en producción se requieren algunos pasos más a fin de conservar los datos. Son los que detallamos a continuación:

1- Añadir un schema kmkey_document_file, con un campo 'file' de tipo CPS Disk File, con una write expresion python:file

2- NO eliminar aún el campo file de kmkey_document

3- Añadir al portal_type el schema, pero ojo, el primero:

metadata common kmkey_document_file kmkey_document

4- Regrabar todos los documentos, por consola (via kmkey/zope/bin/zopectl debug):

site = app.kmkey
site._p_jar.cacheGC()
site._p_jar.sync()
from AccessControl.SecurityManagement import newSecurityManager
from Testing.makerequest import makerequest
user = site.acl_users.getUser('manager').__of__(site.acl_users)
newSecurityManager({}, user)
app = makerequest(app)
site = app.kmkey
cat = site.portal_catalog
site._p_jar.cacheGC()
site._p_jar.sync()
brains = cat(meta_type='KM Document')
erronis=[]
i=0
for brain in brains:
  i=i+1
  ob = brain.getObject().getContent()
  try:
      dm = ob.getDataModel()
  except 'StorageError':
     erronis.append(brain)
  dm._commit()
  if i%5==0 or i>=len(brains):
     get_transaction().commit()
     site._p_jar.sync()
     i

5- Ir al schema kmkey_document_file y eliminar la write expression

6- Eliminar el campo file del schema kmkey_document

7- Eliminar el campo file de la tabla SQL

psql kmkey_zodb
alter table kmkey_document add column file_old text;
update kmkey_document set file_old = file;
alter table kmkey_document drop column file;

Leave a Reply