OrientDBのcreate databaseコマンドでのmodeとstorage-typeの関係

**この記事は[Orientdb.jp](http://orientdb.jp/about-orientdb/create-database.html)からの転載です。**
**ちょっと前に書いた内容ですが、現在でも有効な話ですので時流に合わせて少し修正してこちらでも紹介させて頂きます。**

GraphDBとDocumentDBの特徴を併せ持つNoSQLDBのOrientDBですが、ものすごい勢いで開発が進んでます。

ただちょっと本家のドキュメントが製品に追いついていないこともあります。

そんななかで、恥ずかしながら私が悩んだポイントを少しづつ紹介していきたいと思います。

まず、'create database' コマンドに関してです。

構文をちゃんと書くと以下ですね。

```create database <database-url> [<user> <password> <storage-type> [<db-type>]]```

どこで悩んだかというと、database-urlとstorage-typeの箇所です。

まず、database-urlは`mode:path`で構成されているのですが、

modeに設定可能な値は、plocal, remote , memory です。

次に storage-type に設定可能なのは、plocal, memory なのです。

ん？これってどういうこと？ストレージのタイプと接続方法の話なのかしら？とその関係性に悩んでしまいました。
コマンドの説明を見てみると
```* database-url The url of the database to create in the format ':'
* user Server administrator name
* password Server administrator password
* storage-type The type of the storage. 'local' and 'plocal' for disk-based databases and 'memory' for in-memory database
* db-type The type of the database used between 'document' and 'graph'. By default is graph.
```

この説明だけでは、それぞれの関係性がわかんないのでcreate database コマンドの実装を確認してみました。
ちょっと長いので前半と後半を省略してしまいます。また私が追加したコメントを「追加コメント:」としています。

```java

	// 追加コメント: storage-type が未設定の場合
	if (iStorageType == null) {
		// 追加コメント: database-urlの指定がremoteならばIllegalArgumentException. つまりremoteの時は必須
		if (iDatabaseURL.startsWith(OEngineRemote.NAME + ":"))
			throw new IllegalArgumentException("Missing storage type for remote database");
			// 追加コメント: ":"があるか確認. なければIllegalArgumentException.
		int pos = iDatabaseURL.indexOf(":");
		if (pos == -1)
			throw new IllegalArgumentException("Invalid URL");
			// 追加コメント: つまりiStorageType が未設定の場合で mode がremote以外の場合は、database-url が設定される
		iStorageType = iDatabaseURL.substring(0, pos);
	}
	// 追加コメント:db-type は graph がデフォルト
	if (iDatabaseType == null)
		iDatabaseType = "graph";
		message("\nCreating database [" + iDatabaseURL + "] using the storage type [" + iStorageType + "]...");
		currentDatabaseUserName = iUserName;
		currentDatabaseUserPassword = iUserPassword;
	// 追加コメント:database-url の mode が remote ならば　iStorageType が選択可能
	if (iDatabaseURL.startsWith(OEngineRemote.NAME)) {
		// REMOTE CONNECTION
		final String dbURL = iDatabaseURL.substring(OEngineRemote.NAME.length() + 1);
		new OServerAdmin(dbURL).connect(iUserName, iUserPassword).createDatabase(iDatabaseType, iStorageType).close();
		connect(iDatabaseURL, OUser.ADMIN, OUser.ADMIN);
	} else {
	// 追加コメント: database-url の mode が remote 以外、つまり plocal と memory の場合
		// LOCAL CONNECTION
		// 追加コメント: storage-type が設定されている場合
		if (iStorageType != null) {
			// CHECK STORAGE TYPE
			// modeとstorage-typeが一致していない場合はIllegalArgumentException
			if (!iDatabaseURL.toLowerCase().startsWith(iStorageType.toLowerCase()))
				throw new IllegalArgumentException("Storage type '" + iStorageType + "' is different by storage type in URL");
			}
以下省略
```

上記のソースを見ていただければわかるかと思いますが、`create database`のstrage-type に関しては、modeがremoteの場合のみplocalもしくはmemoryを明示的に指定する必要があり、それ以外に関してはエンジンのモードで強制的に決まります。
一応、指定も出来ますがmodeとstorage-typeが一致しない場合はつまり、mode が plocal 時にはstrage-typeを plocal 以外をもしくは、memoryの時にmemory の時に以外を指定した場合は
IllegalArgumentExceptionが発生します。

表にまとめると以下となります。

| mode | storage-typeのデフォルト | storage-typeに設定可能な値 |
|:-----------|------------:|:------------:|
| plocal | 省略可(デフォルトはplocal) | plocalのみ |
| memory | 省略可（デフォルトはmemory） | memoryのみ |
| remote | 必須（デフォルトは無し） | plocal,memory |
create databaseコマンドは、接続した場合にそのままデータベースへconnectされる挙動です。
そのため、db-urlは、DBサーバー側でのデータの格納パスを意味しているだけではなく、そのまま接続も行われるためこのようなシンタックスになっているのではないかと思われます。

By Kazunobu