## Accès au code source

L'archive distribuée contient l'exécutable et le code source. Ce dernier 
est également accessible via le SGV git :
```sh
git clone git://git.tuxfamily.org/gitroot/dbconcept/dbconcept.git
```



## Intégration

DBConcept est conçu pour être intégré dans d'autres projets. Il est développé 
en [langage Haxe](https://haxe.org/) et supporte ainsi de nombreuses [plateformes d'exécution](https://haxe.org/documentation/introduction/compiler-targets.html). 
De plus, la [bibliothèque Javascript - en ligne](https://dbconcept.tuxfamily.org/online/dbconcept.js) 
peut être intégrée dans une page web (sa taille est inférieure à 150 kio).

DBConcept expose une API dont les principales fonctions sont :

- Analyse du code source et génération du diagramme :  
`source.Mocodo.load(texteSource : String) : Diagram`
- Génération du modèle logique de données :  
`transform.DiagramToMLD.transform(dia : Diagram) : MLD`
- Initialisation des attributs de navigation, des constructeurs et des accesseurs 
des classes du diagramme :  
`transform.DiagramToUML.transform(dia : Diagram)`  
*Cette étape est un prérequis pour le tracé des schémas UML et la génération 
de code (cf concepts de la programmation orientée objets).*

Les fonctions de génération des schémas sont les suivantes :

- Un objet de la classe `MLD` dispose de la méthode `toString(auFormatUniv : Bool)` 
qui renvoie le modèle relationnel au format Éducation Nationale ou Universitaire.	
- `schema.MCDToSVG.generateSVG(dia : Diagram) : Xml`  
*L'objet de la classe `Xml` obtenu (de type SVG) dispose de la méthode `toString()`.*
- `schema.MLDToSVG.generateSVG(mld : MLD, avecTypes : Bool) : Xml`
- `schema.UMLToSVG.generateSVG(dia : Diagram, deClasse : Bool, voirPrive : Bool) : Xml`  
*Un diagramme de domaine est obtenu avec `deClasse=false` et `voirPrive=true`.*

Les fonctions de génération de code SQL sont :

- `database.DBMariaDB.generateSQL(mld : MLD) : String`
- `database.DBPostgreSQL.generateSQL(mld : MLD) : String`
- `database.DBSqlite.generateSQL(mld : MLD) : String`

Les fonctions de génération de code (divers langages de programmation) sont : 

- `code.HaxeCode.generate(diagram : Diagram) : StringMap<String>`  
*L'objet retourné a une propriété `h` qui est un tableau associatif / dictionnaire, 
dont les clés sont les noms de fichiers et les valeurs leurs contenus.*
- `code.JavaCode.generate(diagram : Diagram) : StringMap<String>`
- `code.PhpCode.generate(diagram : Diagram) : StringMap<String>`
- `code.PythonCode.generate(diagram : Diagram) : StringMap<String>`



## Informations techniques

### Prérequis pour la compilation

L'application web (DBConcept Online), distincte de DBConcept est développée 
en HTML, CSS et Javascript, sans utilisation de cadriciel.


Le SDK Haxe, version 4.1 au minimum est requis pour compiler DBConcept, quelle
que soit la cible.

- C++ :

	- bibliothèque additionnelle Haxe "hxcpp" : `haxelib install hxcpp`
	- sous Linux : compilateur GCC, sous Windows : compilateur MSVC

- [HashLink](https://hashlink.haxe.org/)/C :

	- bibliothèque additionnelle Haxe "hashlink" : `haxelib install hashlink`
	- sous Linux : compilateur GCC, sous Windows : compilateur MSVC
	- machine virtuelle HashLink

- Java :

	- bibliothèque additionnelle Haxe "hxjava" : `haxelib install hxjava`
	- [OpenJDK](https://openjdk.java.net/)

- [Neko](https://nekovm.org/) : /  
*Note : Neko ne supporte pas la nouvelle API `UnicodeString`.*
- Node.js : bibliothèque additionnelle Haxe "hxnodejs" : `haxelib install hxnodejs`  
*Note : L'API d'accès aux bases de données diffère de celle de la bibliothèque 
standard (non implémentée en Node.js). Les fonctionnalités de génération et 
de rétroconception de bases de données sont donc désactivées.*
- PHP : /
- Python : /  
*Note : L'API d'accès aux bases de données n'est pas implémentée dans la bibliothèque 
standard pour le Python. Les fonctionnalités de génération et de rétroconception 
de bases de données sont donc désactivées.*
- Web / Javascript : /


### Prérequis pour le contrôle de la qualité

- Tests unitaires : bibliothèque additionnelle Haxe "utest" : `haxelib install utest`
- Qualité du code : bibliothèque additionnelle Haxe "checkstyle" : `haxelib install checkstyle`


### Construction et installation

La construction et l'installation utilise un fichier Makefile ;
```sh
make / make cpp	- construit l'exécutable out/cpp/dbconcept

make all	- compile le programme pour toutes les plateformes
make java	- construit l'archive out/java/dbconcept.jar
make neko	- génère out/neko/dbconcept
make web	- génère out/web/*

make install	- installe l'exécutable out/cpp/dbconcept (les paramètres "DESTDIR" et "PREFIX" sont supportés)
make uninstall

make clean	- efface les fichiers *générés*
make test	- lance les tests unitaires
make checkstyle	- vérifie la qualité du code
```

Il reste possible de construire le programme sans utiliser le fichier Makefile,
par exemple en Java, avec la commande :
```sh
haxe -cp src -main DBConcept -java-lib java-lib/*.jar -java out/java
```

*Les cibles HashLink/C, Node.js et Python sont pour le moment désactivées 
en raison d'incompatibilités dans le support des bases de données.* 


### Prérequis pour l'exécution

- C++ : /
- HashLink/C : machine virtuelle HashLink
- Java : JRE + pilote(s) JDBC
- Neko : machine virtuelle Neko
- Node.js : interptéteur Node.js
- PHP : interpréteur PHP
- Python : interpréteur Python
- Web / Javascript : navigateur web (Chromium, Firefox, ...)



## Organisation des fichiers
- Le code source du programme est dans le dossier `src` :

	- Le fichier `DBConcept.hx` est le point d'entrée du programme en ligne 
	de commande.
	- Le sous-dossier (paquetage) `model` contient les classes métier :
	
		- communes : `Obj` et `Field` ;
		- modèle relationnel : `MLD`, `Relation`, `ForeignKey` et `MergedFK` ;
		- MCD et UML : `Diagram`, `Set` (entité et classe), `Association`, 
		`Link` (patte d'association), `Method`; 
	
	- Le sous-dossier `source` contient la classe utilitaire `Mocodo` d'import-export 
	de description textuelle.
	- Le sous-dossier `schema` contient les classes utilitaires permettant 
	de générer les diagrammes SVG ; les classes `Svg` et `Line` sont communes.
	- Le sous-dossier `database` contient les classes utilitaires pour la 
	génération (ou la rétroconception) de bases de données.
	- Le sous-dossier `code` contient les classes utilitaires pour la 
	génération de code.
	- Le sous-dossier `graph` contient les classes (et adaptateurs) pour 
	le positionnement automatique des objets d'un graphe.

- Le dossier `web` contient l'interface web de l'application en ligne.
- Le dossier `web-lib` contient les bibliothèques additionnelles pour l'application web :
	
	- [icônes](https://github.com/stephenhutchings/microns),
	
- Le dossier `tests` contient les classes utiles aux tests unitaires ; ils 
sont écrits en utilisant la bibliothèque [UTest](https://github.com/fponticelli/utest).
- Le fichier `Makefile` contient les recettes (construction, tests, ...), 
`sitegen.json` la configuration pour la génération du site web, `checkstyle.json` 
le paramétrage pour le contrôle de qualité du code et `build.hxml` le paramétrage 
de Visual Studio Code.
- Le dossier `doc` contient la documentation (utilisateur, développeurs, journal
des changements, licence et exemples).
- Le dossier `java-lib` contient les connecteurs JDBC (bibliothèques externes).
