Ejemplo n.º 1
0
   def insert(self):
      """
      Einfuegen eines Datensatzes
      Die aktuellen Werte aus der Domain werden in
      die Datenbank geschrieben.

      HINT:
         vor dem Insert wird die Methode onInsert aufgerufen.
         Liefert diese False zurueck wird der Einfuegevorgang
         abgebrochen.

      @return  [True|Flase] das OK Kennzeichen
      """
      self.isOk = self.onInsert()
      if not self.isOk:
         return False

      values = list()

      tablename   = self.meta['tablename']

      self.lastsqlvalues = values

      if self.db.dbtype == self.db.DBTYPE_ORACLE:
         # Erzeugen Oracle spezialisertes Insert Statement
         from dbaccess.dboracle import DbOracle
         self.lastsql = DbOracle.giveInsert(tablename=tablename,fields=self.flds)

      elif self.db.dbtype == self.db.DBTYPE_MYSQL:
         from dbaccess.dbmysql import DbMySql

         self.createSqlParameter()

         self.lastsql = DbMySql.giveInsert(tablename=tablename,fields=self.flds,primarykey=self.getDbPK())
         self.lastsqlvalues = tuple(self.lastsqlvalues)

      else:
         # Herstellen einer Liste von Fragezeichen
         # fuer prepared statement
         self.createSqlParameter()
         fragezeichen = '?,' * len(self.flds)
         fragezeichen = fragezeichen[:-1]
         self.lastsql = 'insert into %(tablename)s (%(flds)s) values(%(fragezeichen)s)' % {
            'tablename':tablename,
            'flds':','.join(self.flds),
            'fragezeichen':fragezeichen}


      self.isOk = self.onWrite(mode=self.INSERT)
      if self.isOk:
         self.createSqlParameter()
         try:
            self.cursor.execute(self.lastsql,self.lastsqlvalues)
         except Exception,e:
            self.isOk = False
            self.errors.append("DB Fehler bei insert {0}".format(e))
Ejemplo n.º 2
0
   def update(self,usedFields=None,fill=None):
      """
      Veraendern des Datensatzes basieren auf den Inhalten der Domain
         HINT:
            vor dem Update wird die Methode onUpdate aufgerufen.
            Liefert diese False zurueck wird der Ueberschreibenvorgang
            abgebrochen.

            Der Methode kann eine Feldliste uebergeben werden.
            Ist diese deklariert, so werden nur die deklarierten Felder
            zum Update verwendet.

      @parma   usedFields
               + None      Alle Felder werden benutzt
               + list      Liste von Feldern
               + 'auto'    Attribute usedFields wird benutzt
                           dies ist praktisch, wenn vorher fromCgi
                           aufgerufen wurde.
      @return  [True|Flase] das OK Kennzeichen

      """
     
      self.isOk = self.onUpdate()
      if not self.isOk: return False

      self.isOk = self.onWrite(mode=self.UPDATE)
      if not self.isOk: return False
         
      flds = list()

      if usedFields is None:
         for fld in self.meta['fields'].keys():
            flds.append(fld)
      else:
         if usedFields == 'auto':
            flds = self.usedFields
         else:
            flds = usedFields
         
      # Included Flds
      flds += self.includeflds
               
      values = list()
      primkey     = self.getPK()

      # Sicherheitsabfrage:
      # Bei Update muss Primary Key Feld vorhanden sein.
      #
      if not primkey in flds:
         raise Exception('Bei update konnte der Primary Key "{0}" in Feldliste [{1}] nicht gefunden werden'.format(primkey,','.join(flds)))

      for fld in flds:
         if self.__dict__[fld] is None:
            values.append(None)
         else:
            values.append(self.__dict__[fld])

      tablename   = self.meta['tablename']
      values.append(self.__dict__[primkey])
      self.lastsqlvalues = values

      if self.db.dbtype == self.db.DBTYPE_ORACLE:
         
         # Erzeugen Oracle spezialisertes Update Statement
         from dbaccess.dboracle import DbOracle
         dbFlds = []
         self.lastsqlvalues = {}
         
         for fld in flds:
            dbFlds.append(self.getDbFieldName(fld))
            self.lastsqlvalues[self.getDbFieldName(fld)] = self.__dict__[fld]

         self.lastsql = DbOracle.giveUpdate(
             tablename=tablename,
             fields=dbFlds,
             primarykey=self.getDbPK()
             )

      elif self.db.dbtype == self.db.DBTYPE_MYSQL:
         # Erzeugen Mysql spezialisertes Insert Statement
         from dbaccess.dbmysql import DbMySql
         dbFlds = []
         self.lastsqlvalues = []
         for fld in flds:
            if fld != self.getPK():
               dbFlds.append(self.getDbFieldName(fld))
               self.lastsqlvalues.append(self.getValue(fld))
         self.lastsqlvalues.append(self.getValue(self.getPK()))

         self.lastsql = DbMySql.giveUpdate(
             tablename=tablename,
             fields=dbFlds,
             primarykey=self.getDbPK()
             )

      else:
         fragezeichen = '?,' * len(flds)
         fragezeichen = fragezeichen[:-1]

         fldList = list()

         for fld in flds:
            fldList.append('%(fld)s=?' % {'fld':self.getDbFieldName(fld)})
         self.lastsql = 'update %(tablename)s set %(flds)s where %(primkey)s = ?' % {
            'tablename':tablename,
            'flds':','.join(fldList),
            'primkey':self.getDbPK()
            }

      if self.isOk:
         try:
            self.cursor.execute(self.lastsql,self.lastsqlvalues)
         except Exception as e:
            self.isOk = False
            self.errors.append("DB Fehler bei update {0} sql: {1}".format(e,self.lastsql))

      return self.isOk
