On 3/18/15, Scott Hess <shess at google.com> wrote:
> I'm thinking I could use something like:
>
> SQLITE_API int sqlite3_attach(sqlite3* db, const char* zPath, const
> char* dbname);
> SQLITE_API int sqlite3_detach(sqlite3* db, const char* dbname);
>
> Right now, I have a helper in Chromium which does "ATTACH DATABASE ?
> AS ?".  This works, but AFAICT this page:
>    https://www.sqlite.org/lang_keywords.html
> implies that the dbname _probably_ should not be a string literal but
> instead an identifier.  So it should be "dbname" with embedded "
> characters doubled (nobody should ever do that, but *shrug*).

Though undocumented, the arguments to ATTACH and DETACH can be
arbitrary expressions.  For example:

     ATTACH 'xyzzy' || '.txt' AS printf('abc-%d',12345');

So bound parameters are also supported.  We have test cases that
verify this behavior.

>
> WDYT?  Mostly this just came up because I saw someone writing code
> which constructed things sprintf-style, without quoting, which was
> clearly error-prone.  But in describing the right way to do it, I had
> to do notable hand-waving.
>

Seems like an implementation of your requested functions would be fairly simple:

int sqlite3_attach(sqlite3* db, const char* zPath, const char* dbname){
   char *zSql = sqlite3_mprintf("ATTACH %Q AS %Q", zPath, dbname);
   int rc = sqlite3_exec(db, zSql, 0, 0, 0);
   sqlite3_free(zSql);
   return rc;
}
int sqlite3_detach(sqlite3* db, const char* dbname){
   char *zSql = sqlite3_mprintf("DETACH %Q", dbname);
   int rc = sqlite3_exec(db, zSql, 0, 0, 0);
   sqlite3_free(zSql);
   return rc;
}

-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to