« OIDs numériques (framework) » : différence entre les versions

De Wiki1000
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
{{version810}}
{{version900}}


Une base en OIDs numériques stocke les OID en entier 64 bits au lieu de les stocker en chaîne de caractères.
Une base en OIDs numériques stocke les OID en entier 64 bits au lieu de les stocker en chaîne de caractères.

Version du 2 avril 2019 à 08:55

{{#images:version900-32x32.png|stock}}

Une base en OIDs numériques stocke les OID en entier 64 bits au lieu de les stocker en chaîne de caractères.

Les avantages sont :

  • Gain de taille, la taille d'un oid numérique est de 8 octets alors que la taille d'un oid caractère est de 32 octets
  • Gain de performance, le serveur SQL est plus performant dans la manipulation d'entier.
  • Gain réseau, le volume de données échangé est réduit.
Tip : Seul le stockage est différent, le framework et le code métier utilisent toujours des OIDs au format caractère en interne

Revue de code métier

Les éléments suivants doivent être revue pour s'assurer que le code métier est correctement implémenté :

  • Queries brokers
  • Curseurs utilisant une construction SQL

Les points à vérifier sont :

  • Utilisation de dbOutOID() pour encoder les OIDs dans les requêtes

Support de l'encodage d'OID par translateur :

Fonction Supporte l'encodage d'OID Remarque
dboutOID() Oui
dbOutStr() Non
dbOutVariant() Non
dbOutWhereString('oidXXX','=',' ') Oui oidXXX is NULL
dbOutWhereString('oidXXX','<>',' ') Oui oidXXX is NOT NULL
dbOutWhereString('oidXXX','=',aOID) Oui
dbOutWhereString('oidXXX','=',dbOutStr(aOID)) non
dbOutWhereVariant('oidXXX','=',aOID) oui


Exemples :

<source lang=delphi> //Procedure TestQueryBroker; var vQuery:TQuery; aOID,xOID:TOID; inst:WFClasseA; ctn:Integer; begin

//find first instance 
inst := WFClasseA.Find(,,True,[]); 
if not Assigned(inst) then Exit;
aOID := inst.OID; 
vQuery := QueryBroker({URL},'Test','WFClasseA');
vQuery.Sql.Add('SELECT oid FROM '+ClassManager.FindClassTableName('WFClasseA'));
vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutOID(aOID)])); //!! Important use dbOutOID() to encode oid
//
ctn := 0; 
vQuery.Open;
vQuery.First;
while not vQuery.Eof do
 begin
   ctn  := ctn+1;
   xOID := vQuery.Fields[0].AsVariant; // OK, Fields[] return the OID in char format
   vQuery.Next;
 end;
vQuery.Close;
//
if (ctn=1) and (aOID=xOID) 
 then showMessage('success')
 else showMessage(Format('failed :%d, %s / %s',[ctn,aoid,xoid])); 

end; </source>

<source lang="delphi"> begin

 // OK

 // Equality test
 aOID := inst.OID;
 vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutOID(aOID)]));
 // Null test
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereString('oid','=','NULL')]));
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereString('oid','<>','NULL')]));
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereString('oid','=',)]));
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereString('oid','<>',)]));
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereString('oid','=',aOID)]));
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereNull('oid')]));
 vQuery.SQL.Add(Format('AND %s',[vQuery.translator.dbOutWhereNotNull('oid')]));
 // In test
 aWhereIn := '('+aOID+)';
 vQuery.SQL.Add(Format('WHERE oid in %s',[vQuery.translator.dbOutOID(aWhereIn)]);

end; </source>

<source lang="delphi"> begin

 // NOT OK

 // Equality test
 aOID := inst.OID;
 vQuery.SQL.Add(Format('WHERE oid=%s',[aOID]));
 vQuery.SQL.Add(Format('WHERE oid=+aOID+,[]));
 vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutStr(aOID)]));
 vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutVariant(aOID)]));


 // In test
 aWhereIn := '('+aOID+)';
 vQuery.SQL.Add(Format('WHERE oid in %s',[aWhereIn]);

end; </source>

Tip : Il est recommandé de ne pas utiliser de Query broker ni de curseur avec du code SQL. En général, ceux-ci peuvent être remplacés par des sélecteurs ou des vues locales.

Voir aussi: