cdb(1) General Commands Manual cdb(1)

cdb - ابزار ایجاد و خواندن پایگاه داده‌های ثابت Constant Database

cdb -q [-m] [-n num] dbname key
cdb -d [-m] [dbname|-]
cdb -l [-m] [dbname|-]
cdb -s [dbname|-]
cdb -c [-m] [-t tmpname|-] [-p perms] [-weru0] dbname [infile...]

ابزار cdb برای پرس‌وجو، استخراج داده‌ها (دامپ)، فهرست کردن، تجزیه‌وتحلیل یا ساخت فایل‌های CDB (پایگاه‌داده ثابت یا Constant DataBase) به کار می‌رود. ساختار cdb در صفحه راهنمای cdb(5) توضیح داده شده است. این صفحه راهنما منطبق بر نسخه 0.81 از بسته tinycdb است.

دستور cdb -q کلید داده‌شده key را در فایل cdb مشخص‌شده dbname می‌یابد و مقدار مرتبط با آن را در صورت یافتن در خروجی استاندارد می‌نویسد (و با کد صفر خارج می‌شود)، یا در صورت پیدا نشدن با کد غیرصفر پایان می‌یابد. dbname باید فایلی با قابلیت پرش (seekable) باشد و ورودی استاندارد (stdin) نمی‌تواند به عنوان ورودی استفاده شود. به طور پیش‌فرض، cdb تمام رکوردهای یافت‌شده را چاپ خواهد کرد. گزینه‌های شناخته‌شده در حالت پرس‌وجو:

باعث می‌شود cdb رکورد دارای شماره num را (با شروع از ۱) یافته و بنویسد — هنگامی که چندین رکورد با یک کلید مشخص وجود دارد.
پس از هر مقدار چاپ‌شده یک خط جدید اضافه می‌شود. به طور پیش‌فرض، مقادیر چندگانه بدون هیچ نویسه جداکننده‌ای نوشته می‌شوند.

دستور cdb -d محتویات را تخلیه (dump) می‌کند، و دستور cdb -l کلیدهای cdbfile (یا ورودی استاندارد در صورت عدم تعیین) را بر اساس قالب کنترل‌شده با گزینه -m در خروجی استاندارد فهرست می‌کند. زیربخش «قالب ورودی/خروجی» در ادامه را ببینید. خروجی cdb -d می‌تواند به عنوان ورودی برای cdb -c استفاده شود.

پایگاه‌داده Cdb در دو مرحله ساخته می‌شود: ابتدا یک پایگاه‌داده موقت ایجاد می‌شود و پس از تکمیل، به طور اتمیک به مکان دائمی تغییر نام می‌یابد. این کار نیاز به قفل‌گذاری میان خوانندگان و نویسندگان (یا سازندگان) را از بین می‌برد. cdb -c تلاش می‌کند تا cdb را در فایل tmpname (یا در صورت عدم تعیین گزینه -t در dbname همراه با پسوند ".tmp") بسازد و سپس نام آن را به dbname تغییر دهد. این دستور فایل‌های ورودی infile مشخص‌شده (یا ورودی استاندارد در صورت عدم تعیین) را خواهد خواند. گزینه‌های شناخته‌شده در حالت ساخت:

استفاده از tmpname داده‌شده به عنوان فایل موقت. به طور پیش‌فرض برابر است با dbname.tmp (یعنی فایل خروجی به همراه پسوند .tmp). توجه داشته باشید که tmpname باید در همان فایل‌سیستم فایل خروجی قرار داشته باشد، زیرا cdb از فراخوانی سیستمی rename(2) برای نهایی‌سازی ساخت پایگاه‌داده استفاده می‌کند. اگر tmpname یک خط تیره منفرد (-) باشد، هیچ فایل موقتی ایجاد نمی‌شود و پایگاه‌داده مستقیماً درجا ساخته می‌شود. این حالت زمانی کاربرد دارد که تغییر نام نهایی توسط فراخواننده انجام شود.
مجوزهای دسترسی برای فایل تازه ایجادشده (معمولاً یک عدد در مبنای هشت، مانند 0644). به طور پیش‌فرض مجوزها 0666 هستند (با اعمال umask فرآیند جاری). اگر این گزینه مشخص شود، مقدار umask جاری بی‌اثر خواهد بود.
هشدار در مورد کلیدهای تکراری.
توقف در صورت برخورد با کلیدهای تکراری (شامل -w نیز می‌شود).
جایگزینی کلید موجود با کلید جدید در صورت وجود تکرار. این کار ممکن است نیازمند بازنویسی فایل پایگاه‌داده برای حذف رکوردهای قدیمی باشد و روندی کند داشته باشد.
-0
پر کردن رکوردهای موجود با صفر (zero-fill) هنگام اضافه شدن رکوردهای تکراری. این روش از -r سریع‌تر است، اما در صورت وجود تکراری‌ها صفرهای اضافی در فایل پایگاه‌داده باقی می‌گذارد.
عدم اضافه کردن رکوردهای تکراری.
تفسیر ورودی به عنوان دنباله‌ای از خطوط (یک رکورد در هر خط) که در آن مقدار به وسیله نویسه‌های فاصله یا تب از کلید جدا شده است، به جای قالب بومی cdb (بخش «قالب ورودی/خروجی» در ادامه را ببینید).

