Hi all,
I would like to use SQLite3 and MPI to generate many databases, and different processes produce and process different databases. But when I ran the program in Linux, I got an error message from sqlite3_exec() that ?database is locked?. I know this message means I tried to do incompatible things with a database at the same time from the same database connection. Obviously, I did not do incompatible things with a database at the same time. I have Googled this error message, but none of these web pages is about SQLite3 and MPI. The version of SQLite3 is 3.11.0. I am new to sqlite, and any help and information will be greatly appreciated! Thank you in advance! Here is my simple code which can reproduce this error: #include <mpi.h> #include <iostream> #include "sqlite3.h" #include <fstream> #include <sstream> using namespace std; int testFunc(int firstBreakPt, int secondBreakPt, char* saveFile); int main(int argc, char* argv[]) { MPI_Init(&argc,&argv); char *saveFile = "test"; int breakPt[2][2]={{300,500},{600,900}}; int myid, numprocs, taskNum = 2; int paraSent[2]; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); if (myid == 0) // master; { // sending parameters to slaves; MPI_Bcast(saveFile, sizeof(saveFile), MPI_CHAR, 0, MPI_COMM_WORLD); for(int i =0; i<taskNum; i++) { paraSent[0] = breakPt[i][0]; paraSent[1] = breakPt[i][1]; MPI_Send(¶Sent[0], 2, MPI_INT, i+1, i+1, MPI_COMM_WORLD); } } else // slaves; { // receive parameters from master; MPI_Recv(¶Sent[0], 2, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status); int firstBreakPt, secondBreakPt; firstBreakPt = paraSent[0]; secondBreakPt = paraSent[1]; testFunc(firstBreakPt, secondBreakPt, saveFile); // generate and process database; } MPI_Finalize(); return 0; } int testFunc(int firstBreakPt, int secondBreakPt, char* saveFile) { // convert int to string; ostringstream temp1; temp1<<firstBreakPt; string firstBreakPtStr = temp1.str(); ostringstream temp2; temp2<<secondBreakPt; string secondBreakPtStr = temp2.str(); string fileNameTemp = saveFile; // convert char* to string; string fileName = fileNameTemp + "_" + firstBreakPtStr + "_" + secondBreakPtStr + ".db"; cout<<"fileName is: "<< fileName <<endl; // open a new db; sqlite3* dropTableDB; cout << "sqlite3_open("", &dropTableDB): " << sqlite3_open( fileName.c_str(), &dropTableDB) << endl; if(dropTableDB == 0) { printf("\nCould not open database."); return 1; } char *errmsg; int result; // DROP TABLE PrimaryForLateralDistribution; result = sqlite3_exec ( dropTableDB, "Drop TABLE IF EXISTS PrimaryForLateralDistribution", // stmt 0, 0, &errmsg ); if ( result != SQLITE_OK ) { cout << "\nCould not prepare statement: Drop TABLE: " << result << endl; cout << "errmsg: " << errmsg << endl; return 1; } }