DatabaseReset

Reimposta una richiesta, come dopo aver chiamato DatabasePrepare().

int  DatabaseReset(
   int  request      // handle di richiesta ricevuto in DatabasePrepare
   );

Parametri

request

[in] L'handle della richiesta ottenuta in DatabasePrepare().

Valore di Ritorno

Restituisce true se ha esito positivo, altrimenti false. Per ottenere il codice di errore, utilizzare GetLastError(), le possibili risposte sono:

  • ERR_DATABASE_INVALID_HANDLE (5121) - handle database non valido;
  • Codici di errore SQLite che iniziano con ERR_DATABASE_ERROR (5601).

Nota

La funzione DatabaseReset() è destinata all'esecuzione multipla di una richiesta con valori di parametro diversi. Ad esempio, quando si aggiungono dati alla tabella in blocco utilizzando il comando INSERT, è necessario formare un set personalizzato di valori di campo per ogni voce.

A differenza di DatabasePrepare(), la chiamata DatabaseReset() non compila la stringa con i comandi SQL in una nuova richiesta, quindi DatabaseReset() viene eseguito molto più velocemente di DatabasePrepare().

DatabaseReset() viene utilizzato insieme alle funzioni DatabaseBind() e/o DatabaseBindArray() se i valori dei parametri di richiesta devono essere modificati dopo l'esecuzione DatabaseRead(). Ciò significa che prima di impostare nuovi valori dei parametri di richiesta (prima del blocco delle chiamate DatabaseBind/DatabaseBindArray), DatabaseReset() dovrebbe essere chiamato per resettarlo. La stessa richiesta parametrizzata deve essere creata utilizzando DatabasePrepare().

Proprio come DatabasePrepare(), DatabaseReset() non effettua una richiesta di database. Un'esecuzione della richiesta diretta viene eseguita durante la chiamata DatabaseRead() o DatabaseReadBind().

La chiamata DatabaseReset() non porta al ripristino dei valori dei parametri nella richiesta se sono stati impostati chiamando DatabaseBind()/DatabaseBindArray(), ovvero i parametri mantengono i loro valori. Pertanto, il valore di un solo parametro può essere modificato. Non è necessario impostare nuovamente tutti i parametri di richiesta dopo aver chiamato DatabaseReset().

Un handle di una richiesta rimosso utilizzando DatabaseFinalize() non può essere passato a DatabaseReset(). Ciò comporterà un errore.

Esempio:

//+------------------------------------------------------------------+
// | Funzione di avvio del programma Script                          |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- crea o apre un database
   string filename="symbols.sqlite";
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " apertura fallita con codice "GetLastError());
      return;
     }
   else
      Print("Database: ", filename, " aperto con successo");
