Aide - Recherche - Membres - Calendrier
Version complète : création de PDB sur le PC
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS
olivier101
Je voudrais générer une base de données dans un PDB sur le PC, dans le but de la lire sur le Palm.

La structure de la base est très simple, chaque enregistrement est une "struct" C de taille fixe avec des Int16, des char[], et un float (mais on pourrait mettre un int si ça pose problème).

La source est au choix, un fichier Excel, un fichier CSV. Dans le pire des cas s'il existe une bibliothèque C qui permet ça, je peux écrire le prog. Dans le pire des pires des cas, la structure des fichiers PDB est publiée par Palm donc je devrais pouvoir le créer "à la mano" mais s'il y a mieux je suis preneur !

J'ai regardé du côté de CPDB, mais ce n'est pas ce que je cherche car CPDB utilise son propre format de base, et oblige à utiliser la bibliothèque CPDB sur le palm pour lire la base.
Guy-Lux
Chouette, j'allais poser la même question.... sourire.gif
Patrice
Il y a quelques outils pour convertir des fichiers "tablés" en PDB mais je ne les ai pas utilisés... donc pour les retrouver... :?

En revanche, j'avais proposé il y a quelque temps un "template" de programme C (ANSI, utilisable à peu près partout) pour compiler son propre fichier. Un peu plus lourd, mais vous pouvez organiser votre fichier comme vous voulez...

C'était ICI (en bas).
Patrice
Une recherche sur "PDB" sur Palmgear a l'air de donner de bons résultats, dont peut-être celui-ci.

Par ailleurs, j'ai porté mes générateurs en java, donc si intérêt il y a (et si je trouve le temps), je pourrai éventuellement proposer l'équivalent de mon "template" en java...
naguttes
Ah oui on veut bien! icon_lol2.gif
Patrice
Tiens ! un revenant icon_lol2.gif Tu étais noyé dans ton code ? anim_wink.gif
olivier101
Merci pour les pistes...

CITATION(Patrice)
Par ailleurs, j'ai porté mes générateurs en java, donc si intérêt il y a (et si je trouve le temps), je pourrai éventuellement proposer l'équivalent de mon "template" en java...

Générateurs de quoi ??
Patrice
Générateur de bases de métro, d'horaires AF, de Villages de France ... et d'autres choses encore (non publiques anim_wink.gif )
snark
Perl a aussi des modules pour créer des PDBs. Ajoute à ça un module pour lire le CSV et tu auras facilement un convertisseur en mode texte.

Recherche dans CPAN:
PDB
CSV
olivier101
Je n'ai pas trop envie de faire ça en perl...

J'ai trouvé ça qui a l'air très intéressant:
http://obermuhlner.com/public/Projects/Palm/PDBC/

PS: en le téléchargeant je m'aperçois que je l'avais déjà sur mon disque..... rolleyes.gif comme quoi j'avais déjà dû tomber dessus précédemment...
Tabetozor
CITATION(Patrice)
et d'autres choses encore (non publiques anim_wink.gif )

On le passe à la question... pour savoir de quoi il parle anim_grin.gif
olivier101
Il a pas dit "pas encore publiques", il a dit "non publiques".....
naguttes
CITATION(Patrice)
Tiens ! un revenant icon_lol2.gif Tu étais noyé dans ton code ? anim_wink.gif


