//+------------------------------------------------------------------+
//| Fonction de démarrage du script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- ouvre la boîte de dialogue de sélection des fichiers avec l'extension DAT
string selected_files[];
if(!FileSelectDialog("Sélectionner les fichiers à télécharger", NULL,
"Fichiers Data (*.dat)|*.dat|Tous les fichiers (*.*)|*.*",
FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
{
Print("Aucun fichier sélectionné. Sortie");
return;
}
//--- récupère la taille de tous les fichiers
ulong filesize[];
int filehandle[];
int files=ArraySize(selected_files);
ArrayResize(filesize, files);
ZeroMemory(filesize);
ArrayResize(filehandle, files);
double total_size=0;
for(int i=0; i<files; i++)
{
filehandle[i]=FileOpen(selected_files[i], FILE_READ|FILE_BIN);
if(filehandle[i]!=INVALID_HANDLE)
{
filesize[i]=FileSize(filehandle[i]);
//PrintFormat("%d, %s handle=%d %d bytes", i, selected_files[i], filehandle[i], filesize[i]);
total_size+=(double)filesize[i];
}
}
//--- vérifie la taille globale des fichiers
if(total_size==0)
{
PrintFormat("La taille totale des fichiers est 0. Sortie");
return;
}
//--- crée ou ouvre la base de données dans le dossier commun du terminal
string filename="dat_files.sqlite";
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
if(db==INVALID_HANDLE)
{
Print("DB: échec de l'ouverture de ", filename, avec le code ", GetLastError());
return;
}
else
Print("Base de données :", filename, " ouvert avec succès");
//--- si la table FILES existe, la supprime
if(DatabaseTableExists(db, "FILES"))
{
//--- supprime la table
if(!DatabaseExecute(db, "DROP TABLE FILES"))
{
Print("Impossible de supprimer la table FILES avec le code ", GetLastError());
DatabaseClose(db);
return;
}
}
//--- crée la table FILES
if(!DatabaseExecute(db, "CREATE TABLE FILES("
"NAME TEXT NOT NULL,"
"SIZE INT NOT NULL,"
"PERCENT_SIZE REAL NOT NULL,"
"DATA BLOB NOT NULL);"))
{
Print("DB: impossible de créer la table FILES avec le code", GetLastError());
DatabaseClose(db);
return;
}
//--- affiche la liste de tous les champs de la table FILES
if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
{
PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") a échoué, code d'erreur=%d à la ligne %d ", GetLastError(), __LINE__);
DatabaseClose(db);
return;
}
//--- créer une requête paramétrée pour ajouter des fichiers dans la table FILES
string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
" VALUES (?1,?2,?3,?4);"; // paramètres de la requête
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
{
PrintFormat("DatabasePrepare() a échoué avec le code=%d", GetLastError());
Print("Requête SQL : ", sql);
DatabaseClose(db);
return;
}
//--- parcourt tous les fichiers et les ajoute à la table FILES
bool request_error=false;
DatabaseTransactionBegin(db);
int count=0;
uint size;
for(int i=0; i<files; i++)
{
if(filehandle[i]!=INVALID_HANDLE)
{
char data[];
size=FileReadArray(filehandle[i], data);
if(size==0)
{
PrintFormat("FileReadArray(%s) a échoué avec le code %d", selected_files[i], GetLastError());
continue;
}
count++;
//--- définit les valeurs des paramètres avant d'ajouter le fichier à la table
if(!DatabaseBind(request, 0, selected_files[i]))
{
PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
if(!DatabaseBind(request, 1, size))
{
PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
if(!DatabaseBind(request, 2, double(size)*100./total_size))
{
PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
if(!DatabaseBindArray(request, 3, data))
{
PrintFormat("DatabaseBind() a échoué à la ligne %d avec le code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
//--- exécute une requête d'insertion de l'entrée et recherche l'erreur
if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
{
PrintFormat("DatabaseRead() a échoué avec le code=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
else
PrintFormat("%d. %s: %d bytes", count, selected_files[i],size);
//--- réinitialise la requpete avant la prochaine mise à jour des paramètres
if(!DatabaseReset(request))
{
PrintFormat("DatabaseReset() a échoué avec le code=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
}
}
//--- statuts des transactions
if(request_error)
{
PrintFormat("Table FILES : échec de l'ajout de %d fichiers", count);
DatabaseTransactionRollback(db);
DatabaseClose(db);
return;
}
else
{
DatabaseTransactionCommit(db);
PrintFormat("Table FILES : %d fichiers ajoutés", count);
}
//--- ferme le fichier de base de données et information
DatabaseClose(db);
PrintFormat("Base de données : %s créée et fermée", filename);
}
|