libdb/examples/csharp/excs_lock/excs_lock.cs
2011-09-13 13:44:24 -04:00

215 lines
7 KiB
C#

/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2009, 2011 Oracle and/or its affiliates. All rights reserved.
*
* $Id$
*/
using System;
using System.Collections.Generic;
using System.Text;
using BerkeleyDB;
namespace excs_lock {
class Program {
const int EXIT_FAILURE = 1;
const int EXIT_SUCCESS = 0;
static void Main(string[] args) {
DatabaseEntry data;
DatabaseEnvironment env;
List<Lock> lockList;
Lock lk;
LockMode mode;
string buff;
string home;
string progName;
int lockNo;
uint doUnLink;
uint locker;
uint maxLock;
try {
home = args[0];
maxLock = uint.Parse(args[1]);
doUnLink = uint.Parse(args[2]);
} catch {
Usage();
return;
}
data = new DatabaseEntry();
lockList = new List<Lock>();
progName = "excs_lock";
/* Initialize the database environment. */
if (DBInit(out env, home, progName, maxLock, doUnLink) == EXIT_FAILURE)
return;
/*
* Accept lock requests.
*/
try {
locker = env.CreateLockerID();
} catch (Exception e) {
Console.WriteLine("{0}:{1}\n{2}",
e.Source, e.Message, e.StackTrace);
env.Close();
return;
}
while (true) {
/* Choose getting or releasing lock. */
Console.WriteLine("Operation get/release/quit: ");
buff = Console.ReadLine();
if (buff == "get") {
/* Input the content to be locked. */
Console.WriteLine("Input text string to lock");
try {
buff = Console.ReadLine();
DbtFromString(data, buff);
} catch {
Console.WriteLine("Input fails");
continue;
}
/*
* Choose the locker's mode. More lock modes
* could be provided. Only support read/write
* mode here.
*/
while (true) {
Console.WriteLine("read or write");
buff = Console.ReadLine();
if (buff == "read" || buff == "write")
break;
}
if (buff == "write")
mode = LockMode.WRITE;
else
mode = LockMode.READ;
/* Get lock and add it to the list of locks. */
try {
lk = env.GetLock(locker, false, data, mode);
} catch (Exception e) {
Console.WriteLine("{0}:{1}\n{2}",
e.Source, e.Message, e.StackTrace);
env.Close();
return;
}
Console.WriteLine("Lock #{0} granted",
lockList.Count);
lockList.Add(lk);
} else if (buff == "release") {
/*
* Release a lock.
*/
while (true) {
/* Input lock number to release. */
Console.WriteLine(
"Input lock number to release");
buff = Console.ReadLine();
try {
lockNo = int.Parse(buff);
if (lockNo > 0 && lockNo <
lockList.Count)
break;
else
Console.WriteLine(
"Lock number is out of range");
} catch {
Console.WriteLine(
"Not a valid lock number");
}
}
/* Release a lock and remove it from the list of locks. */
try {
env.PutLock(lockList[lockNo]);
} catch (Exception e) {
Console.WriteLine("{0}:{1}\n{2}",
e.Source, e.Message, e.StackTrace);
env.Close();
return;
}
lockList.Remove(lockList[lockNo]);
} else if (buff == "quit") {
break;
}
}
/*Free locker and close the environment. */
env.FreeLockerID(locker);
env.Close();
}
/*
* Create and open environment and database.
*/
public static int DBInit(out DatabaseEnvironment env,
string home, string progName, uint maxLock,
uint doUnLink) {
DatabaseEnvironmentConfig envConfig;
LockingConfig lkConfig;
/* Configure locking subsystem. */
lkConfig = new LockingConfig();
lkConfig.MaxLocks = maxLock;
/* Configure environment. */
envConfig = new DatabaseEnvironmentConfig();
envConfig.Create = true;
envConfig.ErrorPrefix = progName;
envConfig.LockSystemCfg = lkConfig;
envConfig.UseLocking = true;
/*
* Optionally remove the environment region and
* open the environment.
*/
try {
if (doUnLink == 1)
DatabaseEnvironment.Remove(home, true);
env = DatabaseEnvironment.Open(home, envConfig);
} catch (Exception e) {
Console.WriteLine("{0}:{1}\n{2}",
e.Source, e.Message, e.StackTrace);
env = null;
return EXIT_FAILURE;
}
/*
try
{
env = DatabaseEnvironment.Open(home, envConfig);
}
catch(Exception e)
{
Console.WriteLine("{0}:{1}\n{2}",
e.Source, e.Message, e.StackTrace);
env = null;
return ExConstants.EXIT_FAILURE;
}
*/
return EXIT_SUCCESS;
}
#region Utilities
/* Show the usage of the example. */
public static void Usage() {
Console.WriteLine(
"Usage: [home] [max lock] [1 doUnlink | 0]");
}
/* Get dbt from a string. */
static void DbtFromString(DatabaseEntry dbt, string s) {
dbt.Data = System.Text.Encoding.ASCII.GetBytes(s);
}
#endregion Utilities
}
}