OIDs numériques (framework)

De Wiki1000
(Différences entre les versions)
(Revue de code métier)
Ligne 32 : Ligne 32 :
 
  vQuery := QueryBroker(''{URL},'Test','WFClasseA');
 
  vQuery := QueryBroker(''{URL},'Test','WFClasseA');
 
  vQuery.Sql.Add('SELECT oid FROM '+ClassManager.FindClassTableName('WFClasseA'));
 
  vQuery.Sql.Add('SELECT oid FROM '+ClassManager.FindClassTableName('WFClasseA'));
  vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutOID(aOID)])); //!! Import use dbOutOID() to encode oid
+
  vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutOID(aOID)])); //!! Important use dbOutOID() to encode oid
 
  //
 
  //
 
  ctn := 0;  
 
  ctn := 0;  

Version du 1 mars 2019 à 10:46

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-20px.png 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

Exemples :

//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;
Outils personnels