On 7/23/2012 10:51 PM, Keith Medcalf wrote:
And of course, finalize after close is wrong.  You finalize the statement, then 
close the db, then bail.
Which goes back to the point I was making, don't manage resources yourself. Let the compiler do it. The close should've been only in the database object destructor (or, for more flexibility, in a close method that happens to be called by the destructor).

Ideally, you should never be using any of the sqlite handle types anywhere in your code, except for the objects that manage them. This is probably not obtainable in practice without a lot of work and/or performance impacting code, or using someone else's library. No matter what though, all the creation / destruction calls should be through the object, since that's where it really matters.

---
()  ascii ribbon campaign against html e-mail
/\  www.asciiribbon.org


-----Original Message-----
From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-
boun...@sqlite.org] On Behalf Of Robert Myers
Sent: Monday, 23 July, 2012 21:44
To: sqlite-users@sqlite.org
Subject: Re: [sqlite] C++ - Creating Table

On 7/23/2012 7:43 PM, Arbol One wrote:
Thank you Michael for your prompt response.
I have been able to duplicate the error message. I think this could be a
bug
in SQLite3.
void jme::mySQLite3::createTable(const std::string& s) throw
(std::exception) {
      rc = sqlite3_prepare_v2( db, s.c_str(), -1, &stmt, NULL);
      if(rc != SQLITE_OK) {
rc is a bool, not an int, you have a type coercion error here.

          sqlite3_close(db);
          sqlite3_finalize(stmt);
          std::string error("Error prepare_v2: ");
          error += sqlite3_errmsg(db);
          std::cout << "Error: " << rc << " " << error << std::endl;
      }
      rc = sqlite3_step(stmt);
There's a use after free error here  (you don't return / throw after
finalizing)
      std::cout << "Error: " << rc << std::endl;

      if(rc != SQLITE_DONE) {
And another type coercion error here. rc will never be equal to SQLITE_DONE.

          sqlite3_close(db);
          sqlite3_finalize(stmt);
And another use after free here, since the step will fail, you'll close
it again. Of course, that assumes the step isn't going to crash in the
first place.
          std::string error("error sqlite3_step: ");
          error += sqlite3_errmsg(db);
          std::cout << error << std::endl;
      }
      sqlite3_finalize(stmt);
And another use after free here, same problem with the error handling.

You're committing one of the cardinal sins of C++. Let the compiler do
all the work, don't do it yourself, you'll (generic you) screw it up.
Wrap the DB and query in objects that handle the clean up for you.

Compile everything (except sqlite3.c itself) at the highest possible
warning level treating warnings as errors. That would've caught the type
error. It's one of the first things I set up with new projects.

Rob

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to