Ejemplo n.º 3
0
   def insert(self):
      """
      Einfuegen eines Datensatzes
      Die aktuellen Werte aus der Domain werden in
      die Datenbank geschrieben.

      HINT:
         vor dem Insert wird die Methode onInsert aufgerufen.
         Liefert diese False zurueck wird der Einfuegevorgang
         abgebrochen.

      @return  [True|Flase] das OK Kennzeichen
      """
      
      self.isOk = self.onInsert()
      if not self.isOk: return False

      self.isOk = self.onWrite(mode=self.INSERT)
      if not self.isOk: return False


      values = list()

      tablename   = self.meta['tablename']
      
      self.lastsqlvalues = values
      
      if self.db.dbtype == self.db.DBTYPE_ORACLE:
         # Erzeugen Oracle spezialisertes Insert Statement
         from dbaccess.dboracle import DbOracle         
         
         self.createSqlParameter()

         self.lastsql = DbOracle.giveInsert(tablename=tablename,fields=self.flds)
                  
      elif self.db.dbtype == self.db.DBTYPE_MYSQL:
         from dbaccess.dbmysql import DbMySql
         
         self.createSqlParameter()
         
         self.lastsql = DbMySql.giveInsert(tablename=tablename,fields=self.flds,primarykey=self.getDbPK())
         self.lastsqlvalues = tuple(self.lastsqlvalues)

      else:
         # Herstellen einer Liste von Fragezeichen
         # fuer prepared statement
         self.createSqlParameter()
         fragezeichen = '?,' * len(self.flds)
         fragezeichen = fragezeichen[:-1]
         self.lastsql = 'insert into %(tablename)s (%(flds)s) values(%(fragezeichen)s)' % {
            'tablename':tablename,
            'flds':','.join(self.flds),
            'fragezeichen':fragezeichen}


      if self.isOk:
         self.createSqlParameter()
         try:
            self.cursor.execute(self.lastsql,self.lastsqlvalues)
         except Exception as e:
            self.isOk = False
            self.errors.append("DB Fehler bei insert {0}".format(e))

      if self.isOk and self.db.dbtype == self.db.DBTYPE_SQLITE:
         sql = 'select seq from sqlite_sequence where name="{0}"'.format(tablename)
         self.cursor.execute(sql)
         next_record = self.cursor.fetchone()

         # Pruefen ob last Autoincrement erreichbar
         # ist wenn nicht wird None gespeichert.
         if next_record is None:
            self.lastAutoincrement = None
         else:
            self.lastAutoincrement = next_record[0]

      elif self.isOk and self.db.dbtype == self.db.DBTYPE_MYSQL:
         self.cursor.execute('SELECT last_insert_id();')
         next_record = self.cursor.fetchone()
         self.lastAutoincrement = next_record[0]
      else:
         self.lastAutoincrement = None

      return self.isOk
