packages feed

BerkeleyDB-0.6: examples/capitals.hs

module Main where

import System.Environment
import Database.Berkeley.Db
import Control.Monad
import qualified Data.ByteString as B
import Data.Char

pack :: String -> B.ByteString
pack = B.pack . map (fromIntegral . ord)

unpack :: B.ByteString -> String
unpack = map (chr . fromIntegral) . B.unpack 

data Action = Read | Write | Fail deriving Eq

writeDb :: Db -> IO ()
writeDb db = do
    forM_ testData $ \(country, capital) -> do
        db_put [] db Nothing (pack country) (pack capital)

readDb :: Db -> IO ()
readDb db = do
    forM_ testData$ \(country, capital) -> do
        mCapital <- db_get [] db Nothing (pack country)
        putStrLn $ country ++ " - " ++
            (case mCapital of
                Just capital -> unpack capital
                otherwise    -> "<empty>")

main = do
    args <- getArgs
    let action = case args of
            ["read"] -> Read
            ["write"] -> Write
            otherwise -> Fail
    if action == Fail
        then putStrLn "Please say 'read' or 'write' on the command line"
        else do
            dbenv <- dbEnv_create []
            dbEnv_open [DB_CREATE,DB_INIT_MPOOL] 0 dbenv "."
            db <- db_create [] dbenv
            db_set_pagesize db 2048
            db_open [DB_CREATE] DB_HASH 0 db Nothing "capitals.db" Nothing 
            if action == Read
                then readDb db
                else writeDb db
            db_close [] db
            dbEnv_close [] dbenv
            putStrLn "Finished."

