2010-03-04 18 views
1

J'utilise l'interface Ruby C officielle de Ruby et je ne suis pas capable de travailler en bzip. Il a fait construire avec le soutien bzip, ./configure dit:L'interface Ruby C de TokyoCabinet ne peut pas bzip

checking bzlib.h usability... yes 
checking bzlib.h presence... yes 
checking for bzlib.h... yes 

J'ai donc écrit cet exemple programme qui écrit juste une entrée à deux fichiers, un soi-disant bzip'd et un non. Aucun n'est compressé; Mis à part le simple test de taille de fichier à la fin, je peux éditer le fichier with_bzip.tcb et voir le texte de la chaîne brute ici.

require 'tokyocabinet' 
include TokyoCabinet 

def write filename, options 
    File.unlink filename if File.exists? filename 
    bdb = BDB::new 
    bdb.tune(0, 0, 0, -1 -1, options) or raise "Couldn't tune" 
    bdb.open(filename, BDB::OWRITER | BDB::OCREAT | BDB::OLCKNB) or raise "Couldn't open" 
    bdb["test"] = "This string should be compressed and not appear raw.\n" * 10000 
    bdb.close 
end 

write 'without_bzip.tcb', 0 
write 'with_bzip.tcb', BDB::TBZIP 
puts "Not actually compressed" unless File.size('with_bzip.tcb') < File.size('without_bzip.tcb') 

Ce qui fait pire est que si je tente une version préliminaire de l'Oklahoma Mixer (exemple suivant - bien que je n'ai pas la réputation d'ajouter la nouvelle balise), il compresse bien. Quand j'ai glissé un peu de débogage dans son appel try(), il semble faire le même appel pour accorder (0, 0, 0, -1, -1, 4). Je suis complètement perplexe - quelqu'un peut-il me dire ce que mon code ci-dessus fait mal?

require 'oklahoma_mixer' 
OklahomaMixer.open("minimal_om.tcb", :opts => 'lb') do |db| 
    db["test"] = "This string should be compressed and not appear raw.\n" * 10000 
end 

Répondre

1

C'est un bug maléfique et subtil. J'ai omis une virgule dans l'appel tune() et ai écrit -1 -1 au lieu de -1, -1. Tous les arguments sont optionnels, donc il était discrètement bzipping. Argh.