#include <sqlite3.h>
+// Offset for ?003 and alike -- they start from 001, not 000
+#define PARAM_OFS 1
+
extern void write_logger(const char* logname, const char* message);
static const char logger[] = "steamworks.pulleyscript.squeal";
//
// Setup the prepared statement with the output variable blobs
for (i=1; i < numparm; i++) {
- snprintf (drvid, sizeof (drvid)-1, "?%03d", idx);
+ snprintf (drvid, sizeof (drvid)-1, "?%03d", PARAM_OFS + idx);
idx = sqlite3_bind_parameter_index (s3in, drvid);
if (idx != 0) {
sqlret = sqlite3_bind_blob64 (s3in, idx,
//
// Setup the prepared statement with the output variable blobs
for (i=0; i < numparm; i++) {
- snprintf (drvid, sizeof (drvid)-1, "?%03d", i+2);
+ snprintf (drvid, sizeof (drvid)-1, "?%03d", PARAM_OFS + i+2);
idx = sqlite3_bind_parameter_index (s3in, drvid);
if (idx != 0) {
sqlret = sqlite3_bind_blob64 (s3in, idx,
case CND_GE:
v2 = cnd_parse_variable (&subexp, &subexplen);
v1 = cnd_parse_variable (&subexp, &subexplen);
- if (bitset_test (params, v1)) {
- snprintf (varid, sizeof (varid)-1, "?%03d", v1);
+ if (!bitset_test (params, v1)) {
+ snprintf (varid, sizeof (varid)-1, "?%03d", PARAM_OFS + v1);
sqlbuf_write (sql, varid);
} else {
sqlbuf_write (sql, "var_");
(operator == CND_LE)? " <= ":
(operator == CND_GE)? " >= ":
" ERROR ");
- if (bitset_test (params, v2)) {
+ if (!bitset_test (params, v2)) {
/* No need to prefix var_ or anything, separate id space */
- snprintf (varid, sizeof (varid)-1, "?%03d", v2);
+ snprintf (varid, sizeof (varid)-1, "?%03d", PARAM_OFS + v2);
sqlbuf_write (sql, varid);
} else {
sqlbuf_write (sql, "var_");
comma = "SELECT ";
for (i=0; i<outcount; i++) {
sqlbuf_write (&sql, comma);
- if (0 && bitset_test (params, outarray [i])) {
+ if (!bitset_test (params, outarray [i])) {
/* No need to prefix var_ or anything, separate id space */
- snprintf (varid, sizeof (varid)-1, "?%03d", outarray [i]);
+ snprintf (varid, sizeof (varid)-1, "?%03d", PARAM_OFS + outarray [i]);
sqlbuf_write (&sql, varid);
} else {
sqlbuf_write (&sql, "var_");
//
// Based on the generated SQL string, prepare a statement
if (sqlite3_prepare (squeal->s3db, sql.buf, sql.ofs, &retval, NULL) != SQLITE_OK) {
- ERROR("Failed to construct production rule for SQLite3 engine\n");
+ ERROR("Failed to construct production rule for SQLite3 engine: %s\n%.*s",
+ sqlite3_errmsg (squeal->s3db),
+ sql.ofs, sql.buf);
retval = NULL;
goto cleanup;
}
if ((sqlretval = sqlite3_prepare(squeal->s3db, sql.buf, sql.ofs, &gen->opt_gen_del_tuple, NULL)) != SQLITE_OK)
{
- ERROR("PREP ERROR delete in generator SQL %d\n", sqlretval);
+ ERROR("PREP ERROR delete in generator SQL %d: %s\n", sqlretval, sqlite3_errmsg (squeal->s3db));
goto fail;
}
sqlbuf_write(&sql, " VALUES (:uuid"); // One parameter is always the entryUUID
for (varnum=0; varnum < gen->numrecvars; varnum++)
{
- snprintf (paramstr, sizeof (paramstr)-1, ",?%03d", varnum+2);
+ snprintf (paramstr, sizeof (paramstr)-1, ",?%03d", PARAM_OFS + varnum+2);
sqlbuf_write(&sql, paramstr);
}
sqlbuf_write(&sql, ")");
if ((sqlretval = sqlite3_prepare(squeal->s3db, sql.buf, sql.ofs, &gen->opt_gen_add_tuple, NULL)) != SQLITE_OK)
{
+ ERROR("PREP ERROR insert in generator SQL %d: %s\n", sqlretval, sqlite3_errmsg (squeal->s3db));
sqlite3_finalize(gen->opt_gen_del_tuple);
gen->opt_gen_del_tuple = NULL;
- ERROR("PREP ERROR insert in generator SQL %d\n", sqlretval);
goto fail;
}
" WHERE out_hash = :hash\n"
" UNION VALUES (0) )");
if ((sqlretval = sqlite3_prepare (squeal->s3db, sql.buf, sql.ofs, &squeal->get_drv_all, NULL)) != SQLITE_OK) {
- ERROR("PREP ERROR select in SQL %d\n", sqlretval);
+ ERROR("PREP ERROR select in SQL %d: %s\n", sqlretval, sqlite3_errmsg (squeal->s3db));
retval = 1;
goto cleanup;
}