000
09.09.2008, 11:48
hausi
|
Hallo zusammen
Ich bin gerade dabei, eine lokale IMDB-Installation zu machen und verwende dazu das offizielle Programm moviedb. Beim Updaten der Datenbanken gibt es allerdings ein kleineres Problem, das ich mir nicht erklären kann.
Das Update wird mit Hilfe eines Makefiles gemacht, das nach dem herunterladen und nachführen der Änderungen einige Datenbanken generiert. Dazu wird das Programm mkdb (gehört auch zu moviedb) aufgerufen. Im Makefile sieht der relevante Teil wie folgt aus:
touch-dbs : $(ETCDIR)mkdb $(MKDBOPT) -create Das Problem dabei liegt im Schritt touch-dbs. Hier der Aufruf von nur diesem Schritt:
$ make ETCDIR="../etc/" MKDBOPT="" touch-dbs ../etc/mkdb -create mkdb: key file corrupt make: *** [touch-dbs] Error 255 Wenn ich mkdb allerdings manuell aus der Command Line aufrufe, funktioniert alles problemlos.
$ ../etc/mkdb -create && echo $? 0 Im Source von mkdb.c ist folgender Code für diese Ausgabe verantwortlich. MXLINELEN ist 700:
void writeNameIndexKey ( NameID nameCount ) { NameID i, count = 0 ; FILE *indexFp, *keyFp ; struct nameKeyOffset *namesIndex ; long lastOffset = 0 ; char line [ MXLINELEN ] ; char *p ;
namesIndex = (struct nameKeyOffset *) calloc ( nameCount + 5, sizeof ( struct nameKeyOffset ) ) ; if ( namesIndex == NULL ) moviedbError ( "mkdb: not enough memory to generate names index" ) ;
keyFp = openFile ( NAMEKEY ) ; indexFp = writeFile ( NAMEIDX ) ; while ( fgets ( line, MXLINELEN, keyFp ) != NULL ) { if ( ( p = strchr ( line, FSEP ) ) == NULL ) moviedbError ( "mkdb: key file corrupt" ) ; namesIndex [ count ] . nameKey = strtol ( ++p, (char **) NULL, 16) ; namesIndex [ count++ ] . offset = lastOffset ; lastOffset = ftell ( keyFp ) ; }
(void) qsort ( (void*) namesIndex, (size_t) count, sizeof ( struct nameKeyOffset ), (int (*) (const void*, const void*)) nameKeyOffsetSort ) ;
for ( i = 0 ; i < count ; i++ ) putFullOffset ( namesIndex [ i ] . offset, indexFp ) ;
(void) fclose ( keyFp ) ; (void) fclose ( indexFp ) ; free ( (void*) namesIndex ) ; } Wenn ich den Code um eine Ausgabe von line, ferror, feof und errno ergänze, dann sind alle Zeilen bis zur Zeile 742467 korrekt und auf der nächsten Zeile ist line anstatt "Herlth, Ben|661d" nur "Herlth<D2><E3>^K" (feof, ferror & errno sind immer 0). Bei dem Direktaufruf ist diese Zeile und auch alle folgenden allerdings korrekt.
Ich kann mir das ganze nicht erklären. Ein Problem des PCs ist zu 99.9% auszuschliessen und das ganze ist immer reproduzierbar. Ein auf diese Regel reduziertes, neu geschriebenes Makefile führt zu genau dem selben Ergebnis, ein Bash-Script, welches das selbe ausführt macht kein Problem.
--
Dieser Beitrag wurde am 09.09.2008 um 11:50 von hausi bearbeitet.
|
|
Profil || Suche
|
001
09.09.2008, 17:15
Tuboatse-Harald
|
Du könntest mal die Environment-Variablen ausgeben lassen und vergleichen sowie das aktuelle Verzeichnis (`pwd`).
--
Twisted and Brainfire. Das Fleisch ist willig und der Club ist eine Fleischerei!
|
|
Profil || Suche
|
002
10.09.2008, 06:00
theDon
|
Verzeichnis wird wohl stimmen, sonst wuerde es Fehler in der Art „File not found“ hageln.
--
\o tanz den naziprau! o/
And more than ever, I hope to never fall, Where enough is not the same it was before
Dieser Beitrag wurde am 10.09.2008 um 17:05 von theDon bearbeitet.
|
|
Profil || Suche
|
003
11.09.2008, 01:58
hausi
|
Habs gerade noch auf meinem Server probiert und dort klappts. Werde also wohl das Update auf dem Server ausführen lassen und die DB dann per NFS freigeben. Komisch ist es aber trotzdem. Die Environment-Variablen sind ein paar zusätzliche (von make aus), allerdings tritt das Problem nicht auf, wenn ich diese in der Shell setze und dann aufrufe. Das cwd ist bei beiden Aufrufen das selbe.
--
|
|
Profil || Suche
|