E.6.2 Paket Bitstream (p_bitstream.py)

# -------------------------------------------------------------
# Projekt : Digitale Bibliotheken Projekt
# Uni-Frankfurt/M, Professur Telematik und
# verteilte Systeme, Prof. O. Drobnik
# Diplomarbeit, Matzen,Hans, 1997
#
# Dateiname : p_bitstream.py
# Datum : 03.11.1997
# letzte Änderung :
# Autor : Hans Matzen, 1997, Frankfurt/M, Deutschland
# Sprache : Python v1.4
# Beschreibung : Paket Bitstream, fasst alle Bitstrompaket
# Klassen zusammen
#
# Anmerkungen :
#
# -------------------------------------------------------------
import c_store
import c_bsio
import c_search
import c_glimpsearch
 
Klasse c_store
# -------------------------------------------------------------
# Projekt : Digitale Bibliotheken Projekt
# Uni-Frankfurt/M, Professur Telematik und
# verteilte Systeme, Prof. O. Drobnik
# Diplomarbeit, Matzen,Hans, 1998
# Dateiname : c_store.py
# Datum : 09.12.1997
# letzte Änderung :
# Autor : Hans Matzen, 1997, Frankfurt/M, Deutschland
# Sprache : Python v1.4
# Beschreibung : Klasse c_store bietet Methoden, um
# Dokumente in Form eines Bitstroms im
# Speicher abzulegen.
# Anmerkungen : Die Variablen CURRENT_INFILE und NEWDOCID
# werden von der Ablaufumgebung gesetzt.
#
# -------------------------------------------------------------
 
#imports
 
import sc_globals
import class_funcs
CURRENT_INFILE=" "
NEWDOCID=0
 
class c_store:
    infile=""
    outfile=""
    docid=0
    fd_in=0
    fd_out=0
    #
    # Konstruktor, setzt alle notwendigen Variablen
    # CURRENT_INFILE und NEWDOCID, werden von der
    # Ablaufumgebung gesetzt
    #
    def __init__(self):
        self.infile=sc_globals.DL_INPATH+CURRENT_INFILE
        #self.docid=class_funcs.get_newdocid()
        self.docid=NEWDOCID
        if self.docid== -1:
            print "Bekomme keine neue Doc Id."
            raise KeyboardInterrupt
        self.outfile=sc_globals.DL_BSOUTPATH+str(self.docid)+".bs"
         
    #
    # oeffnet den Eingabebitstrom
    #
    def open_in(self):
        self.fd_in=open(self.infile,"r")
         
    #
    # oeffnet den Ausgabebitstrom
    #
    def open_out(self):
        self.fd_out=open(self.outfile,"a+")
    #
    # schliesst den Eingabebitsrom
    #
    def close_in(self):
        self.fd_in.close()
    #
    # schliesst den Ausgabebitstrom
    #
    def close_out(self):
        self.fd_out.close()
    #
    # liest size Bytes aus dem Eeingabebitstrom
    #
    def read_in(self,size):
        return self.fd_in.read(size)
    #
    # schreibt outstr in den Ausgabebitstrom
    #
    def write_out(self,outstr):
        self.fd_out.write(outstr)
         
    #
    # setzt die Position der Lese-/Schreibmarke
    # des Eingabebitstroms Syntax: wie Python seek Befehl
    #
    def seek_in(self,offset,whence):
        return self.fd_in.seek(offset,whence)
     
    #
    # setzt die Position der Lese-/Schreibmarke
    # des Ausgabebitstroms Syntax: wie Python seek Befehl
    #
    def seek_out(self,offset,whence):
        return self.fd_out.seek(offset,whence)
    #
    # liefert die Position der Lese-/Schreibmarke
    # des Eingabebitstroms zurueck
    #
    def tell_in(self):
        return self.fd_in.tell()
     
    #
    # liefert die Position der Lese-/Schreibmarke
    # des Ausgabebitstroms zurueck
    #
    def tell_out(self):
        return self.fd_out.tell()
     
    #
    # vermerkt in den Metadaten des Dokuments, dass es als
    # Bitstrom im Speicher abgelegt wurde.
    #
    def register_store(self):
        query="update doc_description set bs_stored='t' where docnr="
        query=query+str(self.docid)+";"
        res=self.conn.exec_query(query)
        if res.commandstatus()[0:6]!="UPDATE":
            print "Fehler bei Update in register_sgmlstore"
            return -1
        else:
            return 0
 
