|
9 | 9 | # Copyright (C) 2011 Christian Haselgrove
|
10 | 10 |
|
11 | 11 | import os
|
| 12 | +from os.path import join as pjoin |
12 | 13 | import tempfile
|
13 | 14 | import StringIO
|
| 15 | +import getpass |
| 16 | +import warnings |
14 | 17 | import sqlite3
|
15 | 18 |
|
16 | 19 | import numpy
|
@@ -226,29 +229,29 @@ class _db_nochange:
|
226 | 229 | """context guard for read-only database access"""
|
227 | 230 |
|
228 | 231 | def __enter__(self):
|
229 |
| - self.c = _db.cursor() |
| 232 | + self.c = DB.cursor() |
230 | 233 | return self.c
|
231 | 234 |
|
232 | 235 | def __exit__(self, type, value, traceback):
|
233 | 236 | if type is None:
|
234 | 237 | self.c.close()
|
235 |
| - _db.rollback() |
| 238 | + DB.rollback() |
236 | 239 | return
|
237 | 240 |
|
238 | 241 | class _db_change:
|
239 | 242 |
|
240 | 243 | """context guard for database access requiring a commit"""
|
241 | 244 |
|
242 | 245 | def __enter__(self):
|
243 |
| - self.c = _db.cursor() |
| 246 | + self.c = DB.cursor() |
244 | 247 | return self.c
|
245 | 248 |
|
246 | 249 | def __exit__(self, type, value, traceback):
|
247 | 250 | if type is None:
|
248 | 251 | self.c.close()
|
249 |
| - _db.commit() |
| 252 | + DB.commit() |
250 | 253 | else:
|
251 |
| - _db.rollback() |
| 254 | + DB.rollback() |
252 | 255 | return
|
253 | 256 |
|
254 | 257 | def _get_subdirs(base_dir, files_dict=None):
|
@@ -427,44 +430,54 @@ def clear_cache():
|
427 | 430 | c.execute("DELETE FROM study")
|
428 | 431 | return
|
429 | 432 |
|
430 |
| -_create_queries = ( |
| 433 | + |
| 434 | +CREATE_QUERIES = ( |
431 | 435 | """CREATE TABLE study (uid TEXT NOT NULL PRIMARY KEY,
|
432 | 436 | date TEXT NOT NULL,
|
433 | 437 | time TEXT NOT NULL,
|
434 | 438 | comments TEXT NOT NULL,
|
435 | 439 | patient_name TEXT NOT NULL,
|
436 | 440 | patient_id TEXT NOT NULL,
|
437 | 441 | patient_birth_date TEXT NOT NULL,
|
438 |
| - patient_sex TEXT NOT NULL)""", |
| 442 | + patient_sex TEXT NOT NULL)""", |
439 | 443 | """CREATE TABLE series (uid TEXT NOT NULL PRIMARY KEY,
|
440 |
| - study TEXT NOT NULL REFERENCES study, |
| 444 | + study TEXT NOT NULL REFERENCES study, |
441 | 445 | number TEXT NOT NULL,
|
442 | 446 | description TEXT NOT NULL,
|
443 | 447 | rows INTEGER NOT NULL,
|
444 | 448 | columns INTEGER NOT NULL,
|
445 | 449 | bits_allocated INTEGER NOT NULL,
|
446 |
| - bits_stored INTEGER NOT NULL)""", |
| 450 | + bits_stored INTEGER NOT NULL)""", |
447 | 451 | """CREATE TABLE storage_instance (uid TEXT NOT NULL PRIMARY KEY,
|
448 | 452 | instance_number INTEGER NOT NULL,
|
449 |
| - series TEXT NOT NULL references series)""", |
450 |
| - """CREATE TABLE directory (path TEXT NOT NULL PRIMARY KEY, |
451 |
| - mtime INTEGER NOT NULL)""", |
452 |
| - """CREATE TABLE file (directory TEXT NOT NULL REFERENCES directory, |
453 |
| - name TEXT NOT NULL, |
454 |
| - mtime INTEGER NOT NULL, |
455 |
| - storage_instance TEXT DEFAULT NULL REFERENCES storage_instance, |
456 |
| - PRIMARY KEY (directory, name))""" |
457 |
| -) |
458 |
| - |
459 |
| -_db_fname = '%s/dft.%d.sqlite' % (tempfile.gettempdir(), os.getuid()) |
460 |
| -print 'db is %s' % _db_fname |
461 |
| -_db = sqlite3.connect(_db_fname, check_same_thread=False) |
462 |
| - |
463 |
| -with _db_change() as c: |
464 |
| - c.execute("SELECT COUNT(*) FROM sqlite_master WHERE type = 'table'") |
465 |
| - if c.fetchone()[0] == 0: |
466 |
| - print 'create' |
467 |
| - for q in _create_queries: |
468 |
| - c.execute(q) |
| 453 | + series TEXT NOT NULL references series)""", |
| 454 | + """CREATE TABLE directory (path TEXT NOT NULL PRIMARY KEY, |
| 455 | + mtime INTEGER NOT NULL)""", |
| 456 | + """CREATE TABLE file (directory TEXT NOT NULL REFERENCES directory, |
| 457 | + name TEXT NOT NULL, |
| 458 | + mtime INTEGER NOT NULL, |
| 459 | + storage_instance TEXT DEFAULT NULL REFERENCES storage_instance, |
| 460 | + PRIMARY KEY (directory, name))""") |
| 461 | +DB_FNAME = pjoin(tempfile.gettempdir(), 'dft.%s.sqlite' % getpass.getuser()) |
| 462 | +DB = None |
| 463 | + |
| 464 | + |
| 465 | +def _init_db(verbose=True): |
| 466 | + """ Initialize database """ |
| 467 | + if verbose: |
| 468 | + print 'db filename: ' + DB_FNAME |
| 469 | + global DB |
| 470 | + DB = sqlite3.connect(DB_FNAME, check_same_thread=False) |
| 471 | + with _db_change() as c: |
| 472 | + c.execute("SELECT COUNT(*) FROM sqlite_master WHERE type = 'table'") |
| 473 | + if c.fetchone()[0] == 0: |
| 474 | + print 'create' |
| 475 | + for q in CREATE_QUERIES: |
| 476 | + c.execute(q) |
| 477 | + |
469 | 478 |
|
| 479 | +if os.name == 'nt': |
| 480 | + warnings.warn('dft needs FUSE which is not available for windows') |
| 481 | +else: |
| 482 | + _init_db() |
470 | 483 | # eof
|
0 commit comments