توجه داشته باشید که استفاده از هر گزینه‌ای که نیازمند بررسی کلیدهای تکراری باشد، روند ساخت را به‌طور چشمگیری کند می‌کند، به‌ویژه برای پایگاه‌های داده بزرگ.

دستور cdb -s فایل dbfile را تجزیه‌وتحلیل کرده و خلاصه‌ای از آن را در خروجی استاندارد چاپ می‌کند. این آمار شامل موارد زیر است: تعداد کل ردیف‌ها در یک فایل، حداقل، میانگین و حداکثر طول کلیدها و مقادیر، جداول هش (حداکثر ۲۵۶) و ورودی‌های استفاده‌شده، تعداد تصادم‌های هش (یعنی بیش از یک کلید به یک ورودی جدول هش اشاره کنند)، حداقل، میانگین و حداکثر اندازه جدول هش (از جداول غیرخالی)، و تعداد کلیدهایی که در ۱۰ فاصله مختلف از شاخص محاسبه‌شده جدول هش خود قرار دارند — کلیدهای در فاصله ۰ تنها به یک جستجو در جدول هش نیاز دارند، فاصله ۱ — دو جستجو و به همین ترتیب؛ وجود کلیدهای بیشتر در فواصل بزرگ‌تر به معنای کندتر شدن جستجو در پایگاه‌داده است.

به طور پیش‌فرض، cdb داده‌ها را در قالب بومی cdb انتظار دارد (برای عملیات ساخت) یا می‌نویسد (برای تخلیه/فهرست کردن). قالب بومی cdb دنباله‌ای از رکوردها به فرم زیر است:

+klen,vlen:key->val\n

که در آن "+"، "،"، ":"، "-"، ">" و "\n" (خط جدید) نویسه‌های صریح هستند، klen و vlen طول کلید و مقدار به صورت اعداد ده‌دهی هستند، و key و val خود کلید و مقدار می‌باشند. مجموعه رکوردها با یک خط خالی پایان می‌یابد. این تنها قالبی است که کلید و مقدار در آن می‌توانند حاوی هر نویسه‌ای از جمله خط جدید، صفر بیتی (\0) و غیره باشند.

هنگامی که گزینه -l درخواست شود (حالت فهرست کردن کلیدها)، cdb خروجی کمی تغییریافته به شکل زیر تولید می‌کند:

+klen:key\n

(توجه داشته باشید که vlen و val به همراه جداکننده‌های اطراف حذف شده‌اند).

اگر گزینه -m داده شود، cdb برای هر رکورد یک خط را انتظار دارد یا تولید می‌کند (خط جدید جداکننده رکورد است)، و هر خط باید شامل فاصله خالی اختیاری، کلید، فاصله خالی و مقدار تا انتهای خط باشد. خطوطی که با نویسه هش (#) آغاز می‌شوند و خطوط خالی نادیده گرفته می‌شوند. این همان قالبی است که ابزار mkmap(1) انتظار دارد.

در ادامه خلاصه کوتاهی از تمام گزینه‌های پذیرفته‌شده توسط ابزار cdb آمده است:

-0
پر کردن رکوردهای تکراری با صفر در حالت ساخت (-c).
حالت ساخت (create).
حالت تخلیه داده‌ها (dump).
توقف (خطا) در صورت برخورد با کلید تکراری در حالت ساخت (-c).
چاپ راهنمای کوتاه و خروج.
حالت فهرست کردن (list).
ورودی یا خروجی در قالب "map" است، نه در قالب بومی cdb. در حالت پرس‌وجو، پس از هر مقدار نوشته‌شده یک خط جدید اضافه می‌شود.
یافتن و چاپ numمین رکورد در حالت پرس‌وجو (-q).
حالت پرس‌وجو (query).
جایگزینی کلیدهای تکراری در حالت ساخت (-c).
حالت آمار (statistics).
مشخص کردن فایل موقت هنگام ساخت (-c) فایل cdb (استفاده از یک خط تیره منفرد (-) به عنوان tempfile برای عدم استفاده از فایل موقت).
عدم درج کلیدهای تکراری (یکتا یا unique) در حالت ساخت (-c).
هشدار درباره کلیدهای تکراری در حالت ساخت (-c).

بسته tinycdb توسط Michael Tokarev <mjt+cdb@corpit.ru> نوشته شده است، بر اساس ایده‌ها و قالب فایل مشترک با کتابخانه اصلی cdb اثر Dan Bernstein.

cdb(5), cdb(3).

بسته Tinycdb تحت مجوز MIT منتشر شده است.

Jan 2009