I have enough disk space. I just limit the database file size artificially
for testing purpose as you can see.
There is no problem of privilege and there is nothing else than the code I
sent. No other access to the DB.
I'm using sqlite 3.16.2

On Fri, Apr 5, 2019 at 3:59 PM Chris Locke <sql...@chrisjlocke.co.uk> wrote:

> Arthur - are you running SQLite in parallel runs?
> If you access the database file using the sqlite3 command-line tool, and
> try to execute the same SQL commands, do you get the same error ?
>
> SQLite makes a temporary 'journal' file while it's working.  I think that,
> on your platform, by default it will be in the same directory as the
> database file.  Does your application have enough privileges to create new
> files in that directory ?
> What version of SQLite are you using?  It might be an old version.
> Also, removing rows doesn't necessarily remove space in the database file.
> If you're running out of disk space, it could be you need to vacuum your
> database file.  How large is the database?  How much disk space do you have
> left?
>
>
> Thanks,
> Chris
>
> On Fri, Apr 5, 2019 at 1:46 PM Arthur Blondel <arthur5blon...@gmail.com>
> wrote:
>
> > OK, I wasn't clear.
> > I'm limited in space so when the DB is full (when sqlite3_exec() returns
> > SQLITE_FULL when I try to insert a new row), I remove the oldest row and
> > retry to insert the new one.
> > The data is always the same. That's why removing one row should be enough
> > to insert a new one.
> > My problem is that some times I need to remove many rows to add one new
> > one.
> > This is basically my code:
> >
> > main()
> > {
> >     sqlite3* db;
> >     int rc;
> >     char *err_msg = 0;
> >     int counter;
> >     bool full = false;
> >     int id;
> >
> >     /* --- Create DB --- */
> >     rc = sqlite3_open("db_file.db", &db);
> >     printf("1. rc = %d\n", rc);
> >
> >     rc = sqlite3_exec(db,
> >                  "CREATE TABLE IF NOT EXISTS data_table"
> >                  "(id INTEGER PRIMARY KEY AUTOINCREMENT, col1 INTEGER,
> col2
> > INTEGER, col3 INTEGER)",
> >                  0, 0, &err_msg);
> >     printf("2. rc = %d\n", rc);
> >
> >     /* --- Limit database size to 50 K --- */
> >     rc = sqlite3_exec(db, "PRAGMA page_size=1024", 0, 0, &err_msg);
> >     printf("3. rc = %d\n", rc);
> >     rc = sqlite3_exec(db, "PRAGMA max_page_count=50", 0, 0, &err_msg);
> >     printf("4. rc = %d\n", rc);
> >     rc = sqlite3_exec(db, "VACUUM", 0, 0, &err_msg);  // resize file
> >     printf("5. rc = %d\n", rc);
> >
> >
> >     /* --- Fill DB --- */
> >     for (int i = 0 ; i < 5000 ; i++) {
> >         counter = 0;
> >         do {
> >             rc = sqlite3_exec(db,
> >                               "INSERT INTO data_table"
> >                               "(col1, col2, col3) VALUES(1, 2, 3)",
> >                               0, 0, &err_msg);
> >
> >             if (rc == SQLITE_FULL) {
> >                 if (!full) {
> >                     printf("%d - DB full\n", id);
> >                     full = true;
> >                 }
> >                 counter++;
> >                 // delete oldest row
> >                 int stat = sqlite3_exec(db,
> >                              "DELETE FROM data_table WHERE id IN "
> >                              "(SELECT id FROM data_table ORDER BY id
> LIMIT
> > 1)",
> >                              0, 0, &err_msg);
> >                 if (stat != SQLITE_OK) {
> >                     printf("Delete error %d\n", stat);
> >                 }
> >             } else if (rc == SQLITE_OK) {
> >                 id = sqlite3_last_insert_rowid(db);
> >             } else /*if (rc != SQLITE_OK)*/ {
> >                 printf("Insert error %d\n", rc);
> >             }
> >         } while (rc == SQLITE_FULL);
> >
> >         if (counter > 2) {
> >             printf("%d - %d rows was removed\n", id, counter);
> >         }
> >     }
> >
> >     printf("close -> %d\n", sqlite3_close(db));
> > }
> >
> >
> > Following the output:
> >
> > 1. rc = 0
> > 2. rc = 0
> > 3. rc = 0
> > 4. rc = 0
> > 5. rc = 0
> > 3959 - DB full
> > 3960 - 109 rows was removed
> > 4044 - 92 rows was removed
> > 4128 - 86 rows was removed
> > 4212 - 85 rows was removed
> > 4296 - 85 rows was removed
> > 4380 - 84 rows was removed
> > 4464 - 84 rows was removed
> > 4548 - 84 rows was removed
> > 4632 - 84 rows was removed
> > 4716 - 84 rows was removed
> > 4800 - 84 rows was removed
> > 4884 - 84 rows was removed
> > 4968 - 84 rows was removed
> > close -> 0
> >
> > Thanks
> >
> >
> > On Thu, Apr 4, 2019 at 9:07 AM Arthur Blondel <arthur5blon...@gmail.com>
> > wrote:
> >
> > >
> > > Hello
> > >
> > > When I try to insert new data to a full SQLite database, I need to
> remove
> > > much more than really needed. I'm doing the following:
> > >
> > > while(1) {
> > >     do {
> > >         status = insert_1_row_to_db();
> > >         if (status == full) {
> > >             remove_one_row_from_db();
> > >         }
> > >     } while (status == full);}
> > >
> > > The inserted data has always the same size. When the database is full,
> > > removing only one row is enough to insert the new one. But after a
> > while, I
> > > need to remove 30, 40 and even more the 100 rows to be able to insert
> one
> > > new row. Is it the correct behavior of SQLite? Is there a way to remove
> > > only what is needed and no more? Thanks
> > >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to