Передача файла Sqlite DB с использованием функций libcurl, но не удается сразу открыть файл db для отправки данных в базу данных - PullRequest
1 голос
/ 11 марта 2020

Я запускаю приложение C ++, которое обменивается данными с машиной на основе PL C.

PL C машина создает файл .db (SQLITE) после обработки деталей машиной.

Я написал функцию для переноса базы данных sqlite с PL C на P C с помощью функций libcurl.

После завершения передачи мне нужно l oop через файл db и перенести данные в таблицу базы данных сети компании.

У меня проблема с циклическим просмотром файла после завершения передачи.

Файл при чтении вызывает исключение "(11) SQLITE_CORRUPT "-" Образ диска искажен ".

Но как только я закрываю свое приложение c ++ и снова открываю, последний файл sqlite db может открываться и через l oop.

Я прилагаю код ниже, дайте мне знать, если есть способ сделать файл db доступным для чтения после передачи через библиотеку libcurl. Если я буду использовать некоторые дополнительные команды, чтобы сделать его доступным.

Информация о ftp-сервере.

char dbfile[128];
char ofile[512];

//Pulling all the information about the ftp server information from parsed.xml -> Request/DataBlock/LogFile/Host, Path, File

char *host = tagTextValue(doc, "REQUEST.DATABLOCK.LOGFILE.HOST");// -- 172.16.1.100
if (host) 
{
    if (char *path = tagTextValue(doc, "REQUEST.DATABLOCK.LOGFILE.PATH")) // -- /pub/export/mdt
    {
        if (char *file= tagTextValue(doc, "REQUEST.DATABLOCK.LOGFILE.FILE"))// --  20200226_004636_90180.db
        {
            sprintf_s( dbfile, sizeof(dbfile), "ftp://%s/%s/%s", host, path, file );//Host Address  
            sprintf_s(ofile, sizeof(ofile), "c:\\xxxxx\\xxxxx\\%s", file);//Destination Address
        }
    }
}

///////////Start of FTP///////////////////
struct FtpFile 
{
  const char *filename;
  FILE *stream;
};

FtpFile ftp = 
{
    ofile, /* name to store the file as if successful */ 
    NULL
};



CURL *url = curl_easy_init();
curl_easy_setopt(url,  CURLOPT_URL, dbfile);// dbfile has the complete path where to pull the file from.

FILE *ffp = fopen(ofile, "w"); // ofile mentions the destination on the receiving end

curl_easy_setopt(url, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt(url, CURLOPT_WRITEDATA, &ftp);
curl_easy_setopt(url, CURLOPT_USERPWD, "ftpuser:xxxx");// Passing the login details to FTP server to pull the information from the 'server/machine'

CURLcode  res = curl_easy_perform(url);

fclose(ffp);
curl_easy_cleanup(url);

////////////////End of FTP/////////////////////////

sqlite3 *db;

sqlite3_stmt *stmt;

char sql[1024];

Sleep(20000);

WireBondDataUploadType      rec = rec2;         
const char* sql1 = "select xxxxxxxxxx";
bool storeSuccessful = false;

const char *ofile2 = "c:\\xxxxx\\xxxxxxx\\20200310_021605_20039.db";
int rc;
rc = sqlite3_open(ofile, &db);  //ST Opening a new Database connection

if (rc == SQLITE_OK)
{
    rc=sqlite3_prepare(db, sql1, -1, &stmt, NULL);
    if(rc != 0)
    {
        sqlite3_close(db);
    } 
    else if(rc == SQLITE_OK) 
    {
      //Process the information by reading the db file.
      xxxxxxxx
      xxxxxxxx
    }
}

1 Ответ

0 голосов
/ 24 марта 2020

Решением проблемы было то, что мы забыли закрыть «открытый» ftp-файл (ofile) в вышеупомянутом коде.

Ссылочная ссылка - [https://curl.haxx.se/libcurl/c/ftpget.html] [1]

...