//--- se esiste la tabella SIMBOLI, eliminarla
   if(DatabaseTableExists(db, "SYMBOLS"))
     {
      //--- elimina la tabella
      if(!DatabaseExecute(db, "DROP TABLE SYMBOLS"))
        {
         Print("Fallimento nell' eliminare la tabella SYMBOLS con codice "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- crea la tabella SIMBOLI
   if(!DatabaseExecute(db, "CREATE TABLE SYMBOLS("
                       "NAME           TEXT    NOT NULL,"
                       "DESCRIPTION    TEXT            ,"
                       "PATH           TEXT            ,"
                       "SPREAD         INT             ,"
                       "POINT          REAL    NOT NULL,"
                       "DIGITS         INT     NOT NULL,"
                       "JSON           BLOB );"))
     {
      Print("DB: ", filename, " creazione tabella fallita con codice "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- visualizza l'elenco di tutti i campi nella tabella SYMBOLS
   if(DatabasePrint(db, "PRAGMA TABLE_INFO(SYMBOLS)", 0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(SYMBOLS)\") fallito, codice errore=%d at line %d"GetLastError(), __LINE__);
      DatabaseClose(db);
      return;
     }
 
//--- crea una richiesta parametrizzata per aggiungere simboli alla tabella SYMBOLS
   string sql="INSERT INTO SYMBOLS (NAME,DESCRIPTION,PATH,SPREAD,POINT,DIGITS,JSON)"
              " VALUES (?1,?2,?3,?4,?5,?6,?7);"// request parameters
   int request=DatabasePrepare(db, sql);
   if(request==INVALID_HANDLE)
     {
      PrintFormat("DatabasePrepare() fallito con codice=%d"GetLastError());
      Print("SQL request: ", sql);
      DatabaseClose(db);
      return;
     }
 
//--- passa attraverso tutti i simboli e aggiungili alla tabella SYMBOLS
   int symbols=SymbolsTotal(false);
   bool request_error=false;
   DatabaseTransactionBegin(db);   
   for(int i=0; i<symbols; i++)
     {
      //--- imposta i valori dei parametri prima di aggiungere un simbolo
      ResetLastError();
      string symbol=SymbolName(i, false);
      if(!DatabaseBind(request, 0, symbol))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      //--- se la precedente chiamata DatabaseBind() ha avuto esito positivo, impostare il parametro successivo
      if(!DatabaseBind(request, 1, SymbolInfoString(symbolSYMBOL_DESCRIPTION)))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 2, SymbolInfoString(symbolSYMBOL_PATH)))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 3, SymbolInfoInteger(symbolSYMBOL_SPREAD)))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 4, SymbolInfoDouble(symbolSYMBOL_POINT)))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 5, SymbolInfoInteger(symbolSYMBOL_DIGITS)))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
      if(!DatabaseBind(request, 6, GetSymBolAsJson(symbol)))
        {
         PrintFormat("DatabaseBind() fallito alla riga %d con codice=%d"__LINE__GetLastError());
         request_error=true;
         break;
        }
 
      //--- esegue una richiesta di inserimento della voce e verifica la presenza di un errore
      if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
        {
         PrintFormat("DatabaseRead() fallito con codice=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
      else
         PrintFormat("%d: aggiunti %s", i+1, symbol);
      //--- resetta la richiesta prima del prossimo aggiornamento dei parametri
      if(!DatabaseReset(request))
        {
         PrintFormat("DatabaseReset() fallito con codice=%d"GetLastError());
         DatabaseFinalize(request);
         request_error=true;
         break;
        }
     } //--- fatto passando attraverso tutti i simboli
 
//--- stato delle transazioni
   if(request_error)
     {
      PrintFormat("Tabella SYMBOLS: fallimento nell'aggiungere %d simboli", symbols);
      DatabaseTransactionRollback(db);
      DatabaseClose(db);
      return;
     }
   else
     {
      DatabaseTransactionCommit(db);
      PrintFormat("Tabella SYMBOLS: aggiunti %d simboli",symbols);
     }
 
//--- salva la tabella SYMBOLS in un file CSV
   string csv_filename="symbols.csv";
   if(DatabaseExport(db, "SELECT * FROM SYMBOLS", csv_filename,
                     DATABASE_EXPORT_HEADER|DATABASE_EXPORT_INDEX|DATABASE_EXPORT_QUOTED_STRINGS";"))
      Print("Database: tabella SYMBOLS salvata in ", csv_filename);
   else
      Print("Database: DatabaseExport(\"SELECT * FROM SYMBOLS\") fallita con codice"GetLastError());
 
//--- chiude il file del database e informa di ciò
   DatabaseClose(db);
   PrintFormat("Database: %s creato e chiuso", filename);
  }