testData = [
    ("Afghanistan", "Kabul"),
    ("Albania", "Tirane"),
    ("Algeria", "Algiers"),
    ("Andorra", "Andorra la Vella"),
    ("Angola", "Luanda"),
    ("Antigua and Barbuda", "Saint John's"),
    ("Argentina", "Buenos Aires"),
    ("Armenia", "Yerevan"),
    ("Australia", "Canberra"),
    ("Austria", "Vienna"),
    ("Azerbaijan", "Baku"),
    ("The Bahamas", "Nassau"),
    ("Bahrain", "Manama"),
    ("Bangladesh", "Dhaka"),
    ("Barbados", "Bridgetown"),
    ("Belarus", "Minsk"),
    ("Belgium", "Brussels"),
    ("Belize", "Belmopan"),
    ("Benin", "Porto-Novo"),
    ("Bhutan", "Thimphu"),
    ("Bolivia", "La Paz (administrative); Sucre (judicial)"),
    ("Bosnia and Herzegovina", "Sarajevo"),
    ("Botswana", "Gaborone"),
    ("Brazil", "Brasilia"),
    ("Brunei", "Bandar Seri Begawan"),
    ("Bulgaria", "Sofia"),
    ("Burkina Faso", "Ouagadougou"),
    ("Burundi", "Bujumbura"),
    ("Cambodia", "Phnom Penh"),
    ("Cameroon", "Yaounde"),
    ("Canada", "Ottawa"),
    ("Cape Verde", "Praia"),
    ("Central African Republic", "Bangui"),
    ("Chad", "N'Djamena"),
    ("Chile", "Santiago"),
    ("China", "Beijing"),
    ("Colombia", "Bogota"),
    ("Comoros", "Moroni"),
    ("Congo, Republic of the", "Brazzaville"),
    ("Congo, Democratic Republic of the", "Kinshasa"),
    ("Costa Rica", "San Jose"),
    ("Cote d'Ivoire", "Yamoussoukro (official); Abidjan (de facto)"),
    ("Croatia", "Zagreb"),
    ("Cuba", "Havana"),
    ("Cyprus", "Nicosia"),
    ("Czech Republic", "Prague"),
    ("Denmark", "Copenhagen"),
    ("Djibouti", "Djibouti"),
    ("Dominica", "Roseau"),
    ("Dominican Republic", "Santo Domingo"),
    ("East Timor (Timor-Leste)", "Dili"),
    ("Ecuador", "Quito"),
    ("Egypt", "Cairo"),
    ("El Salvador", "San Salvador"),
    ("Equatorial Guinea", "Malabo"),
    ("Eritrea", "Asmara"),
    ("Estonia", "Tallinn"),
    ("Ethiopia", "Addis Ababa"),
    ("Fiji", "Suva"),
    ("Finland", "Helsinki"),
    ("France", "Paris"),
    ("Gabon", "Libreville"),
    ("The Gambia", "Banjul"),
    ("Georgia", "Tbilisi"),
    ("Germany", "Berlin"),
    ("Ghana", "Accra"),
    ("Greece", "Athens"),
    ("Grenada", "Saint George's"),
    ("Guatemala", "Guatemala City"),
    ("Guinea", "Conakry"),
    ("Guinea-Bissau", "Bissau"),
    ("Guyana", "Georgetown"),
    ("Haiti", "Port-au-Prince"),
    ("Honduras", "Tegucigalpa"),
    ("Hungary", "Budapest"),
    ("Iceland", "Reykjavik"),
    ("India", "New Delhi"),
    ("Indonesia", "Jakarta"),
    ("Iran", "Tehran"),
    ("Iraq", "Baghdad"),
    ("Ireland", "Dublin"),
    ("Israel", "Jerusalem"),
    ("Italy", "Rome"),
    ("Jamaica", "Kingston"),
    ("Japan", "Tokyo"),
    ("Jordan", "Amman"),
    ("Kazakhstan", "Astana"),
    ("Kenya", "Nairobi"),
    ("Kiribati", "Tarawa Atoll"),
    ("Korea, North", "Pyongyang"),
    ("Korea, South", "Seoul"),
    ("Kosovo", "Pristina"),
    ("Kuwait", "Kuwait City"),
    ("Kyrgyzstan", "Bishkek"),
    ("Laos", "Vientiane"),
    ("Latvia", "Riga"),
    ("Lebanon", "Beirut"),
    ("Lesotho", "Maseru"),
    ("Liberia", "Monrovia"),
    ("Libya", "Tripoli"),
    ("Liechtenstein", "Vaduz"),
    ("Lithuania", "Vilnius"),
    ("Luxembourg", "Luxembourg"),
    ("Macedonia", "Skopje"),
    ("Madagascar", "Antananarivo"),
    ("Malawi", "Lilongwe"),
    ("Malaysia", "Kuala Lumpur"),
    ("Maldives", "Male"),
    ("Mali", "Bamako"),
    ("Malta", "Valletta"),
    ("Marshall Islands", "Majuro"),
    ("Mauritania", "Nouakchott"),
    ("Mauritius", "Port Louis"),
    ("Mexico", "Mexico City"),
    ("Micronesia, Federated States of", "Palikir"),
    ("Moldova", "Chisinau"),
    ("Monaco", "Monaco"),
    ("Mongolia", "Ulaanbaatar"),
    ("Montenegro", "Podgorica"),
    ("Morocco", "Rabat"),
    ("Mozambique", "Maputo"),
    ("Myanmar (Burma)", "Rangoon (Yangon); Naypyidaw or Nay Pyi Taw (administrative)"),
    ("Namibia", "Windhoek"),
    ("Nauru", "no official capital; government offices in Yaren District"),
    ("Nepal", "Kathmandu"),
    ("Netherlands", "Amsterdam; The Hague (seat of government)"),
    ("New Zealand", "Wellington"),
    ("Nicaragua", "Managua"),
    ("Niger", "Niamey"),
    ("Nigeria", "Abuja"),
    ("Norway", "Oslo"),
    ("Oman", "Muscat"),
    ("Pakistan", "Islamabad"),
    ("Palau", "Melekeok"),
    ("Panama", "Panama City"),
    ("Papua New Guinea", "Port Moresby"),
    ("Paraguay", "Asuncion"),
    ("Peru", "Lima"),
    ("Philippines", "Manila"),
    ("Poland", "Warsaw"),
    ("Portugal", "Lisbon"),
    ("Qatar", "Doha"),
    ("Romania", "Bucharest"),
    ("Russia", "Moscow"),
    ("Rwanda", "Kigali"),
    ("Saint Kitts and Nevis", "Basseterre"),
    ("Saint Lucia", "Castries"),
    ("Saint Vincent and the Grenadines", "Kingstown"),
    ("Samoa", "Apia"),
    ("San Marino", "San Marino"),
    ("Sao Tome and Principe", "Sao Tome"),
    ("Saudi Arabia", "Riyadh"),
    ("Senegal", "Dakar"),
    ("Serbia", "Belgrade"),
    ("Seychelles", "Victoria"),
    ("Sierra Leone", "Freetown"),
    ("Singapore", "Singapore"),
    ("Slovakia", "Bratislava"),
    ("Slovenia", "Ljubljana"),
    ("Solomon Islands", "Honiara"),
    ("Somalia", "Mogadishu"),
    ("South Africa", "Pretoria (administrative); Cape Town (legislative); Bloemfontein (judiciary)"),
    ("Spain", "Madrid"),
    ("Sri Lanka", "Colombo; Sri Jayewardenepura Kotte (legislative)"),
    ("Sudan", "Khartoum"),
    ("Suriname", "Paramaribo"),
    ("Swaziland", "Mbabane"),
    ("Sweden", "Stockholm"),
    ("Switzerland", "Bern"),
    ("Syria", "Damascus"),
    ("Taiwan", "Taipei"),
    ("Tajikistan", "Dushanbe"),
    ("Tanzania", "Dar es Salaam; Dodoma (legislative)"),
    ("Thailand", "Bangkok"),
    ("Togo", "Lome"),
    ("Tonga", "Nuku'alofa"),
    ("Trinidad and Tobago", "Port-of-Spain"),
    ("Tunisia", "Tunis"),
    ("Turkey", "Ankara"),
    ("Turkmenistan", "Ashgabat"),
    ("Tuvalu", "Vaiaku village, Funafuti province"),
    ("Uganda", "Kampala"),
    ("Ukraine", "Kyiv"),
    ("United Arab Emirates", "Abu Dhabi"),
    ("United Kingdom", "London"),
    ("United States of America", "Washington D.C."),
    ("Uruguay", "Montevideo"),
    ("Uzbekistan", "Tashkent"),
    ("Vanuatu", "Port-Vila"),
    ("Vatican City (Holy See)", "Vatican City"),
    ("Venezuela", "Caracas"),
    ("Vietnam", "Hanoi"),
    ("Yemen", "Sanaa"),
    ("Zambia", "Lusaka"),
    ("Zimbabwe", "Harare")]