// SQLite library written by Alain Deschenes (c) 2004 ArianeSoft

#define sqldll "sqlite_dll.dll"
#ifdef _WIN32_WCE
#define SQLITE_VERSION "2.8.6"
#else
#define SQLITE_VERSION "2.8.16"
#endif
#define SQLITE_ISO8859 1

#define SQLITE_OK 0 /* Successful result */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR 10  /* Some kind of disk I/ O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* (Internal Only) Table or record not found */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_FORMAT 24 /* Auxiliary database format error */
#define SQLITE_ROW 100 /* sqlite_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite_step() has finished executing */

#ifdef _WIN32_WCE
#declare sqlite_open sqldll sqlite_open 3 1
#declare sqlite_close sqldll sqlite_close 1 0
#declare sqlite_exec sqldll sqlite_exec 5 1
#declare sqlite_last_insert_rowid sqldll sqlite_last_insert_rowid 1 1
#declare sqlite_changes sqldll sqlite_changes 1 1
#declare sqlite_interrupt sqldll sqlite_interrupt 1 0
#declare sqlite_complete sqldll sqlite_complete 1 1
#declare sqlite_busy_timeout sqldll sqlite_busy_timeout 2 0
#declare sqlite_get_table sqldll sqlite_get_table 6 1
#declare sqlite_free_table sqldll sqlite_free_table 1 0
#declare sqlite_freemem sqldll sqlite_freemem 1 0
#declare sqlite_libversion sqldll sqlite_libversion 0 1
#declare sqlite_compile sqldll sqlite_compile 5 1
#declare sqlite_finalize sqldll sqlite_finalize 2 1
#else
#c_declare sqlite_open sqldll sqlite_open 3 1
#c_declare sqlite_close sqldll sqlite_close 1 0
#c_declare sqlite_exec sqldll sqlite_exec 5 1
#c_declare sqlite_last_insert_rowid sqldll sqlite_last_insert_rowid 1 1
#c_declare sqlite_changes sqldll sqlite_changes 1 1
#c_declare sqlite_interrupt sqldll sqlite_interrupt 1 0
#c_declare sqlite_complete sqldll sqlite_complete 1 1
#c_declare sqlite_busy_timeout sqldll sqlite_busy_timeout 2 0
#c_declare sqlite_get_table sqldll sqlite_get_table 6 1
#c_declare sqlite_free_table sqldll sqlite_free_table 1 0
#c_declare sqlite_freemem sqldll sqlite_freemem 1 0
#c_declare sqlite_libversion sqldll sqlite_libversion 0 1
#c_declare sqlite_compile sqldll sqlite_compile 5 1
#c_declare sqlite_finalize sqldll sqlite_finalize 2 1
#endif

Global(SQLERROR$);

func SqlOpen(filename$)
  type(errmsg$, tint);
  s$ = sqlite_open(filename$, 0, &errmsg$);
  if (s$ == 0)
    SQLERROR$ = @errmsg$;
    free(@errmsg$);
  end;
  return (s$);
end;

proc SqlClose(s$)
  sqlite_close(s$);
end;

func SqlExec(s$, sql$, data$, row$, column$);
  type(errmsg$, tint);
  type(result$, tint);
  type(rows$, tint);
  type(columns$, tint);

  r$ = sqlite_get_table(s$, sql$, &result$, &rows$, &columns$, &errmsg$);
  if (r$ <> SQLITE_OK)
    SQLERROR$ = @errmsg$;
    free(@errmsg$);
    return (SQLITE_ERROR);
  end;

  row$ = rows$;
  column$ = columns$;
  if ((row$ <> 0) or (column$ <> 0))
    carraytolist(@result$,((Row$) + 1) * (Column$), data$);
#ifdef _WIN32_WCE
    freecarray(((Row$) + 1) * (Column$), @result$);
#endif
  end;

  return (r$);
end;
