Changeset 42

Show
Ignore:
Timestamp:
06/23/08 17:54:30 (2 months ago)
Author:
aarti_pl
Message:

- updates

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/.classpath

    r32 r42  
    33    <classpathentry excluding="*.cbp;*.conf|bin/|doc/|doc/text/|doc/text/ddoc/|doc/util/serializer/ddoc/" kind="src" path=""/> 
    44    <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"/> 
    75    <classpathentry kind="output" path=""/> 
    86</classpath> 
  • trunk/.project

    r32 r42  
    1111            </arguments> 
    1212        </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>&lt;project&gt;/.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>&lt;project&gt;/.externalToolBuilders/Rebuild [Builder].launch</value> 
     30                </dictionary> 
     31            </arguments> 
     32        </buildCommand> 
    1333    </buildSpec> 
    1434    <natures> 
  • trunk/.settings/descent.ui.prefs

    r32 r42  
    1 #Fri Feb 08 23:56:51 CET 2008 
     1#Mon Jun 23 21:12:39 CEST 2008 
    22descent.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/> 
    33eclipse.preferences.version=1 
     4internal.default.compliance=user 
  • trunk/doost/database/DbVisitor.d

    r39 r42  
    2323 ******************************************************************************/ 
    2424interface DbVisitor : Visitor { 
     25    //TODO: tak na prawdę powinno się tu uÅŒyć interfejsów queriable, executable 
    2526    void execute(Sql); 
    2627    Recordset query(Sql); 
  • trunk/doost/database/Expression.d

    r39 r42  
    1717 
    1818import doost.api.Common; 
     19import doost.core.Any; 
     20import doost.core.Traits; 
    1921import doost.database.Column; 
    2022 
    21 enum ExType {Equals} 
     23enum ExType { 
     24        Less, LessEquals, 
     25        Equals, 
     26        MoreEquals, More 
     27
     28 
     29enum ExArg { 
     30    ColVal, ColCol, ExpExp 
     31
    2232 
    2333/******************************************************************************* 
    2434 ******************************************************************************/ 
    2535class Expression { 
    26  
    27  
    28     this(ExType type) { 
     36    this(Column column, ExType type, Any value) { 
     37        m_arg = ExArg.ColVal; 
    2938        m_type = type; 
     39        m_column = column; 
     40        m_value = value; 
    3041    } 
    3142 
    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; 
    3448    } 
    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; 
    3756} 
    3857 
    39 DataColumn!(T.VALUE_TYPE) column(T)(T col) { 
    40     static assert(is(T : Column)); 
    41     return new DataColumn!(T.VALUE_TYPE); 
     58string 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    `; 
    4271} 
    4372 
    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[])); 
     73mixin(logExp("Less")); 
     74mixin(logExp("LessEquals")); 
     75mixin(logExp("Equals")); 
     76mixin(logExp("MoreEquals")); 
     77mixin(logExp("More")); 
    4878 
    49     return new Expression(ExType.Equals); 
     79Expression And(Expression[] exp...) { 
     80    return null; 
    5081} 
    5182 
    52 Expression land(T, U)(T column, U value) { 
     83Expression Or(Expression[] exp...) { 
    5384    return null; 
    5485} 
     86 
     87Expression 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  
    4444 
    4545//TODO: prywatny konstruktor; moÅŒliwość utworzenia tylko w warstwie bazy danych 
     46//TODO: Null type? 
    4647 
    4748/******************************************************************************* 
  • trunk/doost/database/Sql.d

    r39 r42  
    2929public abstract class Sql : Element { 
    3030    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; 
    3146} 
    3247 
     48public abstract class SqlExecutable : Sql { 
     49 
     50    public abstract override void accept(Visitor visitor); 
     51} 
     52 
     53public abstract class SqlQueriable : Sql { 
     54    public abstract override void accept(Visitor visitor); 
     55} 
  • trunk/doost/database/SqlCreate.d

    r39 r42  
    3030} 
    3131 
    32 public class SqlCreate : Sql
     32public class SqlCreate : SqlExecutable
    3333    public this(Table table) { 
    3434        this.table = table; 
  • trunk/doost/database/SqlInsert.d

    r39 r42  
    4242} 
    4343 
    44 class SqlInsert : Sql
     44class SqlInsert : SqlExecutable
    4545    package Table table; 
    4646    package InsDef[] defs; 
  • trunk/doost/database/SqlSelect.d

    r39 r42  
    3636} 
    3737 
    38 public class SqlSelect : Sql
     38public class SqlSelect : SqlQueriable
    3939    public override void accept(Visitor visitor) { 
    4040        visitor.visit(this); 
    4141    } 
    4242 
    43     public SqlSelect Where(Expression b) { 
     43    public SqlSelect Where(Expression expression) { 
     44        m_expression = expression; 
    4445        return this; 
    4546    } 
     
    5051 
    5152    private void addColumn(Column c) { 
    52         columns ~= c; 
     53        m_columns ~= c; 
    5354    } 
    5455 
    55     package Column[] columns; 
     56    package Column[] m_columns; 
     57    package Expression m_expression; 
    5658} 
  • trunk/doost/database/visitors/SqliteDb.d

    r39 r42  
    2424import doost.database.Column; 
    2525import doost.database.Table; 
     26import doost.database.Expression; 
    2627import dbi.sqlite.SqliteDatabase; 
    2728 
     
    4142        database = new SqliteDatabase(name); 
    4243    } 
    43      
     44 
    4445    /*************************************************************************** 
    4546     **************************************************************************/ 
     
    5253    } 
    5354 
     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; 
    5457    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        } 
    5970    } 
    6071 
    6172    Recordset query(Sql sqlObject) { 
    6273        sqlObject.accept(this); 
    63  
    6474        writefln(sql); 
    6575        auto res = database.query(sql); 
     
    7989 
    8090        foreach(col; sqlCreate.table.pcolumns) { 
    81             sql ~= rest ~ col.name ~ " " ~ col.type
     91            sql ~= rest ~ col.name ~ " " ~ typeToDbType(col.type)
    8292            rest = ", "; 
    8393        } 
     
    90100        bool[string] tables; 
    91101 
     102        //SELECT 
    92103        sql = "SELECT "; 
    93  
    94         foreach(col; sqlSelect.columns) { 
     104        foreach(col; sqlSelect.m_columns) { 
    95105            tables[col.table.name] = true; 
    96106            sql ~= rest ~ col.table.name ~ "." ~ col.name; 
     
    98108        } 
    99109 
     110        //FROM 
    100111        sql ~= " FROM "; 
    101112        rest =""; 
     
    105116        } 
    106117 
     118        //WHERE 
     119        if (sqlSelect.m_expression !is null) { 
     120            sql ~= " WHERE "; 
     121            sql ~= evaluateExpression(sqlSelect.m_expression); 
     122        } 
     123 
    107124        sql ~= ";"; 
    108125    } 
     
    136153    } 
    137154 
     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 
    138206    public string sql; 
    139207} 
  • trunk/examples/database/PackageTest.d

    r39 r42  
    2828//------------------------------------------------------------------------------ 
    2929 
     30void 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 
    3046void 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ędzie 
    52     //generował i wykonywał polecenia; dzięki temu moÅŒna łatwo zasymulować 
    53     //e.g. IF NOT EXISTS dla create table 
    54     //takÅŒe moÅŒna zrobić prepared statement albo mapować konkretne typy na 
    55     //pytajniki 
    56     //tylko jak wtedy wymieniać bazy??? 
    57     //visitor ewentualnie moÅŒe zwracać informacje, ÅŒe niektóre operacje sÄ 
    58  unsupported 
    59  
    6047    auto db = new SqliteDb("database.sqlite"); 
    6148 
    62     sql = Create(BOOK).IfNotExists; 
     49    Sql sql; 
     50    Recordset r; 
     51 
     52    sql  = Create(AUTHORS).IfNotExists; 
     53    sql ~= Create(BOOKS).IfNotExists; 
    6354    db.execute(sql); 
    6455 
    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"); 
    6660    db.execute(sql); 
    6761 
    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Ä 
     66dzie"); 
     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"); 
    6969    db.execute(sql); 
    7070 
    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); 
    7378 
    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); 
    8484 
    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); 
    8787 
    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); 
    9291} 
  • trunk/examples/database/TestSchema.schema

    r38 r42  
    1 Table (BOOK) { 
    2     long    (ID) PrimaryKey AutoIncrement 
    3     string     (AUTHOR, 2000) 
    4     string  (TITLE, 2000) 
     1Table (AUTHORS) { 
     2   long    (ID) PrimaryKey AutoIncrement 
     3   string  (FIRSTNAME, 2000) 
     4    string  (SURNAME, 2000) 
    55} 
    66 
    7 Table (BORROW_RECORD) { 
     7Table (BOOKS) { 
    88    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) 
    1311} 
  • trunk/examples/database/database.cbp

    r39 r42  
    2121                    <Add library="dbi" /> 
    2222                    <Add library="sqlite3" /> 
     23                    <Add directory="C:\DLang\lib" /> 
    2324                </Linker> 
    2425            </Target> 
     
    3435            <Add option="-version=ddbi_v62" /> 
    3536            <Add option="-version=Tango" /> 
     37            <Add option="-version=dbi_sqlite" /> 
    3638            <Add directory="$(#doost)" /> 
    3739            <Add directory="$(#std2)" /> 
     
    4547            <Add directory="C:\DLang\bin" /> 
    4648        </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" /> 
    5859        <Unit filename="..\..\doost\core\Any.d" /> 
    59         <Unit filename="..\..\doost\core\Traits.d" /> 
    6060        <Unit filename="..\..\doost\database\Column.d" /> 
    6161        <Unit filename="..\..\doost\database\DbVisitor.d" /> 
     
    7171        <Unit filename="..\..\doost\database\Visitor.d" /> 
    7272        <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" /> 
    7673        <Unit filename="PackageTest.d" /> 
    7774        <Unit filename="TestSchema.d" /> 
    78         <Unit filename="TestSchema.schema" /> 
    7975        <Extensions> 
    8076            <envvars /> 
  • trunk/examples/util/config/util_config.cbp

    r38 r42  
    8787            <Add option="-debug" /> 
    8888            <Add option="-D" /> 
    89             <Add option="-Dd$(#doost)/doc/util/config/ddoc/ -version=Phobos" /> 
     89            <Add option="-Dd$(#doost)/doc/util/config/ddoc/" /> 
    9090            <Add option="-version=ddbi_v62" /> 
    9191            <Add directory="$(#doost)" /> 
     
    100100            <Add directory="C:\DLang\bin" /> 
    101101        </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> 
    102132        <Unit filename="..\..\..\doost\core\Any.d" /> 
    103133        <Unit filename="..\..\..\doost\storage\Storage.d" /> 
     
    127157        <Unit filename="..\..\..\doost\util\config\Utils.d" /> 
    128158        <Unit filename="..\..\..\doost\util\config\Value.d" /> 
    129         <Unit filename="..\..\..\doost\util\config\Version.d" /> 
    130159        <Unit filename="..\..\..\doost\util\serializer\Registry.d" /> 
    131160        <Unit filename="..\..\..\doost\util\serializer\Serializer.d" />