2010-06-11 7 views
3

J'essaye d'implémenter une fonction qui génère des requêtes dynamiques pour MNesia.Comment implémenter des requêtes dynamiques pour MNesia?

Par exemple, lorsque la fonction est appelée avec ces arguments;

dyn_query(list, person, [name, age], ["jack", 21]) 

Je veux interroger Mnesia à liste éléments dont le nom est "jack" et âge est en personne table.

J'ai essayé de l'implémenter en utilisant qlc: q (ListComprehension) et qlc: string_to_handle ("ListComprehension"). D'abord échoué à cause des erreurs de compilation, le compilateur ne m'a pas permis d'utiliser des fonctions au lieu de ListComprehentions et des variables au lieu de noms d'enregistrements comme "Item # Table.Field". La seconde a échoué, car erl_eval ne pouvait pas gérer les enregistrements et renvoyer des exceptions telles que {undefined_record, person}.

Quelle méthode dois-je utiliser? Comment pourrais-je résoudre ces problèmes? Ou devrais-je utiliser une méthode différente?

Merci.

+0

Les enregistrements sont des constructions de temps de compilation que vous ne pouvez pas utiliser dynamiquement en exécution. Fondamentalement, au moment de la compilation, tous vos enregistrements sont convertis en tuples ressemblant à ceci {person, "jack", 21}. De ce fait, il n'y a aucun moyen pour l'exécution de comprendre ce que vous demandez quand vous dites Item # Table.Field. Voir http://www.erlang.org/doc/reference_manual/records.html pour plus de détails sur les enregistrements. – Lukas

Répondre

1

Vérifiez les spécifications de correspondance que mnesia:select/1 utilise pour les requêtes sur une table. Il y a mnesia:table_info/2 pour trouver les noms de colonne (et les index de colonne) d'une table.

Les types de correspondance sont documentés dans ERTS user guide on match specifications. J'ai l'habitude d'utiliser ets:fun2ms/1 qui est une transformation d'analyse pratique qui peut créer une matchspec à partir de la syntaxe amusante erlang-regardant à la compilation. Vous pouvez jouer directement avec le shell directement.

1

Vous pouvez essayer "exprecs". Ils sont expliqués ici:

http://forum.trapexit.org/viewtopic.php?p=21790

lecture de la description:

La transformation ajoute des fonctions accesseurs pour l'instanciation, l'inspection et modifier les enregistrements, sans avoir à introduisons à la compilation des dépendances entre les modules.

Des exemples sont fournis dans cette page. Voir si cela aide.

Questions connexes