June 11, 2007
Christian,

I have merged the two functions together as per your suggestion.

This is the final version:

> /* Fetch a type aware record from the database and populate the struct.
>  *
>  * With thanks to Chris Nicholson-Sauls, Lutger Blijdestijn, and Christian Kam.
>  */
> T fetchstruct(T) () {
> 
>    static if (is (T == struct)) {
> 
>       T t;
> 
>       /* Check if last struct field is a bool array of correct size to store
>        * null flags.
>        */       static if (is (typeof (t.tupleof[$-1]) == bool[t.tupleof.length-1])) {
>          const bool hasNullFlags = true;
>       } else {
>          const bool hasNullFlags = false;
>       }
> 
>       /* When the last field is a bool array of the correct size to store
>        * null flags, exclude from the type tuple.
>        */
>       static if (hasNullFlags) {
>          auto r = fetchone!(FieldTypeTuple!(T)[0..length-1])();
> 
>       } else {
>          auto r = fetchone!(FieldTypeTuple!(T))();
>       }
> 
>       /* Populate the structure from the fetched data.
>        */
>       foreach (i, v; r.t) {
>          // According to Christian, using v may not work every time.
>          t.tupleof[i] = r.t[i];
>       }
> 
>       /* If the structure contains nullFlags, populate it.
>        */
>       static if (hasNullFlags) {
> 
>          foreach (i, nullFlagValue; r.nullFlag) {
>             /* I use the name of the field instead of tupleof to guarantee
>              * the name so helper functions can be written.
>              */
>             t.nullFlag[i] = nullFlagValue;
>          }
>       }
>        return t;
> 
>    } else {
>       static assert (0, "Invalid type, must be a struct.");
>    }
> }


Thanks,

Myron.
1 2
Next ›   Last »