[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/appserver/src/_featuretest GEDI.py GEMA.py...
From: |
Jan Ischebeck |
Subject: |
gnue/appserver/src/_featuretest GEDI.py GEMA.py... |
Date: |
Wed, 19 Jun 2002 09:15:46 -0400 |
CVSROOT: /cvsroot/gnue
Module name: gnue
Changes by: Jan Ischebeck <address@hidden> 02/06/19 09:15:46
Modified files:
appserver/src/_featuretest: GEDI.py GEMA.py README TODO atest.py
geasInstance.py geasList.py
geasMetaObject.py geasNameSpace.py
geasObject.py geasSession.py
geasSuperObject.py
Added files:
appserver/src/_featuretest: geasAuthentification.py
geasConnectionPool.py
geasObjectServer.py
Log message:
add a better seperation between data fetching and object creation
different other code cleanups
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasAuthentification.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasConnectionPool.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasObjectServer.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/GEDI.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/GEMA.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/README.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/TODO.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/atest.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasInstance.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasList.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasMetaObject.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasNameSpace.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasObject.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasSession.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasSuperObject.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
Patches:
Index: gnue/appserver/src/_featuretest/GEDI.py
diff -c gnue/appserver/src/_featuretest/GEDI.py:1.2
gnue/appserver/src/_featuretest/GEDI.py:1.3
*** gnue/appserver/src/_featuretest/GEDI.py:1.2 Thu May 23 17:24:02 2002
--- gnue/appserver/src/_featuretest/GEDI.py Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: GEDI.py,v 1.2 2002/05/23 21:24:02 siesel Exp $
#
=============================================================================
# Basic class
--- 19,25 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: GEDI.py,v 1.3 2002/06/19 13:15:46 siesel Exp $
#
=============================================================================
# Basic class
***************
*** 30,35 ****
--- 30,88 ----
from gnue.common import GDataSource
+ class GEDI:
+
+ #
---------------------------------------------------------------------------
+ # Initalize
+ #
---------------------------------------------------------------------------
+
+ def __init__ (self, connections):
+ self._connections = connections
+ self.storage=[databaseStorageAdapter(connections)]
+ self.OID_hint_cache={}
+ # load OID_hint_cache from database
+
+ def addStorage(self,storage):
+ self._storage.append[storage]
+
+ #
+ # a) this function returns an object stored at any place just out of the OID
+ # passed, if you know which class you need you should use the getInstances
+ # function of the class which should be much faster
+ # b) this function don't look into the cache, if an object with that OID is
+ # already loaded
+ #
+
+ def getObjectData (self,GOID, tablename, indexrow, fieldList ):
+ return self.storage[0].getObjectData (GOID, tablename,indexrow, fieldList)
+
+ def getObjectByOID(self,OID,hint=None,classOID=None):
+ # 1. check OID lookup cache (if OID in cache, go directly to datasource X)
+ # 2. check Datastore a,b,c,d, until OID is found
+ # 2b. check on all other remote appserver instances for that OID
+ # ( if found on remote and used often here, think about
+ # transfering it here)
+ # 3. write OID into datasource lookup cache
+ if classOID!=None:
+ # check if class contains hint, and use then use that hint
+ pass
+ if hint!=None:
+ pass # check datasource 'hint'
+
+ # if not found:
+ # for all dataStorage check for that OID
+
+ if classOID!=None:
+ # MetaObj=getObjectByOID(classOID)
+ # MetaObj.loadInstanceFrom(OID,datasource)
+ pass
+ else:
+ # try out all classes for one that fits.
+ pass
+
+ def requestStorageAdapter(self,info1,info2):
+ return databaseStorageAdapter()
+
class basicStorageAdapter:
pass
***************
*** 60,66 ****
def getObject( self,OID ):
return OID
! def getObjectData (self,GOID, tablename, fieldList ):
self._conditions = []
self._sort = ["zip"]
--- 113,119 ----
def getObject( self,OID ):
return OID
! def getObjectData (self, GOID, tablename, indexrow, fieldList ):
self._conditions = []
self._sort = ["zip"]
***************
*** 76,95 ****
self._datasource.phaseInit ()
- # TODO: get the column names from the prefetch field names
for field in fieldList:
self._datasource.referenceField (field)
self._resultset = self._datasource.createResultSet ()
moreRecords=self._resultset.firstRecord ()
- if moreRecords==0:
- raise geasObjectNotFound,"Object (OID=%s) is not defined in table %s."
% \
- (OID,tablename)
data=[]
while (moreRecords==1):
newdr={}
record=self._resultset.current
! if record.getField("goid")==GOID:
for field in fieldList:
newdr[field] = record.getField(field)
--- 129,146 ----
self._datasource.phaseInit ()
for field in fieldList:
self._datasource.referenceField (field)
+ self._datasource.referenceField (indexrow)
+
self._resultset = self._datasource.createResultSet ()
moreRecords=self._resultset.firstRecord ()
data=[]
while (moreRecords==1):
newdr={}
record=self._resultset.current
! if record.getField(indexrow)==GOID:
for field in fieldList:
newdr[field] = record.getField(field)
Index: gnue/appserver/src/_featuretest/GEMA.py
diff -c gnue/appserver/src/_featuretest/GEMA.py:1.1
gnue/appserver/src/_featuretest/GEMA.py:1.2
*** gnue/appserver/src/_featuretest/GEMA.py:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/GEMA.py Wed Jun 19 09:15:46 2002
***************
*** 19,31 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: GEMA.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
#
=============================================================================
# Basic class
#
=============================================================================
import geasObject
class geasMethodCompilationError(geasObject.Error):
# Raised when a python method couldn't be compiled
--- 19,32 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: GEMA.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
#
=============================================================================
# Basic class
#
=============================================================================
import geasObject
+ import new
class geasMethodCompilationError(geasObject.Error):
# Raised when a python method couldn't be compiled
***************
*** 90,96 ****
def __init__(self, OID, parent_OID, methodSource):
geasObject.geasObject.__init__(self,OID, parent_OID)
self.compiledMethod = None
! self.methodSource = methodSource
def formatSourceCode(self):
# format Source code
--- 91,99 ----
def __init__(self, OID, parent_OID, methodSource):
geasObject.geasObject.__init__(self,OID, parent_OID)
self.compiledMethod = None
! self.methodSource = methodSource
!
! # add classname (should be an OID)
def formatSourceCode(self):
# format Source code
***************
*** 129,135 ****
for i in params:
args["param%s" % j]=i
j=j+1
! exec self.compiledMethod in globals(),args
return args["rvalue"]
def addPreMethodHook(self,hook):
--- 132,138 ----
for i in params:
args["param%s" % j]=i
j=j+1
! exec self.compiledMethod in self._ns,args
return args["rvalue"]
def addPreMethodHook(self,hook):
***************
*** 142,144 ****
--- 145,150 ----
self.preMethodHook = hook
self.methodSource = self.methodSource + 'postMethodHook(self)\n'
self.compileMethod()
+
+ def requestPythonMethod(self,instance,_class):
+ return new.instancemethod(self,instance,_class)
Index: gnue/appserver/src/_featuretest/README
diff -c gnue/appserver/src/_featuretest/README:1.1
gnue/appserver/src/_featuretest/README:1.2
*** gnue/appserver/src/_featuretest/README:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/README Wed Jun 19 09:15:46 2002
***************
*** 1,9 ****
--- 1,28 ----
+ WHATS THIS?
+ ===========
This is a feature enhanced*, testing version of the application server.
It is a testfield for implementing functions and features, which could be
added to the app. server later.
+ the idea of the current implementation of _featuretest is to have a kind
+ of "object server" which is very very simple, but which has objects to
+ implement the rest of the server funtionality. (like the f.e. the HURD)
+ Because these objects are objects of the "objects server" themselves,
+ they can be updated and reloaded on a running system, and the most
+ important: they can be stored and loaded from a database. I.e. you can
+ store session states, class definitions, normal objects with using the same
+ code.
+
+ a list of concepts I'm trying to implement:
+ NameSpaces
+ Methods
+ MetaObjects
+
+
+ HOW TO TEST
+ ============
To try out this version just call "python atest.py" in this directory.
You have to set the INSTALL_PREFIX and possibly add an --connections command
Index: gnue/appserver/src/_featuretest/TODO
diff -c gnue/appserver/src/_featuretest/TODO:1.1
gnue/appserver/src/_featuretest/TODO:1.2
*** gnue/appserver/src/_featuretest/TODO:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/TODO Wed Jun 19 09:15:46 2002
***************
*** 3,9 ****
Change objects and interfaces to the definitions in odmg.txt
! rebuild storage framework for a consistent use of GEDI and GEOR
add support to store instances of objects back into the db
--- 3,9 ----
Change objects and interfaces to the definitions in odmg.txt
! rebuild storage framework for a consistent use of GEDI and GEOR ... (70%)
add support to store instances of objects back into the db
***************
*** 23,25 ****
--- 23,28 ----
add a geasAccessObject to the Appserver
+ add local/remote attribut to geasObject. local objects can be changed, remote
object are created on an other instance of the appserver and a change object
request has to be sended to the other instance. this request will be polled and
a result has to be returned before the next commit.
+
+ create a parent/meta object for metaobject namespace obj etc.... (done)
Index: gnue/appserver/src/_featuretest/atest.py
diff -c gnue/appserver/src/_featuretest/atest.py:1.1
gnue/appserver/src/_featuretest/atest.py:1.2
*** gnue/appserver/src/_featuretest/atest.py:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/atest.py Wed Jun 19 09:15:46 2002
***************
*** 19,32 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: atest.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
import os
from gnue.common import GClientApp
from gnue.common import GLoginHandler
! import geasSession
! import geasSuperObject
! import geasNameSpace
#
=============================================================================
# Test application
--- 19,35 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: atest.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
import os
from gnue.common import GClientApp
from gnue.common import GLoginHandler
! #import geasSession
! #import geasSuperObject
! #import geasNameSpace
! import geasObjectServer
! import GEDI
! import geasConnectionPool
#
=============================================================================
# Test application
***************
*** 42,52 ****
self.connections.setLoginHandler (testLoginHandler ())
print "Server initalisation..."
! server=geasSuperObject.geasSuperObject (1,1)
! server.setConnections(self.connections)
!
print "New Session"
! sess=server.getSession()
print "\nNew Instance"
instance=sess.Address.newInstance()
--- 45,57 ----
self.connections.setLoginHandler (testLoginHandler ())
print "Server initalisation..."
! server=geasObjectServer.geasObjectServer()
! server.gedi=GEDI.GEDI(self.connections)
! cp=geasConnectionPool.geasConnectionPool(server) # get connection pool
! cp.loadConfiguration('/etc/gnue/appserver.conf')
!
print "New Session"
! sess=cp.getSession()
print "\nNew Instance"
instance=sess.Address.newInstance()
***************
*** 58,64 ****
print " Name :", instance.name
print " Street:", instance.street
print " City :", instance.city
! print "on one line: %s " % instance.formatAddress()
print "\nNow call the function 'do' of the instance:"
instance.do("nothing", "in the sun", "working","on the edge")
--- 63,70 ----
print " Name :", instance.name
print " Street:", instance.street
print " City :", instance.city
! print "on one line by calling instance.formatAddress :\n %s " \
! % instance.formatAddress()
print "\nNow call the function 'do' of the instance:"
instance.do("nothing", "in the sun", "working","on the edge")
Index: gnue/appserver/src/_featuretest/geasInstance.py
diff -c gnue/appserver/src/_featuretest/geasInstance.py:1.1
gnue/appserver/src/_featuretest/geasInstance.py:1.2
*** gnue/appserver/src/_featuretest/geasInstance.py:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/geasInstance.py Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasInstance.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
#
=============================================================================
# Instance class
--- 19,25 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasInstance.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
#
=============================================================================
# Instance class
***************
*** 51,61 ****
def put (self, fieldname, value):
# TODO: translate the field name into a column name
self._record.setField (fieldname, value)
- self._record.post () # FIXME: Do that here? or elsewhere? later?
#
---------------------------------------------------------------------------
# Call a method
#
---------------------------------------------------------------------------
def call (self, methodname):
pass
--- 51,68 ----
def put (self, fieldname, value):
# TODO: translate the field name into a column name
self._record.setField (fieldname, value)
#
---------------------------------------------------------------------------
# Call a method
#
---------------------------------------------------------------------------
def call (self, methodname):
+ # not yet implemented
pass
+
+ #
---------------------------------------------------------------------------
+ # Delete this instance
+ #
---------------------------------------------------------------------------
+
+ def delete(self):
+ self._record.delete()
Index: gnue/appserver/src/_featuretest/geasList.py
diff -c gnue/appserver/src/_featuretest/geasList.py:1.2
gnue/appserver/src/_featuretest/geasList.py:1.3
*** gnue/appserver/src/_featuretest/geasList.py:1.2 Thu May 23 17:26:48 2002
--- gnue/appserver/src/_featuretest/geasList.py Wed Jun 19 09:15:46 2002
***************
*** 19,35 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasList.py,v 1.2 2002/05/23 21:26:48 siesel Exp $
! from gnue.common import GDataSource
import geasInstance
! import geasObject
#
=============================================================================
# List class
#
=============================================================================
! class geasList(geasObject.geasObject):
#
---------------------------------------------------------------------------
# Initalize
--- 19,35 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasList.py,v 1.3 2002/06/19 13:15:46 siesel Exp $
! from gnue.common import GDataSource,GConditions
import geasInstance
! import string
#
=============================================================================
# List class
#
=============================================================================
! class geasList:
#
---------------------------------------------------------------------------
# Initalize
***************
*** 41,47 ****
self._classname = classname
self._prefetch = []
self._conditions = []
- self._sort = []
#
---------------------------------------------------------------------------
# Actually these 3 only set variables
--- 41,46 ----
***************
*** 50,57 ****
def setPrefetch (self, prefetch):
self._prefetch = prefetch
! def setConditions (self, conditions):
self._conditions = conditions
def setSort (self, sort):
self._sort = sort
--- 49,67 ----
def setPrefetch (self, prefetch):
self._prefetch = prefetch
!
! # conditions = an list consisting of condition elements written down in
! # prefix notation i.e. (a=12) AND (c=121) -> AND = a 12 = c 121
! # every element of the list is a tuple containing the following parts:
! # type (eq,and,const...) value i.e. ('eq','') or ('const',12)
!
! def setConditions (self, conditions):
self._conditions = conditions
+
+ # now building GCondition tree
+ self._conditionTree = GConditions.buildTreeFromPrefix(conditions)
+
+
def setSort (self, sort):
self._sort = sort
***************
*** 64,95 ****
self._datasource = GDataSource.GDataSource ()
# TODO: get the table name from the class name
self._datasource.buildObject (name = "",
! database = "gnue",
table = self._classname)
self._datasource.setConnectionManager (self._session._connections)
self._datasource._datasourceDictionary={}
self._datasource.phaseInit ()
# TODO: get the column names from the prefetch field names
for field in self._prefetch:
self._datasource.referenceField (field)
! self._resultset = self._datasource.createResultSet ()
#
---------------------------------------------------------------------------
# Get the first instance in the list
#
---------------------------------------------------------------------------
def firstInstance (self):
! if self._resultset.firstRecord ()==0:
return None
- return self._parent.buildInstance(self._resultset.current)
-
#
---------------------------------------------------------------------------
# Get the next instance in the list
#
---------------------------------------------------------------------------
def nextInstance (self):
! if self._resultset.nextRecord ()==0:
return None
! return self._parent.buildInstance(self._resultset.current)
--- 74,125 ----
self._datasource = GDataSource.GDataSource ()
# TODO: get the table name from the class name
self._datasource.buildObject (name = "",
! database = self._session._database,
table = self._classname)
self._datasource.setConnectionManager (self._session._connections)
+
+ # bug fix should be moved into common after the freeze
self._datasource._datasourceDictionary={}
+
+ # set the field to sort (has to be called before phase init
+ if hasattr(self,"_sort"):
+ self._datasource.order_by=string.joinfields(self._sort,",")
self._datasource.phaseInit ()
# TODO: get the column names from the prefetch field names
for field in self._prefetch:
self._datasource.referenceField (field)
!
! if hasattr(self,"_conditionTree"):
! self._resultset = self._datasource.createResultSet(self._conditionTree)
! else:
! self._resultset = self._datasource.createResultSet()
!
#
---------------------------------------------------------------------------
# Get the first instance in the list
#
---------------------------------------------------------------------------
def firstInstance (self):
! if self._resultset.firstRecord () != 0:
! return self._parent.buildInstance(self._resultset.current)
! else:
return None
#
---------------------------------------------------------------------------
# Get the next instance in the list
#
---------------------------------------------------------------------------
def nextInstance (self):
! if self._resultset.nextRecord () != 0:
! return self._parent.buildInstance(self._resultset.current)
! else:
return None
!
! #
---------------------------------------------------------------------------
! # insert a new empty instance in the list and return it
! #
---------------------------------------------------------------------------
!
! def insertNewInstance (self):
! self._resultset.insertRecord ()
! return geasInstance.geasInstance (self._classname,
self._resultset.current)
Index: gnue/appserver/src/_featuretest/geasMetaObject.py
diff -c gnue/appserver/src/_featuretest/geasMetaObject.py:1.1
gnue/appserver/src/_featuretest/geasMetaObject.py:1.2
*** gnue/appserver/src/_featuretest/geasMetaObject.py:1.1 Mon May 13
18:34:11 2002
--- gnue/appserver/src/_featuretest/geasMetaObject.py Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasMetaObject.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
from gnue.common import GDebug
import geasObject
--- 19,25 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasMetaObject.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
from gnue.common import GDebug
import geasObject
***************
*** 28,56 ****
import copy
#
=============================================================================
# Basic class
#
=============================================================================
! class geasClass(geasObject.geasObject):
! pass
!
! class geasMetaObject(geasObject.geasObject):
#
---------------------------------------------------------------------------
# Initalize
#
---------------------------------------------------------------------------
! def __init__ (self, OID, parent_OID, GEDI=None):
self._OID = OID
self._parent_OID = parent_OID
self._classAttribs = {}
self._classMethods = {}
self._instanceAttribs = {}
self._instanceMethods = {}
- if GEDI!=None:
- self._GEDI=GEDI
- self.loadObjectDefinition()
#
---------------------------------------------------------------------------
# Get the OID of the object from which this is an instance, or
--- 28,114 ----
import copy
+ class geasMetaObject(geasObject.geasObject):
+ def __init__ (self, OID, parent_OID):
+ self._OID = OID
+ self._parent_OID = parent_OID
+
+ def getChildByOID(self,OID):
+ return None
+
+ class geasSimpleObjectFactory(geasMetaObject):
+ # this class is a factory which loads and stores namespaces, class objects
+ # etc., which could be described in a config file by this settings:
+ # [namespacefactory]
+ # factory=geasMultipleRowOneTableFactory
+ # tablename='geas_name_space'
+ # classname='geasNameSpace'
+ # populatefunction=registerObject
+ # oidrow=goid
+ # row1='name'
+ # row2='ref_OID'
+ # similar to this definition a Factory for a simple geasClass obj
+ # [classfactory]
+ # factory=geasMultipleRowOneTableFactory
+ # tablename='geas_classes'
+ # classname='geasClass'
+ # populatefunction=addAttribute
+ # oidrow=goid
+ # row1='name'
+ # row2='type'
+ # row3='default'
+ def __init__(self,OID,parent_OID,datasource,tablename,objclass,oidrow,
+ rownames,populatefunction):
+ geasMetaObject.__init__(self,OID,parent_OID)
+ self._datasource=datasource
+ self._tablename=tablename
+ self._objclass=objclass
+ self._oidrow=oidrow
+ self._rownames=rownames
+ self._populatefunction=populatefunction
+
+
+ def getChildByOID(self,OID):
+ # self._oidrow should also be send to datasource
+ # at the moment it defaults to "goid"
+ data=self._datasource.getObjectData(OID,self._tablename,
+ [self._oidrow]+self._rownames)
+ if data and len(data)>0:
+ # build new object
+ o = self._objclass(OID,self._OID)
+ populate = getattr(o,self._populatefunction)
+ for record in data:
+ params=[]
+ for i in self._rownames:
+ params.append(record[i])
+ populate(*params)
+
+ # save object into cache
+ registerObject(o)
+
+ # return new object
+ return o
+ else:
+ return None
+
+
#
=============================================================================
# Basic class
#
=============================================================================
! class geasClass(geasMetaObject):
#
---------------------------------------------------------------------------
# Initalize
#
---------------------------------------------------------------------------
! def __init__ (self, OID, parent_OID):
self._OID = OID
self._parent_OID = parent_OID
self._classAttribs = {}
self._classMethods = {}
self._instanceAttribs = {}
self._instanceMethods = {}
#
---------------------------------------------------------------------------
# Get the OID of the object from which this is an instance, or
***************
*** 69,76 ****
pass
def newInstance(self):
! #OID=getNewOID()
! OID=134
# create an instance of the python class
instance=self._pythonclass(OID,self._OID)
--- 127,138 ----
pass
def newInstance(self):
! # get new OID
! OID=getNewOID()
!
! if self._pythonclass==None:
! self.createPythonClass()
!
# create an instance of the python class
instance=self._pythonclass(OID,self._OID)
***************
*** 91,96 ****
--- 153,162 ----
OID=data.getField("_OID")
# create an instance of the python class
+
+ if self._pythonclass==None:
+ self.createPythonClass()
+
instance=self._pythonclass(OID,self._OID)
# add instance attributs
***************
*** 111,117 ****
--- 177,188 ----
def storeInstance(self, instance):
pass
+ def getChildByOID(self,OID):
+
+
def getAllInstances(self):
+
+ # list has to check for any new still uncommited instances too
try:
list = geasList.geasList(self,self._classAttribs["_tablename"])
except KeyError:
***************
*** 120,163 ****
list.setPrefetch (self._instanceAttribs.keys())
list.setConditions ([])
! self._connections=self._GEDI._connections
list.populate ()
return list
! def loadObjectDefinition(self):
# to make it easy we use one table for every attributs at
# the moment. later there will be one table for every datatype
# i.e. byte, string, array ....
! prefetch = ["goid", "name", "type", "value"]
! tablename = "geas_meta_object"
!
! data=self._GEDI.getObjectData(self._OID,tablename,prefetch)
! for record in data:
! type=record["type"]
! name=record["name"]
! value=record["value"]
! # print "READ %s <%s> = %s" % (name,type,value)
! if type=="string":
! if (value==""):
! self._instanceAttribs[name]=""
! else:
! self._classAttribs[name]=value
! elif type=="function":
! m=GEMA.geasPythonMethod(132,self._OID,value)
! self._instanceMethods[name]=m
! #self._classMethods[name]=m
!
! elif type=="object":
! o=getMetaObject(value)
! if (value==""):
! self._instanceAttribs[name]=""
! else:
! self._classAttribs[name]=o
# create an class object in python and add the
# class methods and attributs
--- 191,231 ----
list.setPrefetch (self._instanceAttribs.keys())
list.setConditions ([])
! parent=getObject(self._parent_OID)
! self._connections=parent._datasource._connections
! self._database='gnue'
list.populate ()
return list
! def addAttribute(self,name,type,value):
# to make it easy we use one table for every attributs at
# the moment. later there will be one table for every datatype
# i.e. byte, string, array ....
! # print "READ %s <%s> = %s" % (name,type,value)
! if type=="string":
! if (value==""):
! self._instanceAttribs[name]=""
! else:
! self._classAttribs[name]=value
! elif type=="function":
! m=GEMA.geasPythonMethod(132,self._OID,value)
! self._instanceMethods[name]=m
! #self._classMethods[name]=m
!
! elif type=="object":
! o=getMetaObject(value)
! if (value==""):
! self._instanceAttribs[name]=""
! else:
! self._classAttribs[name]=o
! self._pythonclass=None
+ def createPythonClass(self):
+
# create an class object in python and add the
# class methods and attributs
Index: gnue/appserver/src/_featuretest/geasNameSpace.py
diff -c gnue/appserver/src/_featuretest/geasNameSpace.py:1.1
gnue/appserver/src/_featuretest/geasNameSpace.py:1.2
*** gnue/appserver/src/_featuretest/geasNameSpace.py:1.1 Mon May 13
18:34:11 2002
--- gnue/appserver/src/_featuretest/geasNameSpace.py Wed Jun 19 09:15:46 2002
***************
*** 19,28 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasNameSpace.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
from gnue.common import GDebug
import geasObject
class Error(StandardError):
# Base exception
--- 19,29 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasNameSpace.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
from gnue.common import GDebug
import geasObject
+ import geasMetaObject
class Error(StandardError):
# Base exception
***************
*** 39,64 ****
# Initalize
#
---------------------------------------------------------------------------
! def __init__ (self, OID, parent_OID, GEOR, GEDI=None):
self._OID = OID
self._parent_OID = parent_OID
! self._storageAdapter = None
! self._nameSpace={}
! self._GEOR=GEOR
! if GEDI!=None:
! self._GEDI=GEDI
! self.loadNameSpace()
!
! def loadNameSpace(self):
! prefetch = ["goid", "name", "ref_OID"]
! tablename = "geas_name_space"
!
! data=self._GEDI.getObjectData(self._OID,tablename,prefetch)
!
! for record in data:
! self.registerObject(record["name"],record["ref_OID"])
!
def registerObject(self,name,OID):
self._nameSpace[name]=OID
def getOIDofObject(self,name):
--- 40,52 ----
# Initalize
#
---------------------------------------------------------------------------
! def __init__ (self, OID, parent_OID):
self._OID = OID
self._parent_OID = parent_OID
! self._nameSpace={}
!
def registerObject(self,name,OID):
+ # print "Namespace (OID=%s): Registering %s->%s" % (self._OID,name,OID)
self._nameSpace[name]=OID
def getOIDofObject(self,name):
***************
*** 73,79 ****
return self.__dict__[attr]
except KeyError:
OID=self._nameSpace[attr]
! o=self._GEOR.getObjectByOID(OID)
return o
except KeyError, mesg:
--- 61,68 ----
return self.__dict__[attr]
except KeyError:
OID=self._nameSpace[attr]
! ## access the global function defined by geasObjectServer
! o=getObject(OID)
return o
except KeyError, mesg:
Index: gnue/appserver/src/_featuretest/geasObject.py
diff -c gnue/appserver/src/_featuretest/geasObject.py:1.2
gnue/appserver/src/_featuretest/geasObject.py:1.3
*** gnue/appserver/src/_featuretest/geasObject.py:1.2 Tue May 14 13:21:33 2002
--- gnue/appserver/src/_featuretest/geasObject.py Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasObject.py,v 1.2 2002/05/14 17:21:33 siesel Exp $
from gnue.common import GDebug
import copy
--- 19,25 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasObject.py,v 1.3 2002/06/19 13:15:46 siesel Exp $
from gnue.common import GDebug
import copy
***************
*** 210,213 ****
--- 210,217 ----
def setLifeTimeType(self,type):
self._lifeTimeType=type
+
+ def __setattr__(self,attr,value):
+ self.__dict__["_dirty"]=1
+ self.__dict__[attr]=value
Index: gnue/appserver/src/_featuretest/geasSession.py
diff -c gnue/appserver/src/_featuretest/geasSession.py:1.1
gnue/appserver/src/_featuretest/geasSession.py:1.2
*** gnue/appserver/src/_featuretest/geasSession.py:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/geasSession.py Wed Jun 19 09:15:46 2002
***************
*** 19,44 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasSession.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
import geasList
#
=============================================================================
# Session class
#
=============================================================================
class geasSession:
def __init__ (self, connections):
self.loggedIn = 0
self._connections = connections
def login (self, user, password):
# This username/password is for the Application Server, not for the
! # database.
! self.loggedIn = 1
def logout (self):
self.loggedIn = 0
def createList (self, classname):
! return geasList.geasList (self, classname)
--- 19,118 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasSession.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
import geasList
+ import geasAuthentification
#
=============================================================================
# Session class
#
=============================================================================
class geasSession:
+
+ #
---------------------------------------------------------------------------
+ # Initalize
+ #
---------------------------------------------------------------------------
+
def __init__ (self, connections):
self.loggedIn = 0
+ self._user = ""
self._connections = connections
+ self._database = "gnue"
+ self._activelists = []
+ self._authAdapter = geasAuthentification.geasAuthAgent()
+ self._namespace = None
+
+ #
---------------------------------------------------------------------------
+ # Log into the application server
+ #
---------------------------------------------------------------------------
def login (self, user, password):
# This username/password is for the Application Server, not for the
! # database.
! self._user = user
! self.loggedIn = self._authAdapter.authentificate(self, user,
! {'password':password} )
! return self.loggedIn
!
! #
---------------------------------------------------------------------------
! # Logout from the application server
! #
---------------------------------------------------------------------------
def logout (self):
+ # should the authAdapter be contacted?
self.loggedIn = 0
+ #
---------------------------------------------------------------------------
+ # Create a new list of business objects of a given class
+ #
---------------------------------------------------------------------------
+
def createList (self, classname):
!
! # check if user has access rights for this list
! if self._authAdapter.hasAccess (self, self._user, classname):
!
! # create new List
! newlist=geasList.geasList (self, classname)
! # every new list will be added to the _activelists list
! # which will be parsed for commit and rollback actions
! self._activelists.append(newlist)
! return newlist;
!
! else: # no access
! return None
!
! #
---------------------------------------------------------------------------
! # Commit the active transaction
! #
---------------------------------------------------------------------------
!
! def commit (self):
! for l in self._activelists:
! l._resultset.post()
! l._datasource.commit()
!
! #
---------------------------------------------------------------------------
! # Rollback the active transaction
! #
---------------------------------------------------------------------------
!
! def rollback (self):
! for l in self._activelists:
! if hasattr(l,"_datasource"):
! l._datasource.rollback()
!
! #
---------------------------------------------------------------------------
! # Set Namespace
! #
---------------------------------------------------------------------------
!
! def setNamespace(self,ns):
! self._namespace=ns
!
! #
---------------------------------------------------------------------------
! # Access Namespace
! #
---------------------------------------------------------------------------
!
! def __getattr__(self,attr):
! if self.__dict__.has_key(attr):
! return self.__dict__[attr]
! else:
! return getattr(self._namespace,attr)
Index: gnue/appserver/src/_featuretest/geasSuperObject.py
diff -c gnue/appserver/src/_featuretest/geasSuperObject.py:1.1
gnue/appserver/src/_featuretest/geasSuperObject.py:1.2
*** gnue/appserver/src/_featuretest/geasSuperObject.py:1.1 Mon May 13
18:34:11 2002
--- gnue/appserver/src/_featuretest/geasSuperObject.py Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasSuperObject.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
from gnue.common import GDataSource
import geasObject
--- 19,25 ----
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
! # $Id: geasSuperObject.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
from gnue.common import GDataSource
import geasObject
***************
*** 32,38 ****
# super object class
#
=============================================================================
! class geasSuperObject(geasObject.geasObject):
#
---------------------------------------------------------------------------
# Initalize
--- 32,38 ----
# super object class
#
=============================================================================
! class geasSuperObject(geasMetaObject.geasMetaObject):
#
---------------------------------------------------------------------------
# Initalize
***************
*** 61,66 ****
--- 61,69 ----
return ns
def getObjectByOID(self,GOID):
+ # 1. check OID lookup cache (if OID in cache, go directly to datasource X)
+ # 2. check Datastore a,b,c,d, until OID is found
+ # 3. write OID into datasource lookup cache
return geasMetaObject.geasMetaObject(GOID,self._OID,self._datastore)
def loadMetaObject(self,GOID):
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/appserver/src/_featuretest GEDI.py GEMA.py...,
Jan Ischebeck <=