//+------------------------------------------------------------------+
//| Restituisce una specifica di simbolo come JSON                   |
//+------------------------------------------------------------------+
string GetSymBolAsJson(string symbol)
  {
//--- indentazioni
   string indent1=Indent(1);
   string indent2=Indent(2);
   string indent3=Indent(3);
//---
   int digits=(int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   string json="{"+
               "\n"+indent1+"\"ConfigSymbols\":["+
               "\n"+indent2+"{"+
               "\n"+indent3+"\"Symbol\":\""+symbol+"\","+
               "\n"+indent3+"\"Path\":\""+SymbolInfoString(symbolSYMBOL_PATH)+"\","+
               "\n"+indent3+"\"CurrencyBase\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_BASE)+"\","+
               "\n"+indent3+"\"CurrencyProfit\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_PROFIT)+"\","+
               "\n"+indent3+"\"CurrencyMargin\":\""+SymbolInfoString(symbolSYMBOL_CURRENCY_MARGIN)+"\","+
               "\n"+indent3+"\"ColorBackground\":\""+ColorToString((color)SymbolInfoInteger(symbolSYMBOL_BACKGROUND_COLOR))+"\","+
               "\n"+indent3+"\"Digits\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_DIGITS))+"\","+
               "\n"+indent3+"\"Point\":\""+DoubleToString(SymbolInfoDouble(symbolSYMBOL_POINT), digits)+"\","+
               "\n"+indent3+"\"TickBookDepth\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TICKS_BOOKDEPTH))+"\","+
               "\n"+indent3+"\"ChartMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_CHART_MODE))+"\","+
               "\n"+indent3+"\"TradeMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_EXEMODE))+"\","+
               "\n"+indent3+"\"TradeCalcMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_CALC_MODE))+"\","+
               "\n"+indent3+"\"OrderMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_ORDER_MODE))+"\","+
               "\n"+indent3+"\"CalculationMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_CALC_MODE))+"\","+
               "\n"+indent3+"\"ExecutionMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_EXEMODE))+"\","+
               "\n"+indent3+"\"ExpirationMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_EXPIRATION_MODE))+"\","+
               "\n"+indent3+"\"FillFlags\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_FILLING_MODE))+"\","+
               "\n"+indent3+"\"ExpirFlags\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_EXPIRATION_MODE))+"\","+
               "\n"+indent3+"\"Spread\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SPREAD))+"\","+
               "\n"+indent3+"\"TickValue\":\""+StringFormat("%G", (SymbolInfoDouble(symbolSYMBOL_TRADE_TICK_VALUE)))+"\","+
               "\n"+indent3+"\"TickSize\":\""+StringFormat("%G", (SymbolInfoDouble(symbolSYMBOL_TRADE_TICK_SIZE)))+"\","+
               "\n"+indent3+"\"ContractSize\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_TRADE_CONTRACT_SIZE)))+"\","+
               "\n"+indent3+"\"StopsLevel\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_TRADE_STOPS_LEVEL))+"\","+
               "\n"+indent3+"\"VolumeMin\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_MIN)))+"\","+
               "\n"+indent3+"\"VolumeMax\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_MAX)))+"\","+
               "\n"+indent3+"\"VolumeStep\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_STEP)))+"\","+
               "\n"+indent3+"\"VolumeLimit\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_VOLUME_STEP)))+"\","+
               "\n"+indent3+"\"SwapMode\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SWAP_MODE))+"\","+
               "\n"+indent3+"\"SwapLong\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_SWAP_LONG)))+"\","+
               "\n"+indent3+"\"SwapShort\":\""+StringFormat("%G",(SymbolInfoDouble(symbolSYMBOL_SWAP_SHORT)))+"\","+
               "\n"+indent3+"\"Swap3Day\":\""+IntegerToString(SymbolInfoInteger(symbolSYMBOL_SWAP_ROLLOVER3DAYS))+"\""+
               "\n"+indent2+"}"+
               "\n"+indent1+"]"+
               "\n}";
   return(json);
  }
//+------------------------------------------------------------------+
//| Forma un rientro fatto di spazi                                  |
//+------------------------------------------------------------------+
string Indent(const int number, const int characters=3)
  {
   int length=number*characters;
   string indent=NULL;
   StringInit(indent, length, ' ');
   return indent;
  }
/*
 Risultato:
 Database: symbols.sqlite aperto correttamente
  #| cid name        type notnull dflt_value pk
  -+-------------------------------------------
  1|   0 NAME        TEXT       1             0 
  2|   1 DESCRIPTION TEXT       0             0 
  3|   2 PATH        TEXT       0             0 
  4|   3 SPREAD      INT        0             0 
  5|   4 POINT       REAL       1             0 
  6|   5 DIGITS      INT        1             0 
  7|   6 JSON        BLOB       0             0 
  1: added EURUSD
  2: added GBPUSD
  3: added USDCHF
  ...
  82: added USDCOP
  83: added USDARS
  84: added USDCLP
  Table SYMBOLS: added 84 symbols
  Database: table SYMBOLS saved in symbols.csv
  Database: symbols.sqlite created and closed
*/
 

Vedi anche

DatabasePrepare, DatabaseBind, DatabaseBindArray, DatabaseFinalize