heroku-tokyotyrant 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +504 -0
- data/README.rdoc +231 -0
- data/Rakefile +72 -0
- data/benchmarks/balancer.rb +101 -0
- data/benchmarks/bulk_db.rb +74 -0
- data/benchmarks/bulk_table.rb +87 -0
- data/benchmarks/db.rb +114 -0
- data/benchmarks/table.rb +161 -0
- data/ext/extconf.rb +43 -0
- data/ext/tokyo/bin/tcamgr +0 -0
- data/ext/tokyo/bin/tcamttest +0 -0
- data/ext/tokyo/bin/tcatest +0 -0
- data/ext/tokyo/bin/tcbmgr +0 -0
- data/ext/tokyo/bin/tcbmttest +0 -0
- data/ext/tokyo/bin/tcbtest +0 -0
- data/ext/tokyo/bin/tcfmgr +0 -0
- data/ext/tokyo/bin/tcfmttest +0 -0
- data/ext/tokyo/bin/tcftest +0 -0
- data/ext/tokyo/bin/tchmgr +0 -0
- data/ext/tokyo/bin/tchmttest +0 -0
- data/ext/tokyo/bin/tchtest +0 -0
- data/ext/tokyo/bin/tcrmgr +0 -0
- data/ext/tokyo/bin/tcrmttest +0 -0
- data/ext/tokyo/bin/tcrtest +0 -0
- data/ext/tokyo/bin/tctmgr +0 -0
- data/ext/tokyo/bin/tctmttest +0 -0
- data/ext/tokyo/bin/tcttest +0 -0
- data/ext/tokyo/bin/tcucodec +0 -0
- data/ext/tokyo/bin/tcumttest +0 -0
- data/ext/tokyo/bin/tcutest +0 -0
- data/ext/tokyo/bin/ttserver +0 -0
- data/ext/tokyo/bin/ttulmgr +0 -0
- data/ext/tokyo/bin/ttultest +0 -0
- data/ext/tokyo/include/tcadb.h +548 -0
- data/ext/tokyo/include/tcbdb.h +1101 -0
- data/ext/tokyo/include/tcfdb.h +858 -0
- data/ext/tokyo/include/tchdb.h +871 -0
- data/ext/tokyo/include/tcrdb.h +801 -0
- data/ext/tokyo/include/tctdb.h +1086 -0
- data/ext/tokyo/include/tculog.h +392 -0
- data/ext/tokyo/include/tcutil.h +4184 -0
- data/ext/tokyo/include/ttutil.h +494 -0
- data/ext/tokyo/lib/libtokyocabinet.9.4.0.dylib +0 -0
- data/ext/tokyo/lib/libtokyocabinet.9.dylib +0 -0
- data/ext/tokyo/lib/libtokyocabinet.a +0 -0
- data/ext/tokyo/lib/libtokyocabinet.dylib +0 -0
- data/ext/tokyo/lib/libtokyotyrant.3.22.0.dylib +0 -0
- data/ext/tokyo/lib/libtokyotyrant.3.dylib +0 -0
- data/ext/tokyo/lib/libtokyotyrant.a +0 -0
- data/ext/tokyo/lib/libtokyotyrant.dylib +0 -0
- data/ext/tokyo/lib/pkgconfig/tokyocabinet.pc +14 -0
- data/ext/tokyo/lib/pkgconfig/tokyotyrant.pc +14 -0
- data/ext/tokyo/lib/ttskeldir.bundle +0 -0
- data/ext/tokyo/lib/ttskelmock.bundle +0 -0
- data/ext/tokyo/lib/ttskelnull.bundle +0 -0
- data/ext/tokyo/lib/ttskelproxy.bundle +0 -0
- data/ext/tokyo/libexec/tcawmgr.cgi +0 -0
- data/ext/tokyo/sbin/ttservctl +163 -0
- data/ext/tokyo/share/man/man1/tcamgr.1 +97 -0
- data/ext/tokyo/share/man/man1/tcamttest.1 +35 -0
- data/ext/tokyo/share/man/man1/tcatest.1 +55 -0
- data/ext/tokyo/share/man/man1/tcbmgr.1 +125 -0
- data/ext/tokyo/share/man/man1/tcbmttest.1 +81 -0
- data/ext/tokyo/share/man/man1/tcbtest.1 +107 -0
- data/ext/tokyo/share/man/man1/tcfmgr.1 +98 -0
- data/ext/tokyo/share/man/man1/tcfmttest.1 +62 -0
- data/ext/tokyo/share/man/man1/tcftest.1 +73 -0
- data/ext/tokyo/share/man/man1/tchmgr.1 +110 -0
- data/ext/tokyo/share/man/man1/tchmttest.1 +85 -0
- data/ext/tokyo/share/man/man1/tchtest.1 +95 -0
- data/ext/tokyo/share/man/man1/tcrmgr.1 +164 -0
- data/ext/tokyo/share/man/man1/tcrmttest.1 +55 -0
- data/ext/tokyo/share/man/man1/tcrtest.1 +89 -0
- data/ext/tokyo/share/man/man1/tctmgr.1 +140 -0
- data/ext/tokyo/share/man/man1/tctmttest.1 +92 -0
- data/ext/tokyo/share/man/man1/tcttest.1 +105 -0
- data/ext/tokyo/share/man/man1/tcucodec.1 +162 -0
- data/ext/tokyo/share/man/man1/tcumttest.1 +41 -0
- data/ext/tokyo/share/man/man1/tcutest.1 +81 -0
- data/ext/tokyo/share/man/man1/ttserver.1 +84 -0
- data/ext/tokyo/share/man/man1/ttulmgr.1 +40 -0
- data/ext/tokyo/share/man/man1/ttultest.1 +16 -0
- data/ext/tokyo/share/man/man3/tcadb.3 +676 -0
- data/ext/tokyo/share/man/man3/tcbdb.3 +1355 -0
- data/ext/tokyo/share/man/man3/tcfdb.3 +975 -0
- data/ext/tokyo/share/man/man3/tchdb.3 +898 -0
- data/ext/tokyo/share/man/man3/tclist.3 +1 -0
- data/ext/tokyo/share/man/man3/tcmap.3 +1 -0
- data/ext/tokyo/share/man/man3/tcmdb.3 +1 -0
- data/ext/tokyo/share/man/man3/tcmpool.3 +1 -0
- data/ext/tokyo/share/man/man3/tcrdb.3 +1309 -0
- data/ext/tokyo/share/man/man3/tctdb.3 +1110 -0
- data/ext/tokyo/share/man/man3/tctree.3 +1 -0
- data/ext/tokyo/share/man/man3/tculog.3 +15 -0
- data/ext/tokyo/share/man/man3/tcutil.3 +4518 -0
- data/ext/tokyo/share/man/man3/tcxstr.3 +1 -0
- data/ext/tokyo/share/man/man3/tokyocabinet.3 +132 -0
- data/ext/tokyo/share/man/man3/ttutil.3 +14 -0
- data/ext/tokyo/share/man/man8/ttservctl.8 +37 -0
- data/ext/tokyo/share/tokyocabinet/COPYING +504 -0
- data/ext/tokyo/share/tokyocabinet/ChangeLog +1252 -0
- data/ext/tokyo/share/tokyocabinet/THANKS +12 -0
- data/ext/tokyo/share/tokyocabinet/doc/benchmark.pdf +0 -0
- data/ext/tokyo/share/tokyocabinet/doc/common.css +211 -0
- data/ext/tokyo/share/tokyocabinet/doc/icon16.png +0 -0
- data/ext/tokyo/share/tokyocabinet/doc/index.html +156 -0
- data/ext/tokyo/share/tokyocabinet/doc/index.ja.html +197 -0
- data/ext/tokyo/share/tokyocabinet/doc/logo-ja.png +0 -0
- data/ext/tokyo/share/tokyocabinet/doc/logo.png +0 -0
- data/ext/tokyo/share/tokyocabinet/doc/spex-en.html +7145 -0
- data/ext/tokyo/share/tokyocabinet/doc/spex-ja.html +7476 -0
- data/ext/tokyo/share/tokyocabinet/doc/tokyoproducts.pdf +0 -0
- data/ext/tokyo/share/tokyocabinet/doc/tokyoproducts.ppt +0 -0
- data/ext/tokyo/share/tokyotyrant/COPYING +504 -0
- data/ext/tokyo/share/tokyotyrant/ChangeLog +578 -0
- data/ext/tokyo/share/tokyotyrant/THANKS +15 -0
- data/ext/tokyo/share/tokyotyrant/doc/common.css +211 -0
- data/ext/tokyo/share/tokyotyrant/doc/index.html +79 -0
- data/ext/tokyo/share/tokyotyrant/doc/spex.html +2264 -0
- data/ext/tokyo/share/tokyotyrant/ext/mapreduce.lua +57 -0
- data/ext/tokyo/share/tokyotyrant/ext/queue.lua +55 -0
- data/ext/tokyo/share/tokyotyrant/ext/senatus.lua +532 -0
- data/ext/tokyo/share/tokyotyrant/ext/usherette.lua +438 -0
- data/ext/tokyo_tyrant.c +147 -0
- data/ext/tokyo_tyrant.h +48 -0
- data/ext/tokyo_tyrant_db.c +227 -0
- data/ext/tokyo_tyrant_db.h +8 -0
- data/ext/tokyo_tyrant_module.c +453 -0
- data/ext/tokyo_tyrant_module.h +10 -0
- data/ext/tokyo_tyrant_query.c +226 -0
- data/ext/tokyo_tyrant_query.h +9 -0
- data/ext/tokyo_tyrant_table.c +319 -0
- data/ext/tokyo_tyrant_table.h +8 -0
- data/ext/tokyocabinet-1.4.41/COPYING +504 -0
- data/ext/tokyocabinet-1.4.41/ChangeLog +1252 -0
- data/ext/tokyocabinet-1.4.41/Makefile.in +825 -0
- data/ext/tokyocabinet-1.4.41/README +38 -0
- data/ext/tokyocabinet-1.4.41/THANKS +12 -0
- data/ext/tokyocabinet-1.4.41/bros/Makefile +133 -0
- data/ext/tokyocabinet-1.4.41/bros/bdbtest.c +438 -0
- data/ext/tokyocabinet-1.4.41/bros/cdbtest.c +219 -0
- data/ext/tokyocabinet-1.4.41/bros/cmpsqltctest.c +186 -0
- data/ext/tokyocabinet-1.4.41/bros/gdbmtest.c +216 -0
- data/ext/tokyocabinet-1.4.41/bros/mapreporter +72 -0
- data/ext/tokyocabinet-1.4.41/bros/maptest.cc +677 -0
- data/ext/tokyocabinet-1.4.41/bros/ndbmtest.c +204 -0
- data/ext/tokyocabinet-1.4.41/bros/qdbmtest.c +375 -0
- data/ext/tokyocabinet-1.4.41/bros/reporter +141 -0
- data/ext/tokyocabinet-1.4.41/bros/result.xls +0 -0
- data/ext/tokyocabinet-1.4.41/bros/sdbmtest.c +204 -0
- data/ext/tokyocabinet-1.4.41/bros/sqltest.c +404 -0
- data/ext/tokyocabinet-1.4.41/bros/tctest.c +748 -0
- data/ext/tokyocabinet-1.4.41/bros/tdbtest.c +205 -0
- data/ext/tokyocabinet-1.4.41/configure +7402 -0
- data/ext/tokyocabinet-1.4.41/configure.in +362 -0
- data/ext/tokyocabinet-1.4.41/doc/benchmark.pdf +0 -0
- data/ext/tokyocabinet-1.4.41/doc/common.css +211 -0
- data/ext/tokyocabinet-1.4.41/doc/icon16.png +0 -0
- data/ext/tokyocabinet-1.4.41/doc/index.html +156 -0
- data/ext/tokyocabinet-1.4.41/doc/index.ja.html +197 -0
- data/ext/tokyocabinet-1.4.41/doc/logo-ja.png +0 -0
- data/ext/tokyocabinet-1.4.41/doc/logo.png +0 -0
- data/ext/tokyocabinet-1.4.41/doc/spex-en.html +7145 -0
- data/ext/tokyocabinet-1.4.41/doc/spex-ja.html +7476 -0
- data/ext/tokyocabinet-1.4.41/doc/tokyoproducts.pdf +0 -0
- data/ext/tokyocabinet-1.4.41/doc/tokyoproducts.ppt +0 -0
- data/ext/tokyocabinet-1.4.41/example/Makefile +113 -0
- data/ext/tokyocabinet-1.4.41/example/tcadbex.c +55 -0
- data/ext/tokyocabinet-1.4.41/example/tcbdbex.c +64 -0
- data/ext/tokyocabinet-1.4.41/example/tcfdbex.c +60 -0
- data/ext/tokyocabinet-1.4.41/example/tchdbex.c +60 -0
- data/ext/tokyocabinet-1.4.41/example/tctchat.c +97 -0
- data/ext/tokyocabinet-1.4.41/example/tctchat.tmpl +141 -0
- data/ext/tokyocabinet-1.4.41/example/tctdbex.c +85 -0
- data/ext/tokyocabinet-1.4.41/example/tctsearch.c +95 -0
- data/ext/tokyocabinet-1.4.41/example/tctsearch.tmpl +122 -0
- data/ext/tokyocabinet-1.4.41/example/tcutilex.c +77 -0
- data/ext/tokyocabinet-1.4.41/f.tsv +2 -0
- data/ext/tokyocabinet-1.4.41/lab/calccomp +118 -0
- data/ext/tokyocabinet-1.4.41/lab/datechange +56 -0
- data/ext/tokyocabinet-1.4.41/lab/diffcheck +45 -0
- data/ext/tokyocabinet-1.4.41/lab/htmltotsv +102 -0
- data/ext/tokyocabinet-1.4.41/lab/magic +19 -0
- data/ext/tokyocabinet-1.4.41/lab/printenv.cgi +27 -0
- data/ext/tokyocabinet-1.4.41/lab/stepcount +26 -0
- data/ext/tokyocabinet-1.4.41/lab/stopwatch +61 -0
- data/ext/tokyocabinet-1.4.41/lab/tabcheck +43 -0
- data/ext/tokyocabinet-1.4.41/lab/wgettsv +239 -0
- data/ext/tokyocabinet-1.4.41/lab/widthcheck +57 -0
- data/ext/tokyocabinet-1.4.41/man/htmltoman +104 -0
- data/ext/tokyocabinet-1.4.41/man/tcadb.3 +676 -0
- data/ext/tokyocabinet-1.4.41/man/tcamgr.1 +97 -0
- data/ext/tokyocabinet-1.4.41/man/tcamttest.1 +35 -0
- data/ext/tokyocabinet-1.4.41/man/tcatest.1 +55 -0
- data/ext/tokyocabinet-1.4.41/man/tcbdb.3 +1355 -0
- data/ext/tokyocabinet-1.4.41/man/tcbmgr.1 +125 -0
- data/ext/tokyocabinet-1.4.41/man/tcbmttest.1 +81 -0
- data/ext/tokyocabinet-1.4.41/man/tcbtest.1 +107 -0
- data/ext/tokyocabinet-1.4.41/man/tcfdb.3 +975 -0
- data/ext/tokyocabinet-1.4.41/man/tcfmgr.1 +98 -0
- data/ext/tokyocabinet-1.4.41/man/tcfmttest.1 +62 -0
- data/ext/tokyocabinet-1.4.41/man/tcftest.1 +73 -0
- data/ext/tokyocabinet-1.4.41/man/tchdb.3 +898 -0
- data/ext/tokyocabinet-1.4.41/man/tchmgr.1 +110 -0
- data/ext/tokyocabinet-1.4.41/man/tchmttest.1 +85 -0
- data/ext/tokyocabinet-1.4.41/man/tchtest.1 +95 -0
- data/ext/tokyocabinet-1.4.41/man/tclist.3 +1 -0
- data/ext/tokyocabinet-1.4.41/man/tcmap.3 +1 -0
- data/ext/tokyocabinet-1.4.41/man/tcmdb.3 +1 -0
- data/ext/tokyocabinet-1.4.41/man/tcmpool.3 +1 -0
- data/ext/tokyocabinet-1.4.41/man/tctdb.3 +1110 -0
- data/ext/tokyocabinet-1.4.41/man/tctmgr.1 +140 -0
- data/ext/tokyocabinet-1.4.41/man/tctmttest.1 +92 -0
- data/ext/tokyocabinet-1.4.41/man/tctree.3 +1 -0
- data/ext/tokyocabinet-1.4.41/man/tcttest.1 +105 -0
- data/ext/tokyocabinet-1.4.41/man/tcucodec.1 +162 -0
- data/ext/tokyocabinet-1.4.41/man/tcumttest.1 +41 -0
- data/ext/tokyocabinet-1.4.41/man/tcutest.1 +81 -0
- data/ext/tokyocabinet-1.4.41/man/tcutil.3 +4518 -0
- data/ext/tokyocabinet-1.4.41/man/tcxstr.3 +1 -0
- data/ext/tokyocabinet-1.4.41/man/tokyocabinet.3 +132 -0
- data/ext/tokyocabinet-1.4.41/md5.c +381 -0
- data/ext/tokyocabinet-1.4.41/md5.h +101 -0
- data/ext/tokyocabinet-1.4.41/myconf.c +493 -0
- data/ext/tokyocabinet-1.4.41/myconf.h +549 -0
- data/ext/tokyocabinet-1.4.41/tcadb.c +4339 -0
- data/ext/tokyocabinet-1.4.41/tcadb.h +548 -0
- data/ext/tokyocabinet-1.4.41/tcamgr.c +1019 -0
- data/ext/tokyocabinet-1.4.41/tcamttest.c +542 -0
- data/ext/tokyocabinet-1.4.41/tcatest.c +1845 -0
- data/ext/tokyocabinet-1.4.41/tcawmgr.c +482 -0
- data/ext/tokyocabinet-1.4.41/tcbdb.c +4180 -0
- data/ext/tokyocabinet-1.4.41/tcbdb.h +1101 -0
- data/ext/tokyocabinet-1.4.41/tcbmgr.c +1012 -0
- data/ext/tokyocabinet-1.4.41/tcbmttest.c +1810 -0
- data/ext/tokyocabinet-1.4.41/tcbtest.c +2586 -0
- data/ext/tokyocabinet-1.4.41/tcfdb.c +2746 -0
- data/ext/tokyocabinet-1.4.41/tcfdb.h +858 -0
- data/ext/tokyocabinet-1.4.41/tcfmgr.c +786 -0
- data/ext/tokyocabinet-1.4.41/tcfmttest.c +1220 -0
- data/ext/tokyocabinet-1.4.41/tcftest.c +1695 -0
- data/ext/tokyocabinet-1.4.41/tchdb.c +5153 -0
- data/ext/tokyocabinet-1.4.41/tchdb.h +871 -0
- data/ext/tokyocabinet-1.4.41/tchmgr.c +842 -0
- data/ext/tokyocabinet-1.4.41/tchmttest.c +1757 -0
- data/ext/tokyocabinet-1.4.41/tchtest.c +2129 -0
- data/ext/tokyocabinet-1.4.41/tctdb.c +6199 -0
- data/ext/tokyocabinet-1.4.41/tctdb.h +1086 -0
- data/ext/tokyocabinet-1.4.41/tctmgr.c +1241 -0
- data/ext/tokyocabinet-1.4.41/tctmttest.c +1563 -0
- data/ext/tokyocabinet-1.4.41/tcttest.c +2062 -0
- data/ext/tokyocabinet-1.4.41/tcucodec.c +1357 -0
- data/ext/tokyocabinet-1.4.41/tcumttest.c +578 -0
- data/ext/tokyocabinet-1.4.41/tcutest.c +1875 -0
- data/ext/tokyocabinet-1.4.41/tcutil.c +10528 -0
- data/ext/tokyocabinet-1.4.41/tcutil.h +4184 -0
- data/ext/tokyocabinet-1.4.41/tokyocabinet.idl +336 -0
- data/ext/tokyocabinet-1.4.41/tokyocabinet.pc.in +14 -0
- data/ext/tokyotyrant-1.1.39/COPYING +504 -0
- data/ext/tokyotyrant-1.1.39/ChangeLog +578 -0
- data/ext/tokyotyrant-1.1.39/Makefile.in +365 -0
- data/ext/tokyotyrant-1.1.39/README +38 -0
- data/ext/tokyotyrant-1.1.39/THANKS +15 -0
- data/ext/tokyotyrant-1.1.39/configure +6979 -0
- data/ext/tokyotyrant-1.1.39/configure.in +300 -0
- data/ext/tokyotyrant-1.1.39/doc/common.css +211 -0
- data/ext/tokyotyrant-1.1.39/doc/index.html +79 -0
- data/ext/tokyotyrant-1.1.39/doc/spex.html +2264 -0
- data/ext/tokyotyrant-1.1.39/example/Makefile +68 -0
- data/ext/tokyotyrant-1.1.39/example/httptest.pl +88 -0
- data/ext/tokyotyrant-1.1.39/example/mcftest.pl +39 -0
- data/ext/tokyotyrant-1.1.39/example/mctest.pl +43 -0
- data/ext/tokyotyrant-1.1.39/example/tcrdbex +0 -0
- data/ext/tokyotyrant-1.1.39/example/tcrdbex.c +49 -0
- data/ext/tokyotyrant-1.1.39/example/tcrdbex.o +0 -0
- data/ext/tokyotyrant-1.1.39/example/tcrdbtblex +0 -0
- data/ext/tokyotyrant-1.1.39/example/tcrdbtblex.c +79 -0
- data/ext/tokyotyrant-1.1.39/example/tcrdbtblex.o +0 -0
- data/ext/tokyotyrant-1.1.39/ext/mapreduce.lua +57 -0
- data/ext/tokyotyrant-1.1.39/ext/queue.lua +55 -0
- data/ext/tokyotyrant-1.1.39/ext/senatus.lua +532 -0
- data/ext/tokyotyrant-1.1.39/ext/usherette.lua +438 -0
- data/ext/tokyotyrant-1.1.39/lab/datechange +56 -0
- data/ext/tokyotyrant-1.1.39/lab/diffcheck +45 -0
- data/ext/tokyotyrant-1.1.39/lab/fibonacci.lua +20 -0
- data/ext/tokyotyrant-1.1.39/lab/footprint.lua +67 -0
- data/ext/tokyotyrant-1.1.39/lab/highlow.lua +88 -0
- data/ext/tokyotyrant-1.1.39/lab/killdualmaster +12 -0
- data/ext/tokyotyrant-1.1.39/lab/rundualmaster +38 -0
- data/ext/tokyotyrant-1.1.39/lab/stepcount +26 -0
- data/ext/tokyotyrant-1.1.39/lab/tabcheck +43 -0
- data/ext/tokyotyrant-1.1.39/lab/ushrtregister.pl +55 -0
- data/ext/tokyotyrant-1.1.39/lab/widthcheck +57 -0
- data/ext/tokyotyrant-1.1.39/man/htmltoman +100 -0
- data/ext/tokyotyrant-1.1.39/man/tcrdb.3 +1309 -0
- data/ext/tokyotyrant-1.1.39/man/tcrmgr.1 +164 -0
- data/ext/tokyotyrant-1.1.39/man/tcrmttest.1 +55 -0
- data/ext/tokyotyrant-1.1.39/man/tcrtest.1 +89 -0
- data/ext/tokyotyrant-1.1.39/man/tculog.3 +15 -0
- data/ext/tokyotyrant-1.1.39/man/ttservctl.8 +37 -0
- data/ext/tokyotyrant-1.1.39/man/ttserver.1 +84 -0
- data/ext/tokyotyrant-1.1.39/man/ttulmgr.1 +40 -0
- data/ext/tokyotyrant-1.1.39/man/ttultest.1 +16 -0
- data/ext/tokyotyrant-1.1.39/man/ttutil.3 +14 -0
- data/ext/tokyotyrant-1.1.39/myconf.c +169 -0
- data/ext/tokyotyrant-1.1.39/myconf.h +408 -0
- data/ext/tokyotyrant-1.1.39/scrext.c +2394 -0
- data/ext/tokyotyrant-1.1.39/scrext.h +96 -0
- data/ext/tokyotyrant-1.1.39/tcrdb.c +2637 -0
- data/ext/tokyotyrant-1.1.39/tcrdb.h +801 -0
- data/ext/tokyotyrant-1.1.39/tcrmgr.c +1559 -0
- data/ext/tokyotyrant-1.1.39/tcrmttest.c +915 -0
- data/ext/tokyotyrant-1.1.39/tcrtest.c +1542 -0
- data/ext/tokyotyrant-1.1.39/tculog.c +1211 -0
- data/ext/tokyotyrant-1.1.39/tculog.h +392 -0
- data/ext/tokyotyrant-1.1.39/tokyotyrant.idl +143 -0
- data/ext/tokyotyrant-1.1.39/tokyotyrant.pc.in +14 -0
- data/ext/tokyotyrant-1.1.39/ttservctl +163 -0
- data/ext/tokyotyrant-1.1.39/ttserver.c +3583 -0
- data/ext/tokyotyrant-1.1.39/ttskeldir.c +141 -0
- data/ext/tokyotyrant-1.1.39/ttskelmock.c +64 -0
- data/ext/tokyotyrant-1.1.39/ttskelnull.c +79 -0
- data/ext/tokyotyrant-1.1.39/ttskelproxy.c +74 -0
- data/ext/tokyotyrant-1.1.39/ttulmgr.c +266 -0
- data/ext/tokyotyrant-1.1.39/ttultest.c +371 -0
- data/ext/tokyotyrant-1.1.39/ttutil.c +1510 -0
- data/ext/tokyotyrant-1.1.39/ttutil.h +494 -0
- data/lib/tokyo_tyrant/balancer.rb +189 -0
- data/spec/ext.lua +4 -0
- data/spec/plu_db.rb +538 -0
- data/spec/spec.rb +1 -0
- data/spec/spec_base.rb +17 -0
- data/spec/start_tyrants.sh +36 -0
- data/spec/stop_tyrants.sh +9 -0
- data/spec/tokyo_tyrant_balancer_db_spec.rb +160 -0
- data/spec/tokyo_tyrant_balancer_table_spec.rb +177 -0
- data/spec/tokyo_tyrant_query_spec.rb +159 -0
- data/spec/tokyo_tyrant_spec.rb +254 -0
- data/spec/tokyo_tyrant_table_spec.rb +301 -0
- metadata +402 -0
@@ -0,0 +1 @@
|
|
1
|
+
.so man3/tcutil.3
|
@@ -0,0 +1,132 @@
|
|
1
|
+
.TH "TOKYOCABINET" 3 "2009-10-13" "Man Page" "Tokyo Cabinet"
|
2
|
+
|
3
|
+
.SH NAME
|
4
|
+
tokyocabinet \- a modern implementation of DBM
|
5
|
+
|
6
|
+
.SH INTRODUCTION
|
7
|
+
.PP
|
8
|
+
Tokyo Cabinet is a library of routines for managing a database. The database is a simple data file containing records, each is a pair of a key and a value. Every key and value is serial bytes with variable length. Both binary data and character string can be used as a key and a value. There is neither concept of data tables nor data types. Records are organized in hash table, B+ tree, or fixed\-length array.
|
9
|
+
.PP
|
10
|
+
As for database of hash table, each key must be unique within a database, so it is impossible to store two or more records with a key overlaps. The following access methods are provided to the database: storing a record with a key and a value, deleting a record by a key, retrieving a record by a key. Moreover, traversal access to every key are provided, although the order is arbitrary. These access methods are similar to ones of DBM (or its followers: NDBM and GDBM) library defined in the UNIX standard. Tokyo Cabinet is an alternative for DBM because of its higher performance.
|
11
|
+
.PP
|
12
|
+
As for database of B+ tree, records whose keys are duplicated can be stored. Access methods of storing, deleting, and retrieving are provided as with the database of hash table. Records are stored in order by a comparison function assigned by a user. It is possible to access each record with the cursor in ascending or descending order. According to this mechanism, forward matching search for strings and range search for integers are realized.
|
13
|
+
.PP
|
14
|
+
As for database of fixed\-length array, records are stored with unique natural numbers. It is impossible to store two or more records with a key overlaps. Moreover, the length of each record is limited by the specified length. Provided operations are the same as ones of hash database.
|
15
|
+
.PP
|
16
|
+
Table database is also provided as a variant of hash database. Each record is identified by the primary key and has a set of named columns. Although there is no concept of data schema, it is possible to search for records with complex conditions efficiently by using indices of arbitrary columns.
|
17
|
+
.PP
|
18
|
+
Tokyo Cabinet is written in the C language, and provided as API of C, Perl, Ruby, Java, and Lua. Tokyo Cabinet is available on platforms which have API conforming to C99 and POSIX. Tokyo Cabinet is a free software licensed under the GNU Lesser General Public License.
|
19
|
+
|
20
|
+
.SH THE DINOSAUR WING OF THE DBM FORKS
|
21
|
+
.PP
|
22
|
+
Tokyo Cabinet is developed as the successor of GDBM and QDBM on the following purposes. They are achieved and Tokyo Cabinet replaces conventional DBM products.
|
23
|
+
.PP
|
24
|
+
.RS
|
25
|
+
improves space efficiency : smaller size of database file.
|
26
|
+
.br
|
27
|
+
improves time efficiency : faster processing speed.
|
28
|
+
.br
|
29
|
+
improves parallelism : higher performance in multi\-thread environment.
|
30
|
+
.br
|
31
|
+
improves usability : simplified API.
|
32
|
+
.br
|
33
|
+
improves robustness : database file is not corrupted even under catastrophic situation.
|
34
|
+
.br
|
35
|
+
supports 64\-bit architecture : enormous memory space and database file are available.
|
36
|
+
.br
|
37
|
+
.RE
|
38
|
+
.PP
|
39
|
+
As with QDBM, the following three restrictions of traditional DBM: a process can handle only one database, the size of a key and a value is bounded, a database file is sparse, are cleared. Moreover, the following three restrictions of QDBM: the size of a database file is limited to 2GB, environments with different byte orders can not share a database file, only one thread can search a database at the same time, are cleared.
|
40
|
+
.PP
|
41
|
+
Tokyo Cabinet runs very fast. For example, elapsed time to store 1 million records is 0.7 seconds for hash database, and 1.6 seconds for B+ tree database. Moreover, the size of database of Tokyo Cabinet is very small. For example, overhead for a record is 16 bytes for hash database, and 5 bytes for B+ tree database. Furthermore, scalability of Tokyo Cabinet is great. The database size can be up to 8EB (9.22e18 bytes).
|
42
|
+
|
43
|
+
.SH EFFECTIVE IMPLEMENTATION OF HASH DATABASE
|
44
|
+
.PP
|
45
|
+
Tokyo Cabinet uses hash algorithm to retrieve records. If a bucket array has sufficient number of elements, the time complexity of retrieval is "O(1)". That is, time required for retrieving a record is constant, regardless of the scale of a database. It is also the same about storing and deleting. Collision of hash values is managed by separate chaining. Data structure of the chains is binary search tree. Even if a bucket array has unusually scarce elements, the time complexity of retrieval is "O(log n)".
|
46
|
+
.PP
|
47
|
+
Tokyo Cabinet attains improvement in retrieval by loading RAM with the whole of a bucket array. If a bucket array is on RAM, it is possible to access a region of a target record by about one path of file operations. A bucket array saved in a file is not read into RAM with the `read' call but directly mapped to RAM with the `mmap' call. Therefore, preparation time on connecting to a database is very short, and two or more processes can share the same memory map.
|
48
|
+
.PP
|
49
|
+
If the number of elements of a bucket array is about half of records stored within a database, although it depends on characteristic of the input, the probability of collision of hash values is about 56.7% (36.8% if the same, 21.3% if twice, 11.5% if four times, 6.0% if eight times). In such case, it is possible to retrieve a record by two or less paths of file operations. If it is made into a performance index, in order to handle a database containing one million of records, a bucket array with half a million of elements is needed. The size of each element is 4 bytes. That is, if 2M bytes of RAM is available, a database containing one million records can be handled.
|
50
|
+
.PP
|
51
|
+
Traditional DBM provides two modes of the storing operations: "insert" and "replace". In the case a key overlaps an existing record, the insert mode keeps the existing value, while the replace mode transposes it to the specified value. In addition to the two modes, Tokyo Cabinet provides "concatenate" mode. In the mode, the specified value is concatenated at the end of the existing value and stored. This feature is useful when adding an element to a value as an array.
|
52
|
+
.PP
|
53
|
+
Generally speaking, while succession of updating, fragmentation of available regions occurs, and the size of a database grows rapidly. Tokyo Cabinet deal with this problem by coalescence of dispensable regions and reuse of them. When overwriting a record with a value whose size is greater than the existing one, it is necessary to remove the region to another position of the file. Because the time complexity of the operation depends on the size of the region of a record, extending values successively is inefficient. However, Tokyo Cabinet deal with this problem by alignment. If increment can be put in padding, it is not necessary to remove the region.
|
54
|
+
.PP
|
55
|
+
The "free block pool" to reuse dispensable regions efficiently is also implemented. It keeps a list of dispensable regions and reuse the "best fit" region, that is the smallest region in the list, when a new block is requested. Because fragmentation is inevitable even then, two kinds of optimization (defragmentation) mechanisms are implemented. The first is called static optimization which deploys all records into another file and then writes them back to the original file at once. The second is called dynamic optimization which gathers up dispensable regions by replacing the locations of records and dispensable regions gradually.
|
56
|
+
|
57
|
+
.SH USEFUL IMPLEMENTATION OF B+ TREE DATABASE
|
58
|
+
.PP
|
59
|
+
Although B+ tree database is slower than hash database, it features ordering access to each record. The order can be assigned by users. Records of B+ tree are sorted and arranged in logical pages. Sparse index organized in B tree that is multiway balanced tree are maintained for each page. Thus, the time complexity of retrieval and so on is "O(log n)". Cursor is provided to access each record in order. The cursor can jump to a position specified by a key and can step forward or backward from the current position. Because each page is arranged as double linked list, the time complexity of stepping cursor is "O(1)".
|
60
|
+
.PP
|
61
|
+
B+ tree database is implemented, based on above hash database. Because each page of B+ tree is stored as each record of hash database, B+ tree database inherits efficiency of storage management of hash database. Because the header of each record is smaller and alignment of each page is adjusted according to the page size, in most cases, the size of database file is cut by half compared to one of hash database. Although operation of many pages are required to update B+ tree, QDBM expedites the process by caching pages and reducing file operations. In most cases, because whole of the sparse index is cached on memory, it is possible to retrieve a record by one or less path of file operations.
|
62
|
+
.PP
|
63
|
+
Each pages of B+ tree can be stored with compressed. Two compression method; Deflate of ZLIB and Block Sorting of BZIP2, are supported. Because each record in a page has similar patterns, high efficiency of compression is expected due to the Lempel\-Ziv or the BWT algorithms. In case handling text data, the size of a database is reduced to about 25%. If the scale of a database is large and disk I/O is the bottleneck, featuring compression makes the processing speed improved to a large extent.
|
64
|
+
|
65
|
+
.SH NAIVE IMPLEMENTATION OF FIXED\-LENGTH DATABASE
|
66
|
+
.PP
|
67
|
+
Fixed\-length database has restrictions that each key should be a natural number and that the length of each value is limited. However, time efficiency and space efficiency are higher than the other data structures as long as the use case is within the restriction.
|
68
|
+
.PP
|
69
|
+
Because the whole region of the database is mapped on memory by the `mmap' call and referred as a multidimensional array, the overhead related to the file I/O is minimized. Due to this simple structure, fixed\-length database works faster than hash database, and its concurrency in multi\-thread environment is prominent.
|
70
|
+
.PP
|
71
|
+
The size of the database is proportional to the range of keys and the limit size of each value. That is, the smaller the range of keys is or the smaller the length of each value is, the higher the space efficiency is. For example, if the maximum key is 1000000 and the limit size of the value is 100 bytes, the size of the database will be about 100MB. Because regions around referred records are only loaded on the RAM, you can increase the size of the database to the size of the virtual memory.
|
72
|
+
|
73
|
+
.SH FLEXIBLE IMPLEMENTATION OF TABLE DATABASE
|
74
|
+
.PP
|
75
|
+
Table database does not express simple key/value structure but expresses a structure like a table of relational database. Each record is identified by the primary key and has a set of multiple columns named with arbitrary strings. For example, a stuff in your company can be expressed by a record identified by the primary key of the employee ID number and structured by columns of his name, division, salary, and so on. Unlike relational database, table database does not need to define any data schema and can contain records of various structures different from each other.
|
76
|
+
.PP
|
77
|
+
Table database supports query functions with not only the primary key but also with conditions about arbitrary columns. Each column condition is composed of the name of a column and a condition expression. Operators of full matching, forward matching, regular expression matching, and so on are provided for the string type. Operators of full matching, range matching and so on are provided for the number type. Operators for tag search and full-text search are also provided. A query can contain multiple conditions for logical intersection. Search by multiple queries for logical union is also available. The order of the result set can be specified as the ascending or descending order of strings or numbers.
|
78
|
+
.PP
|
79
|
+
You can create indices for arbitrary columns to improve performance of search and sorting. Although columns do not have data types, indices have types for strings or numbers. Inverted indices for space separated tokens and character N-gram tokens are also supported. The query optimizer uses indices in suitable way according to each query. Indices are implemented as different files of B+ tree database.
|
80
|
+
|
81
|
+
.SH PRACTICAL FUNCTIONALITY
|
82
|
+
.PP
|
83
|
+
Databases on the filesystem feature transaction mechanisms. It is possible to commit a series of operations between the beginning and the end of the transaction in a lump, or to abort the transaction and perform rollback to the state before the transaction. Two isolation levels are supported; serializable and read uncommitted. Durability is secured by write ahead logging and shadow paging.
|
84
|
+
.PP
|
85
|
+
Tokyo Cabinet provides two modes to connect to a database: "reader" and "writer". A reader can perform retrieving but neither storing nor deleting. A writer can perform all access methods. Exclusion control between processes is performed when connecting to a database by file locking. While a writer is connected to a database, neither readers nor writers can be connected. While a reader is connected to a database, other readers can be connect, but writers can not. According to this mechanism, data consistency is guaranteed with simultaneous connections in multitasking environment.
|
86
|
+
.PP
|
87
|
+
Functions of API of Tokyo cabinet are reentrant and available in multi\-thread environment. Discrete database object can be operated in parallel entirely. For simultaneous operations of the same database object, read\-write lock is used for exclusion control. That is, while a writing thread is operating the database, other reading threads and writing threads are blocked. However, while a reading thread is operating the database, reading threads are not blocked. The locking granularity of hash database and fixed\-length database is per record, and that of the other databases is per file.
|
88
|
+
|
89
|
+
.SH SIMPLE BUT VARIOUS INTERFACES
|
90
|
+
.PP
|
91
|
+
Tokyo Cabinet provides simple API based on the object oriented design. Every operation for database is encapsulated and published as lucid methods as `open' (connect), `close' (disconnect), `put' (insert), `out' (remove), `get' (retrieve), and so on. Because the three of hash, B+ tree, and fixed\-length array database APIs are very similar with each other, porting an application from one to the other is easy. Moreover, the abstract API is provided to handle these databases with the same interface. Applications of the abstract API can determine the type of the database in runtime.
|
92
|
+
.PP
|
93
|
+
The utility API is also provided. Such fundamental data structure as list and map are included. And, some useful features; memory pool, string processing, encoding, are also included.
|
94
|
+
.PP
|
95
|
+
Six kinds of API; the utility API, the hash database API, the B+ tree database API, the fixed\-length database API, the table database API, and the abstract database API, are provided for the C language. Command line interfaces are also provided corresponding to each API. They are useful for prototyping, test, and debugging. Except for C, Tokyo Cabinet provides APIs for Perl, Ruby, Java, and Lua. APIs for other languages will hopefully be provided by third party.
|
96
|
+
.PP
|
97
|
+
In cases that multiple processes access a database at the same time or some processes access a database on a remote host, the remote service is useful. The remote service is composed of a database server and its access library. Applications can access the database server by using the remote database API. The server implements HTTP and the memcached protocol partly so that client programs on almost all platforms can access the server easily.
|
98
|
+
|
99
|
+
.SH HOW TO USE THE LIBRARY
|
100
|
+
.PP
|
101
|
+
Tokyo Cabinet provides API of the C language and it is available by programs conforming to the C89 (ANSI C) standard or the C99 standard. As the header files of Tokyo Cabinet are provided as `\fBtcutil.h\fR', `\fBtchdb.h\fR', and `\fBtcbdb.h\fR', applications should include one or more of them accordingly to use the API. As the library is provided as `\fBlibtokyocabinet.a\fR' and `\fBlibtokyocabinet.so\fR' and they depends `\fBlibz.so\fR', `\fBlibrt.so\fR', `\fBlibpthread.so\fR', `\fBlibm.so\fR', and `\fBlibc.so\fR', linker options `\fB\-ltokyocabinet\fR', `\fB\-lz\fR', `\fB\-lbz2\fR', `\fB\-lrt\fR', `\fB\-lpthread\fR', `\fB\-lm\fR', and `\fB\-lc\fR' are required for build command. A typical build command is the following.
|
102
|
+
.PP
|
103
|
+
.RS
|
104
|
+
gcc \-I/usr/local/include tc_example.c \-o tc_example \\
|
105
|
+
.br
|
106
|
+
\-L/usr/local/lib \-ltokyocabinet \-lz \-lbz2 \-lrt \-lpthread \-lm \-lc
|
107
|
+
.RE
|
108
|
+
.PP
|
109
|
+
You can also use Tokyo Cabinet in programs written in C++. Because each header is wrapped in C linkage (`\fBextern "C"\fR' block), you can simply include them into your C++ programs.
|
110
|
+
|
111
|
+
.SH LICENSE
|
112
|
+
.PP
|
113
|
+
Tokyo Cabinet is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License or any later version.
|
114
|
+
.PP
|
115
|
+
Tokyo Cabinet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
116
|
+
.PP
|
117
|
+
You should have received a copy of the GNU Lesser General Public License along with Tokyo Cabinet (See the file `\fBCOPYING\fR'); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307 USA.
|
118
|
+
.PP
|
119
|
+
Tokyo Cabinet was written by Mikio Hirabayashi. You can contact the author by e\-mail to `\fBhirarin@gmail.com\fR'.
|
120
|
+
|
121
|
+
.SH SEE ALSO
|
122
|
+
.PP
|
123
|
+
.BR tcutil (3),
|
124
|
+
.BR tchdb (3),
|
125
|
+
.BR tcbdb (3),
|
126
|
+
.BR tcfdb (3),
|
127
|
+
.BR tctdb (3),
|
128
|
+
.BR tcadb (3)
|
129
|
+
.PP
|
130
|
+
Please see
|
131
|
+
.I http://1978th.net/tokyocabinet/
|
132
|
+
for detail.
|
@@ -0,0 +1,381 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved.
|
3
|
+
|
4
|
+
This software is provided 'as-is', without any express or implied
|
5
|
+
warranty. In no event will the authors be held liable for any damages
|
6
|
+
arising from the use of this software.
|
7
|
+
|
8
|
+
Permission is granted to anyone to use this software for any purpose,
|
9
|
+
including commercial applications, and to alter it and redistribute it
|
10
|
+
freely, subject to the following restrictions:
|
11
|
+
|
12
|
+
1. The origin of this software must not be misrepresented; you must not
|
13
|
+
claim that you wrote the original software. If you use this software
|
14
|
+
in a product, an acknowledgment in the product documentation would be
|
15
|
+
appreciated but is not required.
|
16
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
17
|
+
misrepresented as being the original software.
|
18
|
+
3. This notice may not be removed or altered from any source distribution.
|
19
|
+
|
20
|
+
L. Peter Deutsch
|
21
|
+
ghost@aladdin.com
|
22
|
+
|
23
|
+
*/
|
24
|
+
/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */
|
25
|
+
/*
|
26
|
+
Independent implementation of MD5 (RFC 1321).
|
27
|
+
|
28
|
+
This code implements the MD5 Algorithm defined in RFC 1321, whose
|
29
|
+
text is available at
|
30
|
+
http://www.ietf.org/rfc/rfc1321.txt
|
31
|
+
The code is derived from the text of the RFC, including the test suite
|
32
|
+
(section A.5) but excluding the rest of Appendix A. It does not include
|
33
|
+
any code or documentation that is identified in the RFC as being
|
34
|
+
copyrighted.
|
35
|
+
|
36
|
+
The original and principal author of md5.c is L. Peter Deutsch
|
37
|
+
<ghost@aladdin.com>. Other authors are noted in the change history
|
38
|
+
that follows (in reverse chronological order):
|
39
|
+
|
40
|
+
2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
|
41
|
+
either statically or dynamically; added missing #include <string.h>
|
42
|
+
in library.
|
43
|
+
2002-03-11 lpd Corrected argument list for main(), and added int return
|
44
|
+
type, in test program and T value program.
|
45
|
+
2002-02-21 lpd Added missing #include <stdio.h> in test program.
|
46
|
+
2000-07-03 lpd Patched to eliminate warnings about "constant is
|
47
|
+
unsigned in ANSI C, signed in traditional"; made test program
|
48
|
+
self-checking.
|
49
|
+
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
50
|
+
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
|
51
|
+
1999-05-03 lpd Original version.
|
52
|
+
*/
|
53
|
+
|
54
|
+
#include "md5.h"
|
55
|
+
#include <string.h>
|
56
|
+
|
57
|
+
#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */
|
58
|
+
#ifdef ARCH_IS_BIG_ENDIAN
|
59
|
+
# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
|
60
|
+
#else
|
61
|
+
# define BYTE_ORDER 0
|
62
|
+
#endif
|
63
|
+
|
64
|
+
#define T_MASK ((md5_word_t)~0)
|
65
|
+
#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
|
66
|
+
#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
|
67
|
+
#define T3 0x242070db
|
68
|
+
#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
|
69
|
+
#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
|
70
|
+
#define T6 0x4787c62a
|
71
|
+
#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
|
72
|
+
#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
|
73
|
+
#define T9 0x698098d8
|
74
|
+
#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
|
75
|
+
#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
|
76
|
+
#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
|
77
|
+
#define T13 0x6b901122
|
78
|
+
#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
|
79
|
+
#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
|
80
|
+
#define T16 0x49b40821
|
81
|
+
#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
|
82
|
+
#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
|
83
|
+
#define T19 0x265e5a51
|
84
|
+
#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
|
85
|
+
#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
|
86
|
+
#define T22 0x02441453
|
87
|
+
#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
|
88
|
+
#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
|
89
|
+
#define T25 0x21e1cde6
|
90
|
+
#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
|
91
|
+
#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
|
92
|
+
#define T28 0x455a14ed
|
93
|
+
#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
|
94
|
+
#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
|
95
|
+
#define T31 0x676f02d9
|
96
|
+
#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
|
97
|
+
#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
|
98
|
+
#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
|
99
|
+
#define T35 0x6d9d6122
|
100
|
+
#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
|
101
|
+
#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
|
102
|
+
#define T38 0x4bdecfa9
|
103
|
+
#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
|
104
|
+
#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
|
105
|
+
#define T41 0x289b7ec6
|
106
|
+
#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
|
107
|
+
#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
|
108
|
+
#define T44 0x04881d05
|
109
|
+
#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
|
110
|
+
#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
|
111
|
+
#define T47 0x1fa27cf8
|
112
|
+
#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
|
113
|
+
#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
|
114
|
+
#define T50 0x432aff97
|
115
|
+
#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
|
116
|
+
#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
|
117
|
+
#define T53 0x655b59c3
|
118
|
+
#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
|
119
|
+
#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
|
120
|
+
#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
|
121
|
+
#define T57 0x6fa87e4f
|
122
|
+
#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
|
123
|
+
#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
|
124
|
+
#define T60 0x4e0811a1
|
125
|
+
#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
|
126
|
+
#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
|
127
|
+
#define T63 0x2ad7d2bb
|
128
|
+
#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
|
129
|
+
|
130
|
+
|
131
|
+
static void
|
132
|
+
md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
|
133
|
+
{
|
134
|
+
md5_word_t
|
135
|
+
a = pms->abcd[0], b = pms->abcd[1],
|
136
|
+
c = pms->abcd[2], d = pms->abcd[3];
|
137
|
+
md5_word_t t;
|
138
|
+
#if BYTE_ORDER > 0
|
139
|
+
/* Define storage only for big-endian CPUs. */
|
140
|
+
md5_word_t X[16];
|
141
|
+
#else
|
142
|
+
/* Define storage for little-endian or both types of CPUs. */
|
143
|
+
md5_word_t xbuf[16];
|
144
|
+
const md5_word_t *X;
|
145
|
+
#endif
|
146
|
+
|
147
|
+
{
|
148
|
+
#if BYTE_ORDER == 0
|
149
|
+
/*
|
150
|
+
* Determine dynamically whether this is a big-endian or
|
151
|
+
* little-endian machine, since we can use a more efficient
|
152
|
+
* algorithm on the latter.
|
153
|
+
*/
|
154
|
+
static const int w = 1;
|
155
|
+
|
156
|
+
if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
|
157
|
+
#endif
|
158
|
+
#if BYTE_ORDER <= 0 /* little-endian */
|
159
|
+
{
|
160
|
+
/*
|
161
|
+
* On little-endian machines, we can process properly aligned
|
162
|
+
* data without copying it.
|
163
|
+
*/
|
164
|
+
if (!((data - (const md5_byte_t *)0) & 3)) {
|
165
|
+
/* data are properly aligned */
|
166
|
+
X = (const md5_word_t *)data;
|
167
|
+
} else {
|
168
|
+
/* not aligned */
|
169
|
+
memcpy(xbuf, data, 64);
|
170
|
+
X = xbuf;
|
171
|
+
}
|
172
|
+
}
|
173
|
+
#endif
|
174
|
+
#if BYTE_ORDER == 0
|
175
|
+
else /* dynamic big-endian */
|
176
|
+
#endif
|
177
|
+
#if BYTE_ORDER >= 0 /* big-endian */
|
178
|
+
{
|
179
|
+
/*
|
180
|
+
* On big-endian machines, we must arrange the bytes in the
|
181
|
+
* right order.
|
182
|
+
*/
|
183
|
+
const md5_byte_t *xp = data;
|
184
|
+
int i;
|
185
|
+
|
186
|
+
# if BYTE_ORDER == 0
|
187
|
+
X = xbuf; /* (dynamic only) */
|
188
|
+
# else
|
189
|
+
# define xbuf X /* (static only) */
|
190
|
+
# endif
|
191
|
+
for (i = 0; i < 16; ++i, xp += 4)
|
192
|
+
xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
|
193
|
+
}
|
194
|
+
#endif
|
195
|
+
}
|
196
|
+
|
197
|
+
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
198
|
+
|
199
|
+
/* Round 1. */
|
200
|
+
/* Let [abcd k s i] denote the operation
|
201
|
+
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
|
202
|
+
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
203
|
+
#define SET(a, b, c, d, k, s, Ti)\
|
204
|
+
t = a + F(b,c,d) + X[k] + Ti;\
|
205
|
+
a = ROTATE_LEFT(t, s) + b
|
206
|
+
/* Do the following 16 operations. */
|
207
|
+
SET(a, b, c, d, 0, 7, T1);
|
208
|
+
SET(d, a, b, c, 1, 12, T2);
|
209
|
+
SET(c, d, a, b, 2, 17, T3);
|
210
|
+
SET(b, c, d, a, 3, 22, T4);
|
211
|
+
SET(a, b, c, d, 4, 7, T5);
|
212
|
+
SET(d, a, b, c, 5, 12, T6);
|
213
|
+
SET(c, d, a, b, 6, 17, T7);
|
214
|
+
SET(b, c, d, a, 7, 22, T8);
|
215
|
+
SET(a, b, c, d, 8, 7, T9);
|
216
|
+
SET(d, a, b, c, 9, 12, T10);
|
217
|
+
SET(c, d, a, b, 10, 17, T11);
|
218
|
+
SET(b, c, d, a, 11, 22, T12);
|
219
|
+
SET(a, b, c, d, 12, 7, T13);
|
220
|
+
SET(d, a, b, c, 13, 12, T14);
|
221
|
+
SET(c, d, a, b, 14, 17, T15);
|
222
|
+
SET(b, c, d, a, 15, 22, T16);
|
223
|
+
#undef SET
|
224
|
+
|
225
|
+
/* Round 2. */
|
226
|
+
/* Let [abcd k s i] denote the operation
|
227
|
+
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
|
228
|
+
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
|
229
|
+
#define SET(a, b, c, d, k, s, Ti)\
|
230
|
+
t = a + G(b,c,d) + X[k] + Ti;\
|
231
|
+
a = ROTATE_LEFT(t, s) + b
|
232
|
+
/* Do the following 16 operations. */
|
233
|
+
SET(a, b, c, d, 1, 5, T17);
|
234
|
+
SET(d, a, b, c, 6, 9, T18);
|
235
|
+
SET(c, d, a, b, 11, 14, T19);
|
236
|
+
SET(b, c, d, a, 0, 20, T20);
|
237
|
+
SET(a, b, c, d, 5, 5, T21);
|
238
|
+
SET(d, a, b, c, 10, 9, T22);
|
239
|
+
SET(c, d, a, b, 15, 14, T23);
|
240
|
+
SET(b, c, d, a, 4, 20, T24);
|
241
|
+
SET(a, b, c, d, 9, 5, T25);
|
242
|
+
SET(d, a, b, c, 14, 9, T26);
|
243
|
+
SET(c, d, a, b, 3, 14, T27);
|
244
|
+
SET(b, c, d, a, 8, 20, T28);
|
245
|
+
SET(a, b, c, d, 13, 5, T29);
|
246
|
+
SET(d, a, b, c, 2, 9, T30);
|
247
|
+
SET(c, d, a, b, 7, 14, T31);
|
248
|
+
SET(b, c, d, a, 12, 20, T32);
|
249
|
+
#undef SET
|
250
|
+
|
251
|
+
/* Round 3. */
|
252
|
+
/* Let [abcd k s t] denote the operation
|
253
|
+
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
|
254
|
+
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
255
|
+
#define SET(a, b, c, d, k, s, Ti)\
|
256
|
+
t = a + H(b,c,d) + X[k] + Ti;\
|
257
|
+
a = ROTATE_LEFT(t, s) + b
|
258
|
+
/* Do the following 16 operations. */
|
259
|
+
SET(a, b, c, d, 5, 4, T33);
|
260
|
+
SET(d, a, b, c, 8, 11, T34);
|
261
|
+
SET(c, d, a, b, 11, 16, T35);
|
262
|
+
SET(b, c, d, a, 14, 23, T36);
|
263
|
+
SET(a, b, c, d, 1, 4, T37);
|
264
|
+
SET(d, a, b, c, 4, 11, T38);
|
265
|
+
SET(c, d, a, b, 7, 16, T39);
|
266
|
+
SET(b, c, d, a, 10, 23, T40);
|
267
|
+
SET(a, b, c, d, 13, 4, T41);
|
268
|
+
SET(d, a, b, c, 0, 11, T42);
|
269
|
+
SET(c, d, a, b, 3, 16, T43);
|
270
|
+
SET(b, c, d, a, 6, 23, T44);
|
271
|
+
SET(a, b, c, d, 9, 4, T45);
|
272
|
+
SET(d, a, b, c, 12, 11, T46);
|
273
|
+
SET(c, d, a, b, 15, 16, T47);
|
274
|
+
SET(b, c, d, a, 2, 23, T48);
|
275
|
+
#undef SET
|
276
|
+
|
277
|
+
/* Round 4. */
|
278
|
+
/* Let [abcd k s t] denote the operation
|
279
|
+
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
|
280
|
+
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
|
281
|
+
#define SET(a, b, c, d, k, s, Ti)\
|
282
|
+
t = a + I(b,c,d) + X[k] + Ti;\
|
283
|
+
a = ROTATE_LEFT(t, s) + b
|
284
|
+
/* Do the following 16 operations. */
|
285
|
+
SET(a, b, c, d, 0, 6, T49);
|
286
|
+
SET(d, a, b, c, 7, 10, T50);
|
287
|
+
SET(c, d, a, b, 14, 15, T51);
|
288
|
+
SET(b, c, d, a, 5, 21, T52);
|
289
|
+
SET(a, b, c, d, 12, 6, T53);
|
290
|
+
SET(d, a, b, c, 3, 10, T54);
|
291
|
+
SET(c, d, a, b, 10, 15, T55);
|
292
|
+
SET(b, c, d, a, 1, 21, T56);
|
293
|
+
SET(a, b, c, d, 8, 6, T57);
|
294
|
+
SET(d, a, b, c, 15, 10, T58);
|
295
|
+
SET(c, d, a, b, 6, 15, T59);
|
296
|
+
SET(b, c, d, a, 13, 21, T60);
|
297
|
+
SET(a, b, c, d, 4, 6, T61);
|
298
|
+
SET(d, a, b, c, 11, 10, T62);
|
299
|
+
SET(c, d, a, b, 2, 15, T63);
|
300
|
+
SET(b, c, d, a, 9, 21, T64);
|
301
|
+
#undef SET
|
302
|
+
|
303
|
+
/* Then perform the following additions. (That is increment each
|
304
|
+
of the four registers by the value it had before this block
|
305
|
+
was started.) */
|
306
|
+
pms->abcd[0] += a;
|
307
|
+
pms->abcd[1] += b;
|
308
|
+
pms->abcd[2] += c;
|
309
|
+
pms->abcd[3] += d;
|
310
|
+
}
|
311
|
+
|
312
|
+
void
|
313
|
+
md5_init(md5_state_t *pms)
|
314
|
+
{
|
315
|
+
pms->count[0] = pms->count[1] = 0;
|
316
|
+
pms->abcd[0] = 0x67452301;
|
317
|
+
pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
|
318
|
+
pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
|
319
|
+
pms->abcd[3] = 0x10325476;
|
320
|
+
}
|
321
|
+
|
322
|
+
void
|
323
|
+
md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
|
324
|
+
{
|
325
|
+
const md5_byte_t *p = data;
|
326
|
+
int left = nbytes;
|
327
|
+
int offset = (pms->count[0] >> 3) & 63;
|
328
|
+
md5_word_t nbits = (md5_word_t)(nbytes << 3);
|
329
|
+
|
330
|
+
if (nbytes <= 0)
|
331
|
+
return;
|
332
|
+
|
333
|
+
/* Update the message length. */
|
334
|
+
pms->count[1] += nbytes >> 29;
|
335
|
+
pms->count[0] += nbits;
|
336
|
+
if (pms->count[0] < nbits)
|
337
|
+
pms->count[1]++;
|
338
|
+
|
339
|
+
/* Process an initial partial block. */
|
340
|
+
if (offset) {
|
341
|
+
int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
|
342
|
+
|
343
|
+
memcpy(pms->buf + offset, p, copy);
|
344
|
+
if (offset + copy < 64)
|
345
|
+
return;
|
346
|
+
p += copy;
|
347
|
+
left -= copy;
|
348
|
+
md5_process(pms, pms->buf);
|
349
|
+
}
|
350
|
+
|
351
|
+
/* Process full blocks. */
|
352
|
+
for (; left >= 64; p += 64, left -= 64)
|
353
|
+
md5_process(pms, p);
|
354
|
+
|
355
|
+
/* Process a final partial block. */
|
356
|
+
if (left)
|
357
|
+
memcpy(pms->buf, p, left);
|
358
|
+
}
|
359
|
+
|
360
|
+
void
|
361
|
+
md5_finish(md5_state_t *pms, md5_byte_t digest[16])
|
362
|
+
{
|
363
|
+
static const md5_byte_t pad[64] = {
|
364
|
+
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
365
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
366
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
367
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
368
|
+
};
|
369
|
+
md5_byte_t data[8];
|
370
|
+
int i;
|
371
|
+
|
372
|
+
/* Save the length before padding. */
|
373
|
+
for (i = 0; i < 8; ++i)
|
374
|
+
data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
|
375
|
+
/* Pad to 56 bytes mod 64. */
|
376
|
+
md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
|
377
|
+
/* Append the length. */
|
378
|
+
md5_append(pms, data, 8);
|
379
|
+
for (i = 0; i < 16; ++i)
|
380
|
+
digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
|
381
|
+
}
|