J'ai pas mal de boulot actuellement et je n'avance pas beaucoup. J'ai prévu d'y travailler ce week end avec espoir de vous montrer quelque chose avant la fin du mois (c'est à dire ce week end :? ).

Mais ne t'inquète pas je n'ai pas abandonné anim_wink.gif
naguttes
Je relance le sujet car j'ai besoin de créer un fichier avec pas mal d'enregistrements.

Olivier, as tu avancé dans tes tests?

Patrice, tu parlais de porter tes générateurs en java. Est ce disponible?
olivier101
Oui tout à fait, PDBC répond à mes attentes. Le format d'entrée est suffisamment simple et ça fonctionne comme prévu.

Par contre, j'aimerais trouver une bibliothèque Java pour faire ça, car ce que je fais aujourd'hui est un peu alambiqué: j'ai un GUI Java qui lit un fichier XML, le transforme en fichier au format PDBC, et appelle PDBC pour générer le PDB... rolleyes.gif
Si je pouvais sauter l'étape PDBC ça serait plus propre.
Patrice
Hi hi hi... J'avais complètement oublié ma version java icon_bla.gif Je vais essayer de vous mettre ça en forme assez rapidement...
Patrice
L'oubli va être réparé... Voilà un exemple de source java pour créer un PDB. Celui-ci est simple car il ne sort qu'un enregistrement, mais l'adaptation pour des enregistrements multiples n'est pas trop compliqué et j'ai indiqué ce qu'il y avait à faire (en gros le plus complexe est de calculer les offsets de chacun des records).

Enjoy icon_biggrin.gif

CODE
/**
* Write a PDB in an open DataOutputStream
* This example writes only one record
* See '$$$' comments to output multiple record
* @param name Database "display" name
* @param type Database type
* @param crea Database creator ID
* @param data Content to write
*/
protected void OutputPDB(String name, String type, String crea, String data, DataOutputStream os) throws IOException
{
    // This example outputs data in one record only
    // $$$ Adjust if multiple records required $$$
    short nbrecord = 1;

    // Output header
    // Database name
    os.writeBytes(name);
    for (int i=0; i<32-name.length(); i++)
    {
 os.writeByte(0);
    }

    // Database attributes
    os.writeShort((short) 0);

    // Database version number
    os.writeShort(0x100);

    // Dates (creation, modification, backup)
    // Dates are in seconds from 1904 (Java in ms from 1970)
    Date date = new Date();
    os.writeInt(0x7C25B080 + (int) (date.getTime() / 1000));
    os.writeInt(0x7C25B080 + (int) (date.getTime() / 1000));
    os.writeInt(0);

    // Unused data (modif number, app info ID, sort info ID)
    os.writeInt(0);
    os.writeInt(0);
    os.writeInt(0);

    // DB type and creator (exactly 4 chars strings)
    os.writeBytes(type);
    os.writeBytes(crea);

    // Unused data (seed ID, next record ID)
    os.writeInt(0);
    os.writeInt(0);

    // Number of records
    os.writeShort((short) nbrecord);

    // Record offsets
    // $$$ For multiple records: do the same for each record          $$$
    // $$$ Compute offset from top of file and write a complete entry $$$
    // $$$ For example the next record after this one would be:       $$$
    // $$$ offset += data.GetLength();                                $$$
    // Calculate offset of first record
    int offset = 0x50 + 8 * nbrecord;
    os.writeInt(offset);

    // Record attribute (1 byte) and ID (3 bytes)
    os.writeInt(0x10000000);

    // Filler required by some sync tools
    os.writeShort((short) 0);

    // Output record data
    os.writeBytes(data);

    // $$$ Write other records here $$$
}
olivier101
Merci Patrice...
naguttes
Merci Patrice, je n'ai pas tout compris car je ne connais rien à Java icon_cry.gif .
Comment tu executes ce programme?
Si tu veux mettre en entrée (au lieu de Data) un fichier texte avec plusieurs champs comment fais tu.

Pas d'urgence
naguttes
Je vais être plus précis, j'ai mon fichier de départements :
champs 1 (entier) numéro: 1
champs 2 (char) nom : Ain
Champs 3 (entier) population : 515270

et ainsi de suite pour tous les départements
Chris_34
Bien que je programme un peu en java, je suis perdu : pourrais-tu expliquer à quoi tous ces paramètres correspondent
name type crea data

(avec un petit exemple pour tester le programme ce serai parfait) anim_wink.gif
olivier101
En fait je n'ai pas pris le temps d'intégrer tes fonctions Patrice, aujourd'hui mon java génère un fichier texte que PDBC compile ensuite.Je préfèrerais évidemment générer le PDB directement, mais plutot que de débugger la génération du PDB j'ai préféré faire dans le sûr...

Auijourd'hui tu n'as pas une petite classe bien propre qui fasse ça ?
snark
CITATION(naguttes)
Merci Patrice, je n'ai pas tout compris car je ne connais rien à Java icon_cry.gif .
Comment tu executes ce programme?
Si tu veux mettre en entrée (au lieu de Data) un fichier texte avec plusieurs champs comment fais tu.

Patrice a juste posté la fonction. Il faut au moins lui rajouter un main() qui lira les infos (soit dans un fichier, soit en interactif, soit en paramètres de ligne de commande), et écrit le résultat dans un stream (ouvert par la fonction appelante), pour que ça soit utilisable en programme indépendant.
Patrice
J'ai quand même commenté la "signification" des paramètres de la fonction, non ? rolleyes.gif
Chris_34
En fait c'est type et crea qui me posent problème. Je ne comprend pas ce qu'il faut leur passer. Mais bon, c'est la fin de la semaine, et je suis un peu fatiguée... icon_bla.gif
Eddy
CITATION(Chris_34)
En fait c'est type et crea qui me posent problème. Je ne comprend pas ce qu'il faut leur passer. Mais bon, c'est la fin de la semaine, et je suis un peu fatiguée... icon_bla.gif


Ben c'est le type et le creator ID de la base à créer, non ? (ce sont des notions palm, non specifique au programme de patrice). 'fin, si j'ai bien tout compris sourire.gif

Eddy
Patrice
CITATION(Eddy)
Ben c'est le type et le creator ID de la base à créer, non ? (ce sont des notions palm, non specifique au programme de patrice). 'fin, si j'ai bien tout compris sourire.gif

anim_oui.gif anim_wink.gif

A noter (et ce n'était pas précisé) que ces deux strings doivent comporter exactement 4 caractères...
Chris_34
Et on trouve toutes ses informations dans la doc de SDK de palmSource, c'est ça ?
Patrice
CITATION(Chris_34)
Et on trouve toutes ses informations dans la doc de SDK de palmSource, c'est ça ?

Je ne comprend pas la question ? Toute base Palm (pdb, prc, pqa) a un type et un creator id. Le Creator ID pour un pdb est en général celui de l'appli à laquelle il est destinée. Le type est libre pour un pdb (mais c'est 'appl' pour une application, par exemple).

Il est certain qu'il vaut mieux avoir une idée du format des fichiers Palm avant d'essayer de programmer un générateur. Et la doc est bien fournie avec le SDK anim_wink.gif
Chris_34
Ok, je vais essayer de cogiter tous ça pour pouvoir (enfin) créer des .pdb sur PC. sourire.gif
Merci
Chris_34
A priori, j'ai réussi à créer un .pdb mais j'aimerai le tester avec Wireless Toolkit. Je cois avoir compris ou il faut mettre le fichier ...appdb mais mes fichiers contenant des records déjà présent sont des .db?!? Et lorsque je lance l'application, il ne trouve pas le fichier.... |[img]style_emoticons/default/anim_mur.gif[/img] j'y comprend plus rien.
sinclair
J'ai eu l'occasion de me pencher longuement sur le sujet, et je suis en passe de proposer la v2.0 MdbToHB (freeware).
Le concept est d'utiliser une base Access comme source de données (table, table liéé, et requête).
A partir de là, on peut genèrer un PDB.

Elements requis :
1. DAO 3.6 et Jet 4.0
2. HB++ 1.04 minimum pour avoir l'ActiveX HBDAO enregistré

Pour l'instant MdbToHB 2.0 est juste un "outil bien pratique", mais la 2.1 permettra d'utiliser le soft en ligne de commande....et sera toujours Freeware.

Si ça peut vous rendre service ....
olivier101
Euh, et tu mets quoi dans le PDB que tu génères ?? sous quel format?
Patrice
CITATION(olivier101)
Euh, et tu mets quoi dans le PDB que tu génères ?? sous quel format?

Je suppose que c'est un format spécifique HB++ anim_wink.gif
sinclair
Etant utilisateur HB++, je ne me suis jamais trop posé la question.
Il me semble tout de même qu'il s'agisse d'un PDB natif.
A vérifier ici:
http://www.handheld-basic.com/forum/viewtopic.php?t=25
Le contenu dépend bien entendu de la source de données.
Patrice
Le format "pdb" ne définit pas la structure des données... Donc j'en déduis que le format créé pour HB++ est spécifique à celui-ci.

Il n'y a aucune notion de standard qui intervienne : une base Palm doit simplement respecter une structure standard d'"encapsulation", son contenu est entièrement libre (aux limitations de l'OS près).

Et pour un développeur C/C++, il faut connaître la structure interne des données pour exploiter une base.
sinclair
ok...je comprends mieux la difficulté.
Par contre, si je pars du principe que la structure du PDB découle directement de celle de la table Access, je peux essayer d'en déduire la déclaration en C++.

Je vais creuser cette idée....sauf si vous pensez que je fais fausse route.
olivier101
CITATION(sinclair)
Par contre, si je pars du principe que la structure du PDB découle directement de celle de la table Access, je peux essayer d'en déduire la déclaration en C++.

Euh... bonne chance ! Je pense que c'est un travail de reverse engineering colossal, il y a des milliers de façons d'encapsuler une table relationnelle dans un fichier...
Corto
j'interviens tard dans la discussion mais vous pouvez aussi aller voir palm-db-tools qui est le compilateur de Pilot-DB.
Comme il est le compilateur de Pilot-DB tout le monde croit qu'il est spécifique à Pilot-DB mais il peut aussi faire des bases pour MobileDB et JFile.
Il est écrit en C++ et il est fait pour que les classes soient simples à dériver pour créer un nouveau format.
Cà demande du développement que d'autres générateurs n'ont pas mais il permet d'avoir son propre générateur. En plus il est redistribuable, ce qui n'est pas toujours le cas pour les autres.

PS: Patrice, est-ce-que tu fournis quelque part le format de tes fichiers?
Patrice
CITATION(marc-chalain)
PS: Patrice, est-ce-que tu fournis quelque part le format de tes fichiers?

Si tu parles des fichiers générés par les sources fournis plus haut, la réponse est non, car tu peux formater le contenu à ta convenance. Les sources en question ne donnent que le code pour l'"enveloppe" pdb, le reste est au choix du développeur.

Si tu parles des fichiers accompagnant mes softs, la réponse est non, par défaut, pour de toutes autres raisons (que je n'ai pas à cacher mais qui s'éloignent du sujet : par MP ou dans un autre sujet, si cela t'intéresse).
Khertan
Salutation ...

Je suis en train d 'essayer de creer un editeur un peu particulier en java pour des besoins spécifique permettant de lire et ecrire nativement dans des pdb ... je connais la structure des pdb et le code java m'etonne un peu ... J essaye d ailleurs de le réutiliser sans résultat ... mais j'ai l'impression que quelques choses manques ... l entete ne semble pas etre de la bonne taille.

Le code est toujours d'actualités ou la structure d'enveloppe de pdb à changé depuis 2002 ?

D'ailleurs a part ton code patrice je n'ai rien trouvé d'interessant sur la toile ...
olivier101
La structure de PDB n'a pas changé... elle est extensivement documentée dans la doc développeur de palm source...
Patrice
Le code que j'ai posté ici a été testé et vérifié, je doute qu'il y ait une erreur. Mais la structure créée ne comprend pas toutes les zones "optionnelles" (app info block et sort info block, en particulier).
Khertan
Bon en fait j'ai callé mon erreur ... sleep.gif C'est mon implementation qui déconnait puisque enregistrement en secret ...

Me reste a faire l'inverse la lecture sourire.gif Ca va pas etre trop dur ...

En fait c'est plus par faignantise puisque je connais la structure ayant fait un plug in pour 4D pour lire et ecrire des pdb.

Merci
aldweb
Salut Khertan,

Tu as déjà un bel exemple "pascalien" de traitement des fichiers DOC dans ton Palm, dans le code source de PIAF lui-même :grin:

Il y a aussi un autre exemple en Pascal, sur le site de l'auteur de Fozzy (l'IDE pour PP sur PC windowsien) ici : http://palmpascal.free.fr/outils.htm

@+
aldweb
Khertan
Enfin oui je connais le format puisque l'ai déjà utilisé ... puisque j'ai déja creer dans 4D des exports de doc au format palm ...

Mais c'etait surtout pour ne pas réinventer la roue si cela existait déja en java ... mais j'ai mis plus de temps à chercher sur le net qu'a le faire moi même sourire.gif

Me reste au minimum a mettre la coloration syntaxique avant de mettre distribuer une première preview.

ps : ca à l'air sympa ces nouvelles commandes dans iziBasic v6 ... sourire.gif Je suis impatient d'avoir la béta dans les mains.

pps : et merci pour les liens ca peut toujours servir.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.