[Scipy-svn] r2722 - trunk/Lib/sandbox/timeseries/io/fame
scipy-svn at scipy.org
scipy-svn at scipy.org
Fri Feb 16 16:14:55 EST 2007
Author: mattknox_ca
Date: 2007-02-16 15:14:51 -0600 (Fri, 16 Feb 2007)
New Revision: 2722
Modified:
trunk/Lib/sandbox/timeseries/io/fame/fame.py
Log:
lots of fixes and tweaks and additions
Modified: trunk/Lib/sandbox/timeseries/io/fame/fame.py
===================================================================
--- trunk/Lib/sandbox/timeseries/io/fame/fame.py 2007-02-16 21:14:08 UTC (rev 2721)
+++ trunk/Lib/sandbox/timeseries/io/fame/fame.py 2007-02-16 21:14:51 UTC (rev 2722)
@@ -23,10 +23,32 @@
if hasattr(key, 'upper'): key = key.upper()
super(CaseInsensitiveDict, self).__setitem__(key, item)
+
+def _single_or_multi_func(dbkey, name, func, *args, **kwargs):
+ if isinstance(name, str):
+ single_obj = True
+ name = [name]
+ else:
+ single_obj = False
+
+ result = {}
+ for n in name:
+ result[n] = func(dbkey, n, *args, **kwargs)
+
+ if single_obj:
+ return result.values()[0]
+
+ return result
+
+def _famedate_to_tsdate(fame_date, freqstr):
+ "convert integer fame date to a timeseries Date"
+ value = fame_date + mp.value_adjust[ts.freq_fromstr(freqstr)]
+ return ts.Date(freq=freqstr, value=value)
+
class DBError(Exception): pass
class FameDb(object):
- """Fame database object
+ """Fame database object.
:Construction:
x = FameDb(conn_str, mode='r')
@@ -42,7 +64,12 @@
'c' => create
'u' => update
'w' => write
- 'd' => direct"""
+ 'd' => direct
+
+Notes
+ - For changes to be commited, you must explictly use the "commit" or
+ "close" methods (changes are commited on close). Changes are NOT
+ committed when the database object is deleted."""
def __init__(self, conn_str, mode='r'):
mode = mode.lower()
if mode == 'r':
@@ -63,12 +90,7 @@
raise ValueError, "Database access mode not supported."
self.mode = mode
- try:
- self.dbkey = cf_open(conn_str, intmode)
- self.dbIsOpen = True
- except:
- self.dbIsOpen = False
- raise
+ self.dbkey = cf_open(conn_str, intmode)
def read(self, name,
@@ -104,10 +126,6 @@
if `name` is a single string:
object from database that is stored as `name`"""
-
- if not self.dbIsOpen:
- raise DBError("Database is not open")
-
isSingle = False
if isinstance(name, types.StringType):
names = [name]
@@ -145,7 +163,7 @@
objName = objName.upper()
if checkFreq:
- objFreq = self.get_freq(objName)
+ objFreq = self.obj_size(objName)['freq']
if objFreq == range_freq:
start_index, end_index = _start_date, _end_date
@@ -209,7 +227,6 @@
pyObj = ma.array(data, mask=mask)
else:
observed = mp.observedMapping[result['observed']]
- basis = mp.basisMapping[result['basis']]
freq = mp.freqMapping[result['freq']]
if 'data' in result:
@@ -324,8 +341,6 @@
- `end_date` (Date, *[None]*) : If None, data will be written until the end of
`tser`. If specified, only data points on or before end_date will be written.
"""
-
- self.__check_writeable()
if not isinstance(tser, ts.TimeSeries):
raise ValueError("tser is not a valid time series")
@@ -345,10 +360,7 @@
if create:
- if hasattr(tser, "basis"):
- fame_basis = mp.basisReverseMapping[tser.basis]
- else:
- fame_basis = mp.HBSDAY
+ fame_basis = mp.HBSDAY
if hasattr(tser, "observed"):
fame_observed = mp.observedReverseMapping[tser.observed]
@@ -356,7 +368,7 @@
else:
fame_observed = mp.HOBEND
- if self.exists(name): self.remove(name)
+ if self.exists(name): self.delete(name)
cf_create(self.dbkey, name, mp.HSERIE, fame_freq, fame_type, fame_basis, fame_observed)
def get_boundary_date(bdate, attr):
@@ -420,8 +432,6 @@
- `end_case` (int, *[None]*) : If None, data will be written until the end of
`cser`. If specified, only data points on or before end_case will be written.
"""
-
- self.__check_writeable()
if not isinstance(cser, numpy.ndarray):
raise ValueError("cser is not a valid ndarray")
@@ -447,7 +457,7 @@
fame_type = mp.fametype_fromdata(fame_data)
if create:
- if self.exists(name): self.remove(name)
+ if self.exists(name): self.delete(name)
cf_create(self.dbkey, name, mp.HSERIE, mp.HCASEX, fame_type, mp.HBSUND, mp.HOBUND)
def get_boundary_case(bcase, attr):
@@ -497,8 +507,6 @@
- `scalar` : one of the following: string, numpy scalar, int, float,
list of strings (for name lists), Date, boolean"""
- self.__check_writeable()
-
fame_type = mp.fametype_fromdata(scalar)
if isinstance(scalar, ts.Date):
@@ -519,7 +527,7 @@
else:
raise ValueError("Unrecognized data type")
- if self.exists(name): self.remove(name)
+ if self.exists(name): self.delete(name)
cf_create(self.dbkey, name, mp.HSCALA, mp.HUNDFX, fame_type, mp.HBSUND, mp.HOBUND)
# convert integer types to floats since FAME does not have an integer type
@@ -533,11 +541,30 @@
cf_write_scalar(self.dbkey, name, fame_data, fame_type)
+ def desc(self):
+ "get 'description' attribute of database"
+ return cf_get_db_attr(self.dbkey, "DESC")
+
+ def doc(self):
+ "get 'doc' attribute of database"
+ return cf_get_db_attr(self.dbkey, "DOC")
+
+ def created(self):
+ "get 'created' attribute of database"
+ fame_date = cf_get_db_attr(self.dbkey, "CREATED")
+ return _famedate_to_tsdate(fame_date, 's')
+
+ def modified(self):
+ "get 'modified' attribute of database"
+ fame_date = cf_get_db_attr(self.dbkey, "MODIFIED")
+ return _famedate_to_tsdate(fame_date, 's')
+
+ def is_open(self):
+ return cf_get_db_attr(self.dbkey, "ISOPEN")
def wildlist(self, exp, wildonly=False):
"""performs a wildlist lookup on the database, using Fame syntax
("?" and "^"), returns a normal python list of strings"""
- self.__check_readable()
res = cf_wildlist(self.dbkey, exp)
if wildonly:
@@ -553,72 +580,33 @@
return cf_exists(self.dbkey, name)
def close(self):
- if self.dbIsOpen:
+ """Closes the database. Changes will be posted."""
+ if self.is_open():
cf_close(self.dbkey)
- self.dbIsOpen = False
+
+ def commit(self):
+ pass
- def __del__(self):
- if self.dbIsOpen:
- self.close()
-
-
- def __check_writeable(self):
- """Raises error if data base is not writeable"""
- if not self.dbIsOpen:
- raise DBError("Database is not open")
- if self.mode == 'r':
- raise DBError("Cannot write to a read-only database")
-
- def __check_readable(self):
- """Raises error if data base is not readable"""
- if not self.dbIsOpen:
- raise DBError("Database is not open")
-
-
- def remove(self, name, must_exist=True):
- """Deletes the given series from the database"""
+ def delete(self, name, must_exist=True):
+ """Deletes the specified object(s) from the database"""
if isinstance(name, str): name = [name]
- [cf_remove(self.dbkey, n) for n in name if must_exist or self.exists(n)]
+ [cf_delete(self.dbkey, n) for n in name if must_exist or self.exists(n)]
+ def obj_size(self, name):
+ """basic information about the size of an object(s) in a database"""
+ return _single_or_multi_func(self.dbkey, name, cf_obj_size)
- def get_freq(self, name):
- """Finds the frequency of the object stored in the db as `name`"""
- if not self.dbIsOpen:
- raise DBError("Database is not open")
-
- result = cf_size(self.dbkey, name.upper())
- return result['freq']
-
-
def whats(self, name):
"""Preforms a fame "whats" command on the provided name(s)"""
- if isinstance(name, str):
- single_obj = True
- name = [name]
- else:
- single_obj = False
+ return _single_or_multi_func(self.dbkey, name, cf_whats)
- result = {}
- for n in name:
- if not self.dbIsOpen:
- raise DBError("Database is not open")
-
- result[n] = cf_whats(self.dbkey, n.upper())
-
- if single_obj:
- return result.values()[0]
-
- return result
-
-
-
def restore(self):
"""Discard any changes made to the database since it was last opened or posted."""
return cf_restore(self.dbkey)
class cFameCall:
- """wrapper for cfame functions that acquires and releases a resource log.
+ """wrapper for cfame functions that acquires and releases a resource lock.
This is needed because the Fame C api is not thread safe."""
def __init__ (self, func):
@@ -642,9 +630,9 @@
cf_set_option = cFameCall(cfame.set_option)
cf_close = cFameCall(cfame.close)
cf_restore = cFameCall(cfame.restore)
-cf_size = cFameCall(cfame.size)
+cf_obj_size = cFameCall(cfame.obj_size)
cf_whats = cFameCall(cfame.whats)
-cf_remove = cFameCall(cfame.remove)
+cf_delete = cFameCall(cfame.delete)
cf_create = cFameCall(cfame.create)
cf_read = cFameCall(cfame.read)
cf_write_scalar = cFameCall(cfame.write_scalar)
@@ -652,6 +640,7 @@
cf_write_namelist = cFameCall(cfame.write_namelist)
cf_wildlist = cFameCall(cfame.wildlist)
cf_exists = cFameCall(cfame.exists)
+cf_get_db_attr = cFameCall(cfame.get_db_attr)
set_option = cf_set_option
set_option.__doc__ = \
More information about the Scipy-svn
mailing list