# マルチセッションの動作テスト。
# 2 read write transaction + 0 read only transaction, 
# read write transactionのすること = DB操作 + mount/unmount , 
# 共通のisolation level = no transaction。
# 1つ目のr/o transactionは常にT1のみのselect, 
# 2つ目のr/o transactionは常にT1とT2をjoinしたselect, 
# 3つ目のr/o transactionは常にbackupを行う。 
Begin;
BeginTimeSpan;
Initialize;
EndTimeSpan;
# テスト用のDBを作る
InitializeSession "";
Command "create database TESTDB";
TerminateSession;

InitializeSession "TESTDB";

# Tableの作成
Command  "create table T1(C1 int, C2 nchar(32))";
Command  "create table T2(C1 int, C2 nchar(32))";
Command  "create index I1_2 on T1(C2)";
Command  "create fulltext index I1_F0 on T1(C2) hint 'inverted=(nolocation=true)'";
# タプルを準備する
Command  "insert into T1 (C1, C2) values (?, ?)" [1, "1"];
Command  "insert into T1 (C1, C2) values (?, ?)" [2, "2"];
Command  "insert into T1 (C1, C2) values (?, ?)" [3, "3"];
Command  "insert into T1 (C1, C2) values (?, ?)" [4, "4"];
Command  "insert into T1 (C1, C2) values (?, ?)" [5, "5"];
Command  "insert into T1 (C1, C2) values (?, ?)" [6, "6"];
Command  "insert into T1 (C1, C2) values (?, ?)" [7, "7"];
Command  "insert into T1 (C1, C2) values (?, ?)" [8, "8"];
Command  "insert into T1 (C1, C2) values (?, ?)" [9, "9"];
Command  "insert into T1 (C1, C2) values (?, ?)" [10, "10"];
Command  "insert into T1 (C1, C2) values (?, ?)" [11, "11"];
Command  "insert into T1 (C1, C2) values (?, ?)" [12, "12"];

# 複数のスレッドをここで同時実行
InitializeSession 1 "TESTDB";
CreateThread "Thread1";
InitializeSession 2 "TESTDB";
CreateThread "Thread2";
JoinThread "Thread1";
TerminateSession 1;
JoinThread "Thread2";
TerminateSession 2;

# Tableの内容の最終確認
Command  "select * from T1 order by C1";
Command  "select * from T2 order by C1";
# Tableの後始末
#Command  "drop table T1";
#Command  "drop table T2";
TerminateSession;

# DBの後始末
#InitializeSession "";
#Command "drop database TESTDB";
#TerminateSession;
# (障害回復を試すためTerminateしない)
End;

# transaction内ではスキーマ操作/DB操作/mount/unmountができない
Thread1
{
# DBやそのareaについて操作を行う
Command 1 "set transaction read write";
Command 1 "alter database TESTDB set path 'd:\\dm\\db_area'";
Command 1 "set transaction read write";
Command 1 "alter database TESTDB drop path ''";
Command 1 "set transaction read write";
Command 1 "alter database TESTDB set path system 'd:\\dm\\db_area'";
Command 1 "set transaction read write";
Command 1 "alter database TESTDB drop path system ''";
}

# transaction内ではスキーマ操作/DB操作/mount/unmountができない
Thread2
{
# unmount/mountを行う
Command 2 "set transaction read write";
Command 2 "unmount DefaultDB";
Command 2 "set transaction read write";
Command 2 "mount DefaultDB path 'd:\\dm\\data\\DefaultDB' system 'd:\\dm\\system\\DefaultDB'";
}

