Skip to content

Commit 0850945

Browse files
siara-ccArundale Ramanathan
authored and
Arundale Ramanathan
committed
Fix for LittleFS and add example
1 parent 7e9f58e commit 0850945

File tree

2 files changed

+149
-2
lines changed

2 files changed

+149
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
/*
2+
This creates two empty databases, populates values, and retrieves them back
3+
from the LITTLEFS file system
4+
*/
5+
#include <stdio.h>
6+
#include <stdlib.h>
7+
#include <sqlite3.h>
8+
#include <SPI.h>
9+
#include <FS.h>
10+
#include "LittleFS.h"
11+
12+
/* You only need to format LITTLEFS the first time you run a
13+
test or else use the LITTLEFS plugin to create a partition
14+
https://github.com/lorol/arduino-esp32fs-plugin/releases */
15+
#define FORMAT_LITTLEFS_IF_FAILED true
16+
17+
const char* data = "Callback function called";
18+
static int callback(void *data, int argc, char **argv, char **azColName) {
19+
int i;
20+
Serial.printf("%s: ", (const char*)data);
21+
for (i = 0; i<argc; i++){
22+
Serial.printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
23+
}
24+
Serial.printf("\n");
25+
return 0;
26+
}
27+
28+
int db_open(const char *filename, sqlite3 **db) {
29+
int rc = sqlite3_open(filename, db);
30+
if (rc) {
31+
Serial.printf("Can't open database: %s\n", sqlite3_errmsg(*db));
32+
return rc;
33+
} else {
34+
Serial.printf("Opened database successfully\n");
35+
}
36+
return rc;
37+
}
38+
39+
char *zErrMsg = 0;
40+
int db_exec(sqlite3 *db, const char *sql) {
41+
Serial.println(sql);
42+
long start = micros();
43+
int rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
44+
if (rc != SQLITE_OK) {
45+
Serial.printf("SQL error: %s\n", zErrMsg);
46+
sqlite3_free(zErrMsg);
47+
} else {
48+
Serial.printf("Operation done successfully\n");
49+
}
50+
Serial.print(F("Time taken:"));
51+
Serial.println(micros()-start);
52+
return rc;
53+
}
54+
55+
void setup() {
56+
57+
Serial.begin(115200);
58+
sqlite3 *db1;
59+
sqlite3 *db2;
60+
int rc;
61+
62+
if (!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED, "/littlefs")) {
63+
Serial.println("Failed to mount file system");
64+
return;
65+
}
66+
67+
// list LITTLEFS contents
68+
File root = LittleFS.open("/");
69+
if (!root) {
70+
Serial.println("- failed to open directory");
71+
return;
72+
}
73+
if (!root.isDirectory()) {
74+
Serial.println(" - not a directory");
75+
return;
76+
}
77+
File file = root.openNextFile();
78+
while (file) {
79+
if (file.isDirectory()) {
80+
Serial.print(" DIR : ");
81+
Serial.println(file.name());
82+
} else {
83+
Serial.print(" FILE: ");
84+
Serial.print(file.name());
85+
Serial.print("\tSIZE: ");
86+
Serial.println(file.size());
87+
}
88+
file = root.openNextFile();
89+
}
90+
91+
// remove existing file
92+
LittleFS.remove("/test1.db");
93+
LittleFS.remove("/test2.db");
94+
95+
sqlite3_initialize();
96+
97+
if (db_open("/littlefs/test1.db", &db1))
98+
return;
99+
if (db_open("/littlefs/test2.db", &db2))
100+
return;
101+
102+
rc = db_exec(db1, "CREATE TABLE test1 (id INTEGER, content);");
103+
if (rc != SQLITE_OK) {
104+
sqlite3_close(db1);
105+
sqlite3_close(db2);
106+
return;
107+
}
108+
rc = db_exec(db2, "CREATE TABLE test2 (id INTEGER, content);");
109+
if (rc != SQLITE_OK) {
110+
sqlite3_close(db1);
111+
sqlite3_close(db2);
112+
return;
113+
}
114+
115+
rc = db_exec(db1, "INSERT INTO test1 VALUES (1, 'Hello, World from test1');");
116+
if (rc != SQLITE_OK) {
117+
sqlite3_close(db1);
118+
sqlite3_close(db2);
119+
return;
120+
}
121+
rc = db_exec(db2, "INSERT INTO test2 VALUES (1, 'Hello, World from test2');");
122+
if (rc != SQLITE_OK) {
123+
sqlite3_close(db1);
124+
sqlite3_close(db2);
125+
return;
126+
}
127+
128+
rc = db_exec(db1, "SELECT * FROM test1");
129+
if (rc != SQLITE_OK) {
130+
sqlite3_close(db1);
131+
sqlite3_close(db2);
132+
return;
133+
}
134+
rc = db_exec(db2, "SELECT * FROM test2");
135+
if (rc != SQLITE_OK) {
136+
sqlite3_close(db1);
137+
sqlite3_close(db2);
138+
return;
139+
}
140+
141+
sqlite3_close(db1);
142+
sqlite3_close(db2);
143+
144+
}
145+
146+
void loop() {
147+
}

src/esp32.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ static int ESP32FileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
300300

301301
struct stat st;
302302
int fno = fileno(p->fp);
303-
if (fno == -1)
303+
if (fno < 0)
304304
return SQLITE_IOERR_FSTAT;
305305
if (fstat(fno, &st))
306306
return SQLITE_IOERR_FSTAT;
@@ -433,7 +433,7 @@ static int ESP32Open(
433433
memset(&st, 0, sizeof(struct stat));
434434
int rc = stat( zName, &st );
435435
//Serial.println(zName);
436-
if (rc == -1) {
436+
if (rc < 0) {
437437
strcpy(mode, "w+");
438438
//int fd = open(zName, (O_CREAT | O_RDWR | O_EXCL), S_IRUSR | S_IWUSR);
439439
//close(fd);

0 commit comments

Comments
 (0)