OIDs numériques (framework)
De Wiki1000
Version du 2 avril 2019 à 09:55 par Syfre (discuter | contributions)
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 :
//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;
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;
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;
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: