diff=20--git=20a/src/erlydb/erlydb.erl=20b/src/erlydb/erlydb.erl=0Aindex=20=
b3ed408..3b27525=20100644=0A---=20a/src/erlydb/erlydb.erl=0A+++=20=
b/src/erlydb/erlydb.erl=0A@@=20-568,10=20+568,21=20@@=20=
get_db_fields(Module,=20DbFields)=20->=0A=20=09=20=20=20=20'*'=20->=20=
[set_attributes(Field,=20[])=20||=20Field=20<-=20DbFields];=0A=20=09=20=20=
=20=20DefinedFields=20->=0A=20=09=09DefinedFields1=20=3D=0A-=09=09=20=20=20=
=20lists:map(fun({_Name,=20_Atts}=20=3D=20F)=20->=20F;=0A-=09=09=09=09=20=
(Name)=20->=20{Name,=20[]}=0A-=09=09=09=20=20=20=20=20=20end,=20=
lists:usort(DefinedFields)),=0A-=09=09=0A+=09=09=20=20=20=20%%=20=
Normalize=20the=20list=20of=20fields=0A+=09=09=20=20=20=20%%=20Throw=20=
an=20error=20if=20any=20field=20is=20duplicated=0A+=09=09=20=20=20=20=
lists:foldr(fun({Name,=20_Atts}=20=3D=20F,=20Acc)=20->=0A+=09=09=09=09=09=
case=20lists:keymember(Name,=201,=20Acc)=20of=0A+=09=09=09=09=09=20=20=20=
=20true=20->=0A+=09=09=09=09=09=09exit({duplicate_field,{"fields/0=20=
returns=20duplicate=20field",F}});=0A+=09=09=09=09=09=20=20=20=20false=20=
->=0A+=09=09=09=09=09=09[F|Acc]=0A+=09=09=09=09=09end=0A+=09=09=09=09=
end,=0A+=09=09=09=09[],=0A+=09=09=09=09lists:map(fun({_Name,=20_Atts}=20=
=3D=20F)=20->=20F;=0A+=09=09=09=09=09=20=20=20=20=20(Name)=20->=20{Name,=20=
[]}=0A+=09=09=09=09=09=20=20end,=20DefinedFields)),=0A+=09=09=09=09=0A=20=
=09=09PkFields=20=3D=20[{erlydb_field:name(Field),=20[]}=20||=0A=20=09=09=
=09=20=20=20=20=20=20=20Field=20<-=20DbFields,=0A=20=09=09=09=20=20=20=20=
=20=20=20erlydb_field:key(Field)=20=3D=3D=20primary,=0Adiff=20--git=20=
a/src/erlydb/erlydb_base.erl=20b/src/erlydb/erlydb_base.erl=0Aindex=20=
477329d..b422201=20100644=0A---=20a/src/erlydb/erlydb_base.erl=0A+++=20=
b/src/erlydb/erlydb_base.erl=0A@@=20-1735,7=20+1735,16=20@@=20=
field_names_for_query(Module,=20UseStar)=20->=0A=20=09=09=20=20=20=20=
Module:db_field_names()=0A=20=09=20=20=20=20end;=0A=20=09_Fields=20->=0A=
-=09=20=20=20=20Module:db_field_names()=0A+=09=20=20=20=20=
lists:map(fun(Field)=20->=0A+=09=09=09=20=20=20=20=20=20case=20=
erlydb_field:is_transient(Field)=20of=0A+=09=09=09=09=20=20true=20->=0A+=09=
=09=09=09=20=20=20=20=20=20undefined;=0A+=09=09=09=09=20=20false=20->=0A=
+=09=09=09=09=20=20=20=20=20=20erlydb_field:name(Field)=0A+=09=09=09=20=20=
=20=20=20=20end=0A+=09=09=20=20=20=20=20=20end,=0A+=09=09=20=20=20=20=20=20=
Module:db_fields())=0A+=09=09=09=20=20=20=20=20=20=0A=20=20=20=20=20end.=0A=
=20=0A=20=0Adiff=20--git=20a/src/erlydb/erlydb_mnesia.erl=20=
b/src/erlydb/erlydb_mnesia.erl=0Aindex=20bd7a136..4d19266=20100644=0A---=20=
a/src/erlydb/erlydb_mnesia.erl=0A+++=20b/src/erlydb/erlydb_mnesia.erl=0A=
@@=20-184,11=20+184,10=20@@=20start(_Options)=20->=0A=20=
get_metadata(_Options)=20->=0A=20=09%=20NOTE=20Integration=20with=20=
mnesia_rdbms=20would=20be=20interesting...=0A=20=20=20=20=20Tables=20=3D=20=
mnesia:system_info(tables)=20--=20[schema],=0A-=20=20=20=20Tree=20=3D=20=
lists:foldl(=0A+=20=20=20=20lists:foldl(=0A=20=09=09=09fun(Table,=20=
TablesTree)=20->=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=09=
gb_trees:enter(Table,=20get_metadata(Table,=20table_fields(Table)),=20=
TablesTree)=0A-=20=20=20=20=20=20=20=20=09end,=20gb_trees:empty(),=20=
Tables),=0A-=09{ok,=20Tree}.=0A+=20=20=20=20=20=20=20=20=09end,=20=
gb_trees:empty(),=20Tables).=0A=20=0A=20get_metadata(Table,=20Fields)=20=
when=20is_list(Fields)=20->=0A=20=20=20=20=20[get_metadata(Table,=20=
Field)=20||=20Field=20<-=20Fields];=0A@@=20-509,7=20+508,9=20@@=20=
extras([Extra=20|=20Extras],=20QHDesc)=20->=0A=20extras([],=20QHDesc)=20=
->=0A=20=20=20=20=20QHDesc;=0A=20=0A-extras({order_by,=20{Field,=20=
Order}},=20#qhdesc{metadata=20=3D=20QLCData}=20=3D=20QHDesc)=20when=20=
is_atom(Field)=20->=0A+extras({order_by,=20Field},=20QHDesc)=20when=20=
is_atom(Field)=20->=0A+=20=20=20=20extras({order_by,=20{Field,=20asc}},=20=
QHDesc);=0A+extras({order_by,=20{Field,=20Order}},=20#qhdesc{metadata=20=
=3D=20QLCData}=20=3D=20QHDesc)=20->=0A=20=20=20=20=20=
QHDesc#qhdesc{postqh=20=3D=0A=20=09=09fun(QH,=20QHOptions)=20->=0A=20=09=09=
=09[Table=20|=20_Rest]=20=3D=20dict:fetch(tables,=20QLCData),=0Adiff=20=
--git=20a/test/erlydb/erlydb_test.erl=20b/test/erlydb/erlydb_test.erl=0A=
index=207f0ff12..9931107=20100644=0A---=20a/test/erlydb/erlydb_test.erl=0A=
+++=20b/test/erlydb/erlydb_test.erl=0A@@=20-31,8=20+31,9=20@@=20=
erlydb_psql_init()=20->=0A=20=0D=0A=20=0D=0A=20code_gen(Database)=20->=0D=
=0A-=20=20=20=20erlydb:code_gen(Database,=20[language,=20project,=20=
developer,=20musician,=20employee,=20=0D=0A-=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20person,=20=
customer,=20store,=20item],=20[]).=0D=0A+=20=20=20=20Components=20=3D=20=
[language,=20project,=20developer,=20musician,=0D=0A+=09=09=20=20=
employee,=20person,=20customer,=20store,=20item],=0D=0A+=20=20=20=20=
erlydb:code_gen(Components,=20Database,=20[]).=0D=0A=20=0D=0A=20test()=20=
->=0D=0A=20=20=20=20=20test(mysql).=0D=0A=
