Skip to content

Commit

Permalink
Implement statement_timeout with timespecs
Browse files Browse the repository at this point in the history
  • Loading branch information
fractaledmind committed Jan 21, 2024
1 parent 31e44c1 commit bd0267e
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 8 deletions.
16 changes: 10 additions & 6 deletions ext/sqlite3/database.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@

VALUE cSqlite3Database;

// Function to check if two timespec structures are equal
int timespec_equal(const struct timespec* ts1, const struct timespec* ts2) {
return (ts1->tv_sec == ts2->tv_sec) && (ts1->tv_nsec == ts2->tv_nsec);
}

static void
database_mark(void *ctx)
{
Expand Down Expand Up @@ -266,12 +271,11 @@ rb_sqlite3_statement_timeout(void *context)
struct timespec currentTime;
clock_gettime(CLOCK_MONOTONIC, &currentTime);

if (ctx->stmt_deadline == 0) {
ctx->stmt_deadline = currentTime.tv_sec * 1e9 + currentTime.tv_nsec + (long long)ctx->stmt_timeout * 1e6;
} else {
long long timeDiff = ctx->stmt_deadline - (currentTime.tv_sec * 1e9 + currentTime.tv_nsec);

if (timeDiff < 0) { return 1; }
if (!timespecisset(&ctx->stmt_deadline)) {
// Set stmt_deadline if not already set
ctx->stmt_deadline = currentTime;
} else if (timespecafter(&currentTime, &ctx->stmt_deadline)) {
return 1;
}

return 0;
Expand Down
2 changes: 1 addition & 1 deletion ext/sqlite3/database.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ struct _sqlite3Ruby {
sqlite3 *db;
VALUE busy_handler;
int stmt_timeout;
long long stmt_deadline;
struct timespec stmt_deadline;
};

typedef struct _sqlite3Ruby sqlite3Ruby;
Expand Down
1 change: 1 addition & 0 deletions ext/sqlite3/sqlite3_ruby.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ extern VALUE cSqlite3Blob;
#include <statement.h>
#include <exception.h>
#include <backup.h>
#include <timespec.h>

int bignum_to_int64(VALUE big, sqlite3_int64 *result);

Expand Down
2 changes: 1 addition & 1 deletion ext/sqlite3/statement.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ prepare(VALUE self, VALUE db, VALUE sql)
);

CHECK(db_ctx->db, status);
db_ctx->stmt_deadline = 0;
timespecclear(&db_ctx->stmt_deadline);

return rb_str_new2(tail);
}
Expand Down
20 changes: 20 additions & 0 deletions ext/sqlite3/timespec.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#define timespecclear(tsp) (tsp)->tv_sec = (tsp)->tv_nsec = 0
#define timespecisset(tsp) ((tsp)->tv_sec || (tsp)->tv_nsec)
#define timespecisvalid(tsp) \
((tsp)->tv_nsec >= 0 && (tsp)->tv_nsec < 1000000000L)
#define timespeccmp(tsp, usp, cmp) \
(((tsp)->tv_sec == (usp)->tv_sec) ? \
((tsp)->tv_nsec cmp (usp)->tv_nsec) : \
((tsp)->tv_sec cmp (usp)->tv_sec))
#define timespecsub(tsp, usp, vsp) \
do { \
(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \
(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \
if ((vsp)->tv_nsec < 0) { \
(vsp)->tv_sec--; \
(vsp)->tv_nsec += 1000000000L; \
} \
} while (0)
#define timespecafter(tsp, usp) \
(((tsp)->tv_sec > (usp)->tv_sec) || \
((tsp)->tv_sec == (usp)->tv_sec && (tsp)->tv_nsec > (usp)->tv_nsec))

0 comments on commit bd0267e

Please sign in to comment.