Ejemplo n.º 4
0
   def update(self,usedFields=None):
      """
      Veraendern des Datensatzes basieren auf den Inhalten der Domain
         HINT:
            vor dem Update wird die Methode onUpdate aufgerufen.
            Liefert diese False zurueck wird der Ueberschreibenvorgang
            abgebrochen.

            Der Methode kann eine Feldliste uebergeben werden.
            Ist diese deklariert, so werden nur die deklarierten Felder
            zum Update verwendet.

      @return  [True|Flase] das OK Kennzeichen

      """

      self.isOk = self.onUpdate()
      if not self.isOk:
         return False

      flds = list()

      if usedFields != None:
         flds = usedFields
      else:
         for fld in self.meta['fields'].keys():
            flds.append(fld)

      values = list()
      primkey     = self.getPK()

      # Sicherheitsabfrage:
      # Bei Update muss Primary Key Feld vorhanden sein.
      #
      if not primkey in flds:
         raise Exception('Bei update konnte der Primary Key "{0}" in Feldliste [{1}] nicht gefunden werden'.format(primkey,','.join(flds)))


      for fld in flds:
         if self.__dict__[fld] == None:
            values.append(None)
         else:
            values.append(self.__dict__[fld])

      tablename   = self.meta['tablename']
      values.append(self.__dict__[primkey])
      self.lastsqlvalues = values

      if self.db.dbtype == self.db.DBTYPE_ORACLE:
         # Erzeugen Oracle spezialisertes Update Statement
         from dbaccess.dboracle import DbOracle
         dbFlds = []
         self.lastsqlvalues = {}
         for fld in flds:
            dbFlds.append(self.getDbFieldName(fld))
            self.lastsqlvalues[self.getDbFieldName(fld)] = self.__dict__[fld]

         self.lastsql = DbOracle.giveUpdate(
             tablename=tablename,
             fields=dbFlds,
             primarykey=self.getDbPK()
             )

      elif self.db.dbtype == self.db.DBTYPE_MYSQL:
         # Erzeugen Oracle spezialisertes Insert Statement
         from dbaccess.dbmysql import DbMySql
         dbFlds = []
         self.lastsqlvalues = []
         for fld in flds:
            if fld != self.getPK():
               dbFlds.append(self.getDbFieldName(fld))
               self.lastsqlvalues.append(self.getValue(fld))
         self.lastsqlvalues.append(self.getValue(self.getPK()))

         self.lastsql = DbMySql.giveUpdate(
             tablename=tablename,
             fields=dbFlds,
             primarykey=self.getDbPK()
             )

      else:
         fragezeichen = '?,' * len(flds)
         fragezeichen = fragezeichen[:-1]

         fldList = list()

         for fld in flds:
            fldList.append('%(fld)s=?' % {'fld':self.getDbFieldName(fld)})
         self.lastsql = 'update %(tablename)s set %(flds)s where %(primkey)s = ?' % {
            'tablename':tablename,
            'flds':','.join(fldList),
            'primkey':self.getDbPK()
            }

      self.isOk = self.onWrite(mode=self.UPDATE)
      if self.isOk:
         try:
            self.cursor.execute(self.lastsql,self.lastsqlvalues)
         except Exception,e:
            self.isOk = False
            self.errors.append("DB Fehler bei update {0} sql: {1}".format(e,self.lastsql))