Bonjour, Mieux vaut tard que jamais... 2 correctifs de fonctions dans lySQLiteFields : Code pascal : S�lectionner tout - Visualiser dans une fen�tre � part 123456789function TlySQLiteTable.getSubsetFieldByIndex(aCol, aIndex: integer): TlyField; begin if (aCol<0) or (aCol>FColCount-1) or (aIndex<0) or (aIndex>SubsetCount-1) then Result:=nil // correction du 18/04/2024 // else Result:=TlyField(FFields[Subset[aIndex]]); else Result:=TlyField(FFields[Subset[aIndex]*FColCount+aCol]); // fin correction end; Code pascal : S�lectionner tout - Visualiser dans une fen�tre � part 1234567891011121314151617181920212223242526function TlySQLiteTable.Locate(aValue: string; aCol: integer): Boolean; var i, l, index: integer; begin // FSubsetIndex:=-1; // comme ça, Next place sur First ! // toute nouvelle recherche efface et reconstitue l'ensemble résultat SetLength(Subset, 0); if (aCol<0) or (aCol>FColCount-1) then Result:=False else begin for i:=0 to FRowCount-1 do begin index:=i*FColCount+aCol; if TlyField(FFields[index]).AsText=aValue then begin l:=Length(Subset); SetLength(Subset, l+1); // correction du 18/04/2024 // Subset[l]:=index; Subset[l]:=i; // fin correction end; end; Result := (Length(Subset) > 0); end; end;
function TlySQLiteTable.getSubsetFieldByIndex(aCol, aIndex: integer): TlyField; begin if (aCol<0) or (aCol>FColCount-1) or (aIndex<0) or (aIndex>SubsetCount-1) then Result:=nil // correction du 18/04/2024 // else Result:=TlyField(FFields[Subset[aIndex]]); else Result:=TlyField(FFields[Subset[aIndex]*FColCount+aCol]); // fin correction end;
function TlySQLiteTable.Locate(aValue: string; aCol: integer): Boolean; var i, l, index: integer; begin // FSubsetIndex:=-1; // comme ça, Next place sur First ! // toute nouvelle recherche efface et reconstitue l'ensemble résultat SetLength(Subset, 0); if (aCol<0) or (aCol>FColCount-1) then Result:=False else begin for i:=0 to FRowCount-1 do begin index:=i*FColCount+aCol; if TlyField(FFields[index]).AsText=aValue then begin l:=Length(Subset); SetLength(Subset, l+1); // correction du 18/04/2024 // Subset[l]:=index; Subset[l]:=i; // fin correction end; end; Result := (Length(Subset) > 0); end; end;
Cette interface de s�rialisation est beaucoup plus r�cente (apparue avec la version 3.23, le 02/04/2018) que les fonctions que j'ai utilis�es. Qui plus est, je ne suis pas s�r d'avoir pens� en les d�couvrant qu'on puisse les utiliser dans cette optique ! Il me semble qu'avec cette solution se poserait le probl�me de coh�rence des donn�es en cas de bug avant r��criture chiffr�e, si j'ai bien compris la philosophie d'utilisation, avec risque de perte de donn�es ajout�es ou modifi�es pendant la session.
Bravo et merci de partager cet excellent article ! Il tombe � point nomm� alors que je me penchais sur cette probl�matique. J'envisage 2 solutions : - la v�tre - l'utilisation des fonctions sqlite3_serialize et sqlite3_deserialize Sauf erreur de ma part, vous ne mentionnez pas les fonctions sqlite3_serialize et sqlite3_deserialize. La fonction sqlite3_serialize permet d'obtenir un pointeur vers une zone m�moire contenant la base de donn�es. Il est donc possible de chiffrer cette zone vers un fichier sur le disque. La fonction sqlite3_deserialize permet de charger une base de donn�es � partir d'une zone m�moire dont le contenu peut �tre le r�sultat du d�chiffrement d'un fichier sur le disque. C'est une autre mani�re de faire et pour laquelle je n'ai pas suffisamment de recul (notamment par rapport � la taille de la base de donn�es). Avez-vous envisag� cette derni�re solution ? Et si oui, pourquoi ne pas l'avoir retenue ? Merci beaucoup
trop top ce tuto
Article int�ressant, le chiffrement c'est bien ! Cependant, petite incoh�rence sur les termes employ�s : on dit chiffrer/chiffrement et non crypter/cryptage. D'un point de vue cryptographique, crypter n'a pas de sens : �a voudrait dire qu'on chiffre une donn�e sans savoir comment ni avec quelle cl�. Et sans pouvoir la d�chiffrer du coup puisqu'on ne sait pas comment elle a �t� chiffr�... Plus d'infos l� : https://chiffrer.info/
C'est un reliquat de Delphi 5, en effet... Le tutoriel Impl�mentation d'un singleton fait un tour de la question plus actuel. Merci.
La variable [c]UneSeuleInstance[/c] devrait �tre une variable de classe. Mais c'est peut �tre que ce n'est pas support� par les anciennes versions de Delphi.
Envoy� par SergioMaster Par contre je trouve que c'est la porte ouverte � de l'injection SQL. Merci, Serge. Ta remarque est tr�s int�ressante sur la faiblesse par rapport � l'injection SQL. Je ressors des vieux trucs du placard, et le format blog me plaisait pour avoir justement ces retours sur des bugs ou �volutions/suggestions. Pourquoi, au bout du compte, ne pas retravailler l'ensemble en fonction des remarques, et en faire une synth�se sous une forme un peu diff�rente ? L'avenir le dira...
Salut, Envoy� par SergioMaster le billet un peu long, pourquoi ne pas en avoir fait un tutoriel ? Tout y est. Il a cependant �t� publi� sur les diff�rents portails concern�s comme tutoriel pour une meilleure visibilit�. Excellent tutoriel Merci encore
Bonjour, le billet un peu long, pourquoi ne pas en avoir fait un tutoriel ? Tout y est. Par contre je trouve que c'est la porte ouverte � de l'injection SQL. En tout cas on y retrouve presque tout ce qu'offre les fonctionnalit�s de Firedac (param�tres, macros) et �a c'est :cool: