ORDA : Attribution d’un chemin à un attribut blob ou image

Les commandes de base de données non-ORDA vous permettaient de placer des images et des blobs en dehors du fichier de données grâce à la commande SET EXTERNAL DATA PATH. Cette commande n’est pas adaptée à ORDA et c’est pourquoi nous avons décidé d’ajouter une fonctionnalité similaire dans la v20 R3 : La possibilité d’assigner à un attribut de type blob ou image un chemin sur le disque. Laissez-moi vous en dire plus à ce sujet.

HDI Path for picture

 

Tout d’abord, regardons ce bout de code :

$myRecord:=ds.MyTable.new()
$myRecord.image:="C:/FolderWithMyFiles/myImage"
$myRecord.binary:="C:/FolderWithMyFiles/myBinary"
$myRecord.save()

Les attributs image et binary sont respectivement un attribut image et un attribut blob. En leur attribuant un chemin au lieu d’une image ou d’un blob, 4D ne placera dans le fichier de données que le chemin fourni. Ce n’est que lorsque vous utiliserez l’image ou le blob que 4D chargera le fichier depuis le disque et créera une variable image ou blob appropriée. Pour vous, ce sera complètement transparent.

Avantages et précautions

Cette façon de faire présente quelques avantages :
– Vous ne stockez pas de fichiers binaires dans votre fichier de données. Par conséquent, votre fichier de données reste petit et rapide à maintenir.
– Vous pouvez utiliser le même fichier pour plusieurs enregistrements sans dupliquer le contenu du fichier.
– Vous pouvez organiser les fichiers comme vous le souhaitez et même les utiliser avec des logiciels autres que 4D.

Mais il y a aussi quelques précautions à prendre :
– Comme 4D a besoin du fichier sur le disque, vous devez vous assurer qu’il reste accessible chaque fois que 4D y accède.
– Lorsque vous attribuez un chemin à une image ou à un blob, vous contournez la propriété du champ « Stockage » dans la structure de la base de données (la propriété « Stockage » vous permet de choisir où stocker le contenu de l’image ou du blob entre le fichier de données ou un fichier de données externe).

Chemin POSIX ou 4D.File

Le premier morceau de code attribue un chemin POSIX à l’attribut (seuls les chemins POSIX sont acceptés). Une autre solution consiste à attribuer un fichier 4D.File comme dans cet exemple :

$file:=File("/PACKAGE/FolderWithMyFiles/myImage")
$myRecord:=ds.MyTable.new()
$myRecord.image:=$file
$myRecord.save()

Ce code attribue le chemin du fichier 4D.File à l’attribut.

Que se passe-t-il si vous modifiez le fichier sur le disque ?

Il s’agit là d’une question délicate. Comme 4D stocke le contenu des blobs et des images dans son cache, il se peut très bien qu’il ne se passe rien jusqu’à ce que vous fermiez et rouvriez votre application. Si vous voulez vraiment pouvoir modifier le fichier au moment de l’exécution, il y a une astuce que vous pouvez utiliser : Attribuez à nouveau le chemin à l’attribut. Comme 4D détectera une nouvelle valeur, il nettoiera son cache et vous obtiendrez le nouveau fichier la prochaine fois que vous utiliserez l’image ou le blob.
Remarque : si vous accédez à l’image ou au blob par l’intermédiaire d’un navigateur, par exemple avec Qodly ou l’explorateur de données, n’oubliez pas de vider également le cache du navigateur.

Utilisez le forum si vous avez des questions

Vous pouvez consulter la documentation pour apprendre à utiliser cette nouvelle fonctionnalité. Et si vous avez des questions ou des commentaires, n’hésitez pas à utiliser notre forum. Nous serons ravis de vous aider.

Nicolas Brachfogel
- Product Owner & Senior Developer - Nicolas Brachfogel a rejoint 4D en 2017 en tant que développeur senior (4D Server et networking) et en tant que Product Owner pour gérer la mise en production d'Apple Silicon. Il est chargé de rédiger les user stories et de les traduire en spécifications fonctionnelles, ainsi que de s'assurer que les implémentations des fonctionnalités répondent aux besoins des clients. Diplômé de l'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas a commencé sa carrière en tant que développeur de logiciels en 2001. Après plusieurs années de programmation en Java et C++, il s'est spécialisé dans le développement client-serveur pour des sociétés de jeux vidéo. En tant que développeur/architecte serveur, il a travaillé avec succès sur les architectures serveur de nombreux jeux (Dofus Arena, Drakerz, Trivial Pursuit Go !).