Klasse c_search
# -------------------------------------------------------------
# Projekt : Digitale Bibliotheken Projekt
# Uni-Frankfurt/M, Professur Telematik und
# verteilte Systeme, Prof. O. Drobnik
# Diplomarbeit, Matzen,Hans, 1998
# Dateiname : c_search.py
# Datum : 09.12.1997
# letzte Änderung : 15.01.98
# Autor : Hans Matzen, 1997, Frankfurt/M, Deutschland
# Sprache : Python v1.4
# Beschreibung : Klasse zum Volltextsuche in einem bestimmten
# Dokument
# Anmerkungen :
#
# -------------------------------------------------------------
 
class c_search:
    #
    # Konstruktor, initialisert Variable
    #
    def __init__(self,docid):
        from sc_globals import *
        self.dir=DL_FULLTEXT_DIR
        self.docid=docid
 
    #
    # Durchsucht das Dokument nach dem durch searchstr
    # gegebenen und/oder-verknuepften Begriffen
    # Dabei steht "; fuer oder" und "& fuer und"
    # Ergebnis ist eine Liste von Zeilen, in denen
    # der Ausdruck vorkommt
    #
    def search(self,searchstr):
        slist=string.split(searchstr,"&")
        erglist=[]
        for i in slist:
            erglist.append(self.searchor(i))
             
        erg=[]
        for i in erglist[0]:
            flag=1
            for j in erglist[1:]:
                if not (i in j):
                    flag=0
                    break
            if flag==1:
                erg.append(i)
 
        return erg
 
    #
    # Wei search nur werden lediglich veroderter
    # Ausdruecke verabreitet
    #
    def searchor(self,searchstr):
        slist=string.split(searchstr,";")
        fd=open(self.dir+self.docid,"r")
        buff=" "
        while buff!="":
            buff=fd.readline()
            for i in slist:
                if string.find(buff,i):
                    erg.append(buff)
        fd.close()
        return erg
 
 
Klasse c_glimpsearch
# -------------------------------------------------------------
# Projekt : Digitale Bibliotheken Projekt
# Uni-Frankfurt/M, Professur Telematik und
# verteilte Systeme, Prof. O. Drobnik
# Diplomarbeit, Matzen,Hans, 1998
# Dateiname : c_glimpsearch.py
# Datum : 09.12.1997
# letzte Änderung :
# Autor : Hans Matzen, 1997, Frankfurt/M, Deutschland
# Sprache : Python v1.4
# Beschreibung : Eine Klasse um mit glimpse eine Volltext-
# recherche durchzufuehren.
# Anmerkungen :
#
# -------------------------------------------------------------
 
class c_glimp_search:
    #
    # Konstruktor, initialisert Variable
    #
    def __init__(self,sparams):
        import string
        from sc_globals import *
        self.dir=DL_FULLTEXT_DIR
        self.params=sparams
        self.resfile=DL_FULLTEXT_RESULTS
 
    #
    # Durchsucht alle als Bitstrom gespeicherten Dokumente
    # nach dem durch searchstr
    # gegebenen und/oder-verknuepften Begriffen
    # Dabei steht "; fuer oder" und "& fuer und"
    # Ergebnis ist eine Liste von Zeilen, in denen
    # der Ausdruck vorkommt
    #
    def glimp_search(self,searchstr):
        slist=string.split(searchstr,"&")
        erglist=[]
        for i in slist:
            erglist.append(self.glimp_searchor(i))
 
        erg=[]
        for i in erglist[0]:
            flag=1
            for j in erglist[1:]:
                if not (i in j):
                    flag=0
                    break
            if flag==1:
                erg.append(i)
 
        return erg
 
    #
    # Wie glimp_search es werden aber lediglich veroderter
    # Ausdruecke verarbeitet
    #
    def glimp_searchor(self,searchstr):
        import os
        erg=[]
        os.system("glimpse -y -H "+self.dir+" "+self.params+" "+searchstr+" >"+self.resfile)
        fd=open(self.resfile,"r")
        buff=" "
        while buff!="":
            buff=fd.readline()
            erg.append(buff[:-1])
             
        fd.close()
        os.unlink(self.resfile)
        return erg[:-1]