summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2014-07-07 06:42:45 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2014-07-07 06:42:45 +0300
commit8e8c6676239ec91729b79a34a1a6c652b89cfbd7 (patch)
tree342ccb0a7eea796c184604690d0dcc84061dadcd
parentd8f1f96ee1dfbec9389ac5f760519c6da1405e0d (diff)
downloadapscheduler-8e8c6676239ec91729b79a34a1a6c652b89cfbd7.tar.gz
Use Float instead of BigInteger in SQLAlchemyJobStore to maintain proper job order in cases where next run times differ by less than a second (fixes #63)
-rw-r--r--apscheduler/jobstores/sqlalchemy.py6
-rw-r--r--tests/test_jobstores.py8
2 files changed, 11 insertions, 3 deletions
diff --git a/apscheduler/jobstores/sqlalchemy.py b/apscheduler/jobstores/sqlalchemy.py
index 2a13ad5..4e0c0e2 100644
--- a/apscheduler/jobstores/sqlalchemy.py
+++ b/apscheduler/jobstores/sqlalchemy.py
@@ -10,7 +10,7 @@ except ImportError: # pragma: nocover
import pickle
try:
- from sqlalchemy import create_engine, Table, Column, MetaData, Unicode, BigInteger, LargeBinary, select
+ from sqlalchemy import create_engine, Table, Column, MetaData, Unicode, Float, LargeBinary, select
from sqlalchemy.exc import IntegrityError
except ImportError: # pragma: nocover
raise ImportError('SQLAlchemyJobStore requires SQLAlchemy installed')
@@ -44,11 +44,11 @@ class SQLAlchemyJobStore(BaseJobStore):
else:
raise ValueError('Need either "engine" or "url" defined')
- # 767 = max key length in MySQL for InnoDB tables
+ # 767 = max key length in MySQL for InnoDB tables, 25 = precision that translates to an 8-byte float
self.jobs_t = Table(
tablename, metadata,
Column('id', Unicode(767, _warn_on_bytestring=False), primary_key=True),
- Column('next_run_time', BigInteger, index=True),
+ Column('next_run_time', Float(25), index=True),
Column('job_state', LargeBinary, nullable=False)
)
diff --git a/tests/test_jobstores.py b/tests/test_jobstores.py
index 191d4fd..58e8533 100644
--- a/tests/test_jobstores.py
+++ b/tests/test_jobstores.py
@@ -114,6 +114,14 @@ def test_get_pending_jobs(jobstore, create_add_job, timezone):
assert jobs == []
+def test_get_pending_jobs_subsecond_difference(jobstore, create_add_job, timezone):
+ job1 = create_add_job(jobstore, dummy_job, datetime(2014, 7, 7, 0, 0, 0, 401))
+ job2 = create_add_job(jobstore, dummy_job2, datetime(2014, 7, 7, 0, 0, 0, 402))
+ job3 = create_add_job(jobstore, dummy_job3, datetime(2014, 7, 7, 0, 0, 0, 400))
+ jobs = jobstore.get_due_jobs(timezone.localize(datetime(2014, 7, 7, 1)))
+ assert jobs == [job3, job1, job2]
+
+
def test_get_next_run_time(jobstore, create_add_job, timezone):
create_add_job(jobstore, dummy_job, datetime(2016, 5, 3))
create_add_job(jobstore, dummy_job2, datetime(2014, 2, 26))