Changeset 42
- Timestamp:
- 06/23/08 17:54:30 (2 months ago)
- Files:
-
- trunk/.classpath (modified) (1 diff)
- trunk/.project (modified) (1 diff)
- trunk/.settings/descent.ui.prefs (modified) (1 diff)
- trunk/doost/database/DbVisitor.d (modified) (1 diff)
- trunk/doost/database/Expression.d (modified) (1 diff)
- trunk/doost/database/Recordset.d (modified) (1 diff)
- trunk/doost/database/Sql.d (modified) (1 diff)
- trunk/doost/database/SqlCreate.d (modified) (1 diff)
- trunk/doost/database/SqlInsert.d (modified) (1 diff)
- trunk/doost/database/SqlSelect.d (modified) (2 diffs)
- trunk/doost/database/visitors/SqliteDb.d (modified) (8 diffs)
- trunk/examples/database/PackageTest.d (modified) (1 diff)
- trunk/examples/database/TestSchema.schema (modified) (1 diff)
- trunk/examples/database/database.cbp (modified) (4 diffs)
- trunk/examples/util/config/util_config.cbp (modified) (3 diffs)
- trunk/std2 (deleted)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/.classpath
r32 r42 3 3 <classpathentry excluding="*.cbp;*.conf|bin/|doc/|doc/text/|doc/text/ddoc/|doc/util/serializer/ddoc/" kind="src" path=""/> 4 4 <classpathentry exported="true" kind="con" path="descent.launching.JRE_CONTAINER"/> 5 <classpathentry kind="lib" path="C:/Programy/D/doost" sourcepath="doost"/>6 <classpathentry kind="lib" path="C:/DLang/import/ddbi"/>7 5 <classpathentry kind="output" path=""/> 8 6 </classpath> trunk/.project
r32 r42 11 11 </arguments> 12 12 </buildCommand> 13 <buildCommand> 14 <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> 15 <triggers>full,incremental,</triggers> 16 <arguments> 17 <dictionary> 18 <key>LaunchConfigHandle</key> 19 <value><project>/.externalToolBuilders/Dsss [Builder].launch</value> 20 </dictionary> 21 </arguments> 22 </buildCommand> 23 <buildCommand> 24 <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> 25 <triggers>full,incremental,</triggers> 26 <arguments> 27 <dictionary> 28 <key>LaunchConfigHandle</key> 29 <value><project>/.externalToolBuilders/Rebuild [Builder].launch</value> 30 </dictionary> 31 </arguments> 32 </buildCommand> 13 33 </buildSpec> 14 34 <natures> trunk/.settings/descent.ui.prefs
r32 r42 1 # Fri Feb 08 23:56:51 CET 20081 #Mon Jun 23 21:12:39 CEST 2008 2 2 descent.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/> 3 3 eclipse.preferences.version=1 4 internal.default.compliance=user trunk/doost/database/DbVisitor.d
r39 r42 23 23 ******************************************************************************/ 24 24 interface DbVisitor : Visitor { 25 //TODO: tak na prawdÄ powinno siÄ tu uÅŒyÄ interfejsów queriable, executable 25 26 void execute(Sql); 26 27 Recordset query(Sql); trunk/doost/database/Expression.d
r39 r42 17 17 18 18 import doost.api.Common; 19 import doost.core.Any; 20 import doost.core.Traits; 19 21 import doost.database.Column; 20 22 21 enum ExType {Equals} 23 enum ExType { 24 Less, LessEquals, 25 Equals, 26 MoreEquals, More 27 } 28 29 enum ExArg { 30 ColVal, ColCol, ExpExp 31 } 22 32 23 33 /******************************************************************************* 24 34 ******************************************************************************/ 25 35 class Expression { 26 27 28 this(ExType type) { 36 this(Column column, ExType type, Any value) { 37 m_arg = ExArg.ColVal; 29 38 m_type = type; 39 m_column = column; 40 m_value = value; 30 41 } 31 42 32 string test() { 33 return "OK!"; 43 this(Column column, ExType type, Column column1) { 44 m_arg = ExArg.ColCol; 45 m_type = type; 46 m_column = column; 47 m_column1 = column1; 34 48 } 35 private: 36 ExType m_type; 49 50 package ExType m_type; 51 package ExArg m_arg; 52 package Column m_column; 53 package Column m_column1; 54 package Any m_value; 55 package Expression[] exp; 37 56 } 38 57 39 DataColumn!(T.VALUE_TYPE) column(T)(T col) { 40 static assert(is(T : Column)); 41 return new DataColumn!(T.VALUE_TYPE); 58 string logExp(string name) { 59 return ` 60 Expression ` ~ name ~ `(T, U)(T first, U second) { 61 static if (is(T : Column) && !is(T == Column) && is(U : T.VALUE_TYPE)) { 62 normalizedType!(U) val = second; 63 return new Expression(first, ExType.` ~ name ~ `, any(val)); 64 } else 65 static if (is(T : Column) && !is(T == Column) && is(U : Column) && !is(U == Column)) { 66 return new Expression(first, ExType.` ~ name ~ `, second); 67 } else 68 static assert(false, "Wrong arguments! Possible options: column - value, column - column"); 69 } 70 `; 42 71 } 43 72 44 Expression leq(T, U)(T column, U value) { 45 pragma(msg, T.stringof ~ " " ~ U.stringof ~ " " ~ T.VALUE_TYPE.stringof); 46 static assert(is(T : Column) && !is(T == Column) && is(U : T.VALUE_TYPE)); 47 //static assert(is(T == Column) && is(U : char[])); 73 mixin(logExp("Less")); 74 mixin(logExp("LessEquals")); 75 mixin(logExp("Equals")); 76 mixin(logExp("MoreEquals")); 77 mixin(logExp("More")); 48 78 49 return new Expression(ExType.Equals); 79 Expression And(Expression[] exp...) { 80 return null; 50 81 } 51 82 52 Expression land(T, U)(T column, U value) {83 Expression Or(Expression[] exp...) { 53 84 return null; 54 85 } 86 87 Expression Not(Expression exp) { 88 return null; 89 } 90 91 //Expression: 92 //column - value 93 //column - column 94 //expression - expression trunk/doost/database/Recordset.d
r39 r42 44 44 45 45 //TODO: prywatny konstruktor; moÅŒliwoÅÄ utworzenia tylko w warstwie bazy danych 46 //TODO: Null type? 46 47 47 48 /******************************************************************************* trunk/doost/database/Sql.d
r39 r42 29 29 public abstract class Sql : Element { 30 30 public abstract override void accept(Visitor visitor); 31 32 //TODO: tak na prawdÄ w skrypt moÅŒna zebraÄ tylko te sql-e 33 //które nie zwracajÄ 34 rezultatu. poniÅŒej powinno to byÄ odzwierciedlone 35 Sql opCatAssign(SqlExecutable sql) { 36 adjacent~=sql; 37 return this; 38 } 39 40 Sql opCat(SqlExecutable sql) { 41 adjacent~=sql; 42 return this; 43 } 44 45 package SqlExecutable[] adjacent; 31 46 } 32 47 48 public abstract class SqlExecutable : Sql { 49 50 public abstract override void accept(Visitor visitor); 51 } 52 53 public abstract class SqlQueriable : Sql { 54 public abstract override void accept(Visitor visitor); 55 } trunk/doost/database/SqlCreate.d
r39 r42 30 30 } 31 31 32 public class SqlCreate : Sql {32 public class SqlCreate : SqlExecutable { 33 33 public this(Table table) { 34 34 this.table = table; trunk/doost/database/SqlInsert.d
r39 r42 42 42 } 43 43 44 class SqlInsert : Sql {44 class SqlInsert : SqlExecutable { 45 45 package Table table; 46 46 package InsDef[] defs; trunk/doost/database/SqlSelect.d
r39 r42 36 36 } 37 37 38 public class SqlSelect : Sql {38 public class SqlSelect : SqlQueriable { 39 39 public override void accept(Visitor visitor) { 40 40 visitor.visit(this); 41 41 } 42 42 43 public SqlSelect Where(Expression b) { 43 public SqlSelect Where(Expression expression) { 44 m_expression = expression; 44 45 return this; 45 46 } … … 50 51 51 52 private void addColumn(Column c) { 52 columns ~= c;53 m_columns ~= c; 53 54 } 54 55 55 package Column[] columns; 56 package Column[] m_columns; 57 package Expression m_expression; 56 58 } trunk/doost/database/visitors/SqliteDb.d
r39 r42 24 24 import doost.database.Column; 25 25 import doost.database.Table; 26 import doost.database.Expression; 26 27 import dbi.sqlite.SqliteDatabase; 27 28 … … 41 42 database = new SqliteDatabase(name); 42 43 } 43 44 44 45 /*************************************************************************** 45 46 **************************************************************************/ … … 52 53 } 53 54 55 //TODO: moÅŒe tylko jedna funkcja execute i w zaleÅŒnoÅci od tego 56 //czy to jest queriable czy executable zwracane dane lub null; 54 57 void execute(Sql sqlObject) { 55 sqlObject.accept(this); 56 57 writefln(sql); 58 database.execute(sql); 58 59 void exec(Sql s) { 60 s.accept(this); 61 writefln(sql); 62 database.execute(sql); 63 sql = ""; 64 } 65 66 exec(sqlObject); 67 foreach(sq; sqlObject.adjacent) { 68 exec(sq); 69 } 59 70 } 60 71 61 72 Recordset query(Sql sqlObject) { 62 73 sqlObject.accept(this); 63 64 74 writefln(sql); 65 75 auto res = database.query(sql); … … 79 89 80 90 foreach(col; sqlCreate.table.pcolumns) { 81 sql ~= rest ~ col.name ~ " " ~ col.type;91 sql ~= rest ~ col.name ~ " " ~ typeToDbType(col.type); 82 92 rest = ", "; 83 93 } … … 90 100 bool[string] tables; 91 101 102 //SELECT 92 103 sql = "SELECT "; 93 94 foreach(col; sqlSelect.columns) { 104 foreach(col; sqlSelect.m_columns) { 95 105 tables[col.table.name] = true; 96 106 sql ~= rest ~ col.table.name ~ "." ~ col.name; … … 98 108 } 99 109 110 //FROM 100 111 sql ~= " FROM "; 101 112 rest =""; … … 105 116 } 106 117 118 //WHERE 119 if (sqlSelect.m_expression !is null) { 120 sql ~= " WHERE "; 121 sql ~= evaluateExpression(sqlSelect.m_expression); 122 } 123 107 124 sql ~= ";"; 108 125 } … … 136 153 } 137 154 155 public string typeToDbType(string type) { 156 string result; 157 158 switch(type) { 159 case "byte", "ubyte", "short", "ushort", 160 "int", "uint", "long", "ulong": result = "INTEGER"; break; 161 case "float", "double", "real": result = "REAL"; break; 162 case "string", "wstring", "dstring": result = "TEXT"; break; 163 case "void[]": result="BLOB"; break; 164 //TODO: below exception + rethink types (all?) 165 default: throw new Exception("Error"); 166 } 167 168 return result; 169 } 170 171 public string evaluateExpression(Expression expression) { 172 string result; 173 string oper; 174 175 result ~= "("; 176 177 switch (expression.m_type) { 178 case ExType.Less : oper = "<"; break; 179 case ExType.LessEquals : oper = "<="; break; 180 case ExType.Equals : oper = "=="; break; 181 case ExType.MoreEquals : oper = ">="; break; 182 case ExType.More : oper = ">"; break; 183 } 184 185 switch (expression.m_arg) { 186 case ExArg.ColVal : 187 result ~= expression.m_column.table.name; 188 result ~= "." ~ expression.m_column.name; 189 result ~= " " ~ oper ~ " "; 190 result ~= valueToString(expression.m_value); 191 break; 192 193 case ExArg.ColCol : 194 result ~= expression.m_column.table.name; 195 result ~= "." ~ expression.m_column.name; 196 result ~= " " ~ oper ~ " "; 197 result ~= expression.m_column1.table.name; 198 result ~= "." ~ expression.m_column1.name; 199 break; 200 default: 201 } 202 result ~= ")"; 203 return result; 204 } 205 138 206 public string sql; 139 207 } trunk/examples/database/PackageTest.d
r39 r42 28 28 //------------------------------------------------------------------------------ 29 29 30 void printCols(COLS...)(Recordset r, COLS cols) { 31 string rest; 32 for(uint i=0; i<r.length; i++) { 33 writef(i); 34 writef(": "); 35 36 rest = ""; 37 foreach(c; cols) { 38 writef(rest); 39 writef(r.column(c).row(i)); 40 rest = " - "; 41 } 42 writefln; 43 } 44 } 45 30 46 void main(char[][] args) { 31 Sql sql;32 sql = Select(BOOK.AUTHOR, BOOK.TITLE);33 sql = Select(BOOK.AUTHOR).Where(leq(BOOK.AUTHOR, "Szklarski"));34 sql = Select(BOOK.AUTHOR).Where(land(leq(BOOK.AUTHOR, "Szklarski"), leq(BOOK.TITLE, "Tomek w krainie kangurów")));35 36 with(BOOK) {37 sql = Select(AUTHOR, TITLE).From(BOOK).Where(leq(AUTHOR, "Szklarski"));38 }39 40 sql = Select(BOOK.AUTHOR, BOOK.TITLE, BORROW_RECORD.PERSON, BORROW_RECORD.BORROWED);41 42 43 44 foreach(val; BOOK.tupleof) {45 writefln(typeof(val).stringof);46 }47 48 writefln(BOOK.ID);49 writefln(leq(BOOK.AUTHOR, "Szklarski"));50 51 //TODO: visitor moÅŒe przyjmowaÄ w this() bazÄ danych, tak ÅŒe od razu bÄdzie52 //generowaÅ i wykonywaÅ polecenia; dziÄki temu moÅŒna Åatwo zasymulowaÄ53 //e.g. IF NOT EXISTS dla create table54 //takÅŒe moÅŒna zrobiÄ prepared statement albo mapowaÄ konkretne typy na55 //pytajniki56 //tylko jak wtedy wymieniaÄ bazy???57 //visitor ewentualnie moÅŒe zwracaÄ informacje, ÅŒe niektóre operacje sÄ58 unsupported59 60 47 auto db = new SqliteDb("database.sqlite"); 61 48 62 sql = Create(BOOK).IfNotExists; 49 Sql sql; 50 Recordset r; 51 52 sql = Create(AUTHORS).IfNotExists; 53 sql ~= Create(BOOKS).IfNotExists; 63 54 db.execute(sql); 64 55 65 sql = Create(BORROW_RECORD).IfNotExists; 56 sql = Insert(AUTHORS.ID, 1)(AUTHORS.FIRSTNAME, "Alfred")(AUTHORS.SURNAME, "Szklarski"); 57 sql ~= Insert(AUTHORS.ID, 2)(AUTHORS.FIRSTNAME, "Zbigniew")(AUTHORS.SURNAME, "Nienacki"); 58 sql ~= Insert(AUTHORS.ID, 3)(AUTHORS.FIRSTNAME, "Edmund")(AUTHORS.SURNAME, "Niziurski"); 59 sql ~= Insert(AUTHORS.ID, 4)(AUTHORS.FIRSTNAME, "Aleksander")(AUTHORS.SURNAME, "Fredro"); 66 60 db.execute(sql); 67 61 68 sql = Insert(BOOK.ID, 56)(BOOK.AUTHOR, "Alfred Szklarski")(BOOK.TITLE, "Tomek wsrod kangurow"); 62 sql = Insert(BOOKS.AUTHOR_ID, 1)(BOOKS.TITLE, "Tomek w krainie kangurów"); 63 sql ~= Insert(BOOKS.AUTHOR_ID, 1)(BOOKS.TITLE, "Tomek wÅród Åowców gÅów"); 64 sql ~= Insert(BOOKS.AUTHOR_ID, 1)(BOOKS.TITLE, "Tomek u źródeÅ Amazonki"); 65 sql ~= Insert(BOOKS.AUTHOR_ID, 1)(BOOKS.TITLE, "Tomek na Czarnym LÄ 66 dzie"); 67 sql ~= Insert(BOOKS.AUTHOR_ID, 1)(BOOKS.TITLE, "Tomek na tropach Yeti"); 68 sql ~= Insert(BOOKS.AUTHOR_ID, 1)(BOOKS.TITLE, "Tomek na wojennej ÅcieÅŒce"); 69 69 db.execute(sql); 70 70 71 sql = Select(BOOK.ID, BOOK.AUTHOR, BOOK.TITLE); 72 auto r = db.query(sql); 71 sql = Insert(BOOKS.AUTHOR_ID, 2)(BOOKS.TITLE, "Pan Samochodzik i Fantomas"); 72 sql ~= Insert(BOOKS.AUTHOR_ID, 2)(BOOKS.TITLE, "Pan Samochodzik i tajemnica tajemnic"); 73 sql ~= Insert(BOOKS.AUTHOR_ID, 2)(BOOKS.TITLE, "Pan Samochodzik i Niewidzialni"); 74 sql ~= Insert(BOOKS.AUTHOR_ID, 2)(BOOKS.TITLE, "Pan Samochodzik i zÅota rÄkawica"); 75 sql ~= Insert(BOOKS.AUTHOR_ID, 2)(BOOKS.TITLE, "Pan Samochodzik i templariusze"); 76 sql ~= Insert(BOOKS.AUTHOR_ID, 2)(BOOKS.TITLE, "Wyspa ZÅoczyÅców"); 77 db.execute(sql); 73 78 74 for(uint i=0; i<r.length; i++) { 75 writef(i); 76 writef(" - "); 77 writef(r.column(BOOK.ID).row(i)); 78 writef(" - "); 79 writef(r.column(BOOK.AUTHOR).row(i)); 80 writef(" - "); 81 writef(r.column(BOOK.TITLE).row(i)); 82 writefln; 83 } 79 sql = Insert(BOOKS.AUTHOR_ID, 3)(BOOKS.TITLE, "Sposób na Alcybiadesa"); 80 sql ~= Insert(BOOKS.AUTHOR_ID, 3)(BOOKS.TITLE, "Klub wÅóczykijów"); 81 sql ~= Insert(BOOKS.AUTHOR_ID, 3)(BOOKS.TITLE, "Siódme wtajemniczenie"); 82 sql ~= Insert(BOOKS.AUTHOR_ID, 3)(BOOKS.TITLE, "Awantura w NiekÅaju"); 83 db.execute(sql); 84 84 85 writefln(typeof(r.column(BOOK.AUTHOR).row(0u)).stringof);86 writefln(typeof(r.column(BOOK.ID).row(0u)).stringof);85 sql = Insert(BOOKS.AUTHOR_ID, 4)(BOOKS.TITLE, "Zemsta"); 86 db.execute(sql); 87 87 88 writefln("By index: ", BOOK.tupleof.length, " ", typeof(r.column(BOOK.tupleof[2]).row(5)).stringof); 89 90 writefln(r.column(BOOK.ID).asString(0u)); 91 88 sql = Select(AUTHORS.FIRSTNAME, AUTHORS.SURNAME, BOOKS.TITLE).Where(Equals(AUTHORS.ID, BOOKS.AUTHOR_ID)); 89 r = db.query(sql); 90 printCols(r, AUTHORS.FIRSTNAME, AUTHORS.SURNAME, BOOKS.TITLE); 92 91 } trunk/examples/database/TestSchema.schema
r38 r42 1 Table ( BOOK) {2 long (ID) PrimaryKey AutoIncrement3 string (AUTHOR, 2000)4 string ( TITLE, 2000)1 Table (AUTHORS) { 2 long (ID) PrimaryKey AutoIncrement 3 string (FIRSTNAME, 2000) 4 string (SURNAME, 2000) 5 5 } 6 6 7 Table (BO RROW_RECORD) {7 Table (BOOKS) { 8 8 long (ID) PrimaryKey AutoIncrement 9 int (BOOK_ID) Reference(BOOK) 10 string (PERSON, 2000) Index 11 long (BORROWED) Index 12 long (RETURNED) Index 9 long (AUTHOR_ID) Reference(AUTHORS) 10 string (TITLE, 2000) 13 11 } trunk/examples/database/database.cbp
r39 r42 21 21 <Add library="dbi" /> 22 22 <Add library="sqlite3" /> 23 <Add directory="C:\DLang\lib" /> 23 24 </Linker> 24 25 </Target> … … 34 35 <Add option="-version=ddbi_v62" /> 35 36 <Add option="-version=Tango" /> 37 <Add option="-version=dbi_sqlite" /> 36 38 <Add directory="$(#doost)" /> 37 39 <Add directory="$(#std2)" /> … … 45 47 <Add directory="C:\DLang\bin" /> 46 48 </Linker> 47 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\DBIException.d" /> 48 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\Database.d" /> 49 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\ErrorCode.d" /> 50 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\Result.d" /> 51 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\Row.d" /> 52 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\Statement.d" /> 53 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\sqlite\SqliteDatabase.d" /> 54 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\sqlite\SqliteError.d" /> 55 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\sqlite\SqliteResult.d" /> 56 <Unit filename="..\..\..\..\..\DLang\src\ddbi\dbi\sqlite\imp.d" /> 57 <Unit filename="..\..\..\..\..\DLang\src\std2\std2\conv.d" /> 49 <Unit filename="..\..\dbi\DBIException.d" /> 50 <Unit filename="..\..\dbi\Database.d" /> 51 <Unit filename="..\..\dbi\ErrorCode.d" /> 52 <Unit filename="..\..\dbi\Result.d" /> 53 <Unit filename="..\..\dbi\Row.d" /> 54 <Unit filename="..\..\dbi\Statement.d" /> 55 <Unit filename="..\..\dbi\sqlite\SqliteDatabase.d" /> 56 <Unit filename="..\..\dbi\sqlite\SqliteError.d" /> 57 <Unit filename="..\..\dbi\sqlite\SqliteResult.d" /> 58 <Unit filename="..\..\dbi\sqlite\imp.d" /> 58 59 <Unit filename="..\..\doost\core\Any.d" /> 59 <Unit filename="..\..\doost\core\Traits.d" />60 60 <Unit filename="..\..\doost\database\Column.d" /> 61 61 <Unit filename="..\..\doost\database\DbVisitor.d" /> … … 71 71 <Unit filename="..\..\doost\database\Visitor.d" /> 72 72 <Unit filename="..\..\doost\database\visitors\SqliteDb.d" /> 73 <Unit filename="..\..\doost\storage\Storage.d" />74 <Unit filename="..\..\doost\text\Scanner.d" />75 <Unit filename="..\..\doost\util\DUnit.d" />76 73 <Unit filename="PackageTest.d" /> 77 74 <Unit filename="TestSchema.d" /> 78 <Unit filename="TestSchema.schema" />79 75 <Extensions> 80 76 <envvars /> trunk/examples/util/config/util_config.cbp
r38 r42 87 87 <Add option="-debug" /> 88 88 <Add option="-D" /> 89 <Add option="-Dd$(#doost)/doc/util/config/ddoc/ -version=Phobos" />89 <Add option="-Dd$(#doost)/doc/util/config/ddoc/" /> 90 90 <Add option="-version=ddbi_v62" /> 91 91 <Add directory="$(#doost)" /> … … 100 100 <Add directory="C:\DLang\bin" /> 101 101 </Linker> 102 <Unit filename="..\..\..\dbi\DBIException.d"> 103 <Option target="FunctionTest" /> 104 </Unit> 105 <Unit filename="..\..\..\dbi\Database.d"> 106 <Option target="FunctionTest" /> 107 </Unit> 108 <Unit filename="..\..\..\dbi\ErrorCode.d"> 109 <Option target="FunctionTest" /> 110 </Unit> 111 <Unit filename="..\..\..\dbi\Result.d"> 112 <Option target="FunctionTest" /> 113 </Unit> 114 <Unit filename="..\..\..\dbi\Row.d"> 115 <Option target="FunctionTest" /> 116 </Unit> 117 <Unit filename="..\..\..\dbi\Statement.d"> 118 <Option target="FunctionTest" /> 119 </Unit> 120 <Unit filename="..\..\..\dbi\sqlite\SqliteDatabase.d"> 121 <Option target="FunctionTest" /> 122 </Unit> 123 <Unit filename="..\..\..\dbi\sqlite\SqliteError.d"> 124 <Option target="FunctionTest" /> 125 </Unit> 126 <Unit filename="..\..\..\dbi\sqlite\SqliteResult.d"> 127 <Option target="FunctionTest" /> 128 </Unit> 129 <Unit filename="..\..\..\dbi\sqlite\imp.d"> 130 <Option target="FunctionTest" /> 131 </Unit> 102 132 <Unit filename="..\..\..\doost\core\Any.d" /> 103 133 <Unit filename="..\..\..\doost\storage\Storage.d" /> … … 127 157 <Unit filename="..\..\..\doost\util\config\Utils.d" /> 128 158 <Unit filename="..\..\..\doost\util\config\Value.d" /> 129 <Unit filename="..\..\..\doost\util\config\Version.d" />130 159 <Unit filename="..\..\..\doost\util\serializer\Registry.d" /> 131 160 <Unit filename="..\..\..\doost\util\serializer\Serializer.d" />
