[Python] Konwersja bazy rozszerzeń z OO.o 3.3 do OO 3.4

Makropolecenia i programy współpracujące z OpenOffice tworzone w językach innych niż Basic

[Python] Konwersja bazy rozszerzeń z OO.o 3.3 do OO 3.4

Postprzez quest-88 » Pn sty 23, 2012 12:14 am

W związku ze zmianą licencji OpenOffice'a z LGPL na Apache, trwa namiętne usuwanie kodu niezgodnego z nowymi zasadami licencjonowania. Ofiarą tego procederu padła baza dla rozszerzeń berkeleyDB, dlatego też Apache OpenOffice 3.4 nie zaimportuje starych ustawień. Wszystkie dotychczasowe rozszerzenia trzeba będzie wprowadzić na nowo.

Aby temu zaradzić, hanya (Japończyk) napisał skrypt w Pythonie, który zrobi to za użytkownika. Poniżej wklejam oryginalny opis i kod:

***

The coming Apache OpenOffice 3.4 does not have Berkeley Database because of IP clearance therefore uno_packages.db file which is used to store informations about installed extensions on your office environment is no longer loaded. The library of Berkeley Database is completely removed and the migration of the file is not planned. You can install extensions on new environment but it is troublesome for some extensions installed.

The following python script convert old db to new format, pmap.

How to use:

Kod: Zaznacz cały   Rozszerz widokZwiń widok
python migrate_db.py


If you do not have the settings of the office in the default place or you get failed to find the setting, specify its path with -u option. See help with -h option for more detail.

Never tested on Windows Vista and Windows 7.

Kod: Zaznacz cały   Rozszerz widokZwiń widok
#! /bin/env python

import bsddb
from optparse import OptionParser
import os
import os.path
import re
import platform

__doc__ = """There is no file spacification for uno_packages.db
and uno_packages.pmap but you can find its implementation in
main/desktop/source/deployment/dp_persmap.cxx of the source code. """


def get_items(packages):
    """ Open Berkeley database file and read its content.
   
   # Format of uno_packages.db
   # Berkeley detabase
   # Ignore white spaces in key and value
   # key: 0xFF EXTENSION_ID
   # value: TEMP_NAME 0xFF PACKAGE_NAME 0xFF PACKAGE_MIME_TYPE 0xFF VERSION 0xFF 0
   # The last value is always zero in value because of it is not used anymore.
   """
    items = {}
    d = bsddb.hashopen(packages + ".db", "r")
    for k, v in d.iteritems():
        items[k] = v
    d.close()
    return items


def write_pmap(packages, items):
    """ Write to pmap file.
   
   # Format of uno_packages.pmap
   # file header: Pmp1
   # Ignore white space in the body.
   # body: key \n value \n
   # file footer: \n
   # The 00 ... 0F are replaced with %0 ... %F and
   # % is replaced with %% in key and value.
   """
    magic = "Pmp1"
   
    regexp = re.compile("(\x00|\x01|\x02|\x03|\x04|\x05|\x06|\x07|\x08|\x09|\x0a|\x0b|\x0c|\x0d|\x0e|\x0f|%)")
    def encode(m):
        # 00 ... 0F -> %0 ... %F, % -> %%
        c = m.group(0)
        if c == "%":
            return "%%"
        else:
            n = ord(c)
            if n < 0x09:
                return "%%%s" % chr(0x30 + n)
            else:
                return "%%%s" % chr(0x37 + n)
   
    lines = []
    for k, v in items.iteritems():
        lines.append(regexp.sub(encode, k))
        lines.append(regexp.sub(encode, v))
   
    lines.append("\n")
   
    f = open(packages + ".pmap", "w")
    f.write(magic)
    f.write("\n".join(lines))
    f.flush()
    f.close()


def main():
    """ Tries to convert uno_packages.db to pmap. """
    USER_KEY = "user"
    if os.sep == "/":
        data_dir = os.path.join("~", ".openoffice.org")
    elif platform.system() == "Windows":
        release = platform.release()
        if release == "XP" or release == "2000":
            data_dir = os.path.join("~", "Application Data", "OpenOffice.org")
        else:
            data_dir = os.path.join("~", "AppData", "OpenOffice.org")
   
    parser = OptionParser()
    parser.add_option("-u", dest=USER_KEY,
        help="Data directory of the office. Default: %s" % data_dir)
    parser.set_default(USER_KEY, data_dir)
   
    options, args = parser.parse_args()
   
    packages_dir = os.path.join(
        os.path.expanduser(getattr(options, USER_KEY)),
        "3", "user",
        "uno_packages", "cache")
   
    # check user directory is exist
    if not os.path.exists(packages_dir):
        print("Error: %s is not found." % packages_dir)
        return
    packages_path = os.path.join(packages_dir, "uno_packages")
   
    items = get_items(packages_path)
    write_pmap(packages_path, items)


if __name__ == "__main__":
    main()


Źródło: http://hermione.s41.xrea.com/pukiwiki/i ... obbs3%2F78
Standardowa diagnostyka rozwiązuje 90% problemów typu "wcześniej działało, ale już nie działa".
Przepis na LibreOffice
Uzyskałeś pomoc? Poinformuj innych o sprawdzonym rozwiązaniu i podziękuj. Dodaj [SOLVED] w tytule.
Avatar użytkownika
quest-88
 
Posty: 1105
Dołączył(a): N maja 24, 2009 8:12 pm
Lokalizacja: Zabrze

Powrót do Java, Python i inne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość