def trac_db_query(env): """ Context manager to handle database connection and cursor from trac environment's read only connection. This does not attempt to roll back or commit, the connection is meant only for accessing the data. For examples on use, see db_query(). Internally, this uses Trac's connection pool via the Trac DatabaseManager class :param Environment env: The Trac environment """ conn = None cursor = None try: dm = DatabaseManager(env) conn = dm.get_connection() except Exception: env.log.exception( "Failed to get database connection from trac database manager") raise try: # NOTE: Trac's connection does not support alternative cursor types! cursor = conn.cursor() yield cursor except Exception: env.log.error("Failed to query database") raise finally: cursor.close() conn.close()
def _do_convert_db_in_place(self, dst_dburi): dbm = DatabaseManager(self.env) src_dburi = dbm.connection_uri if src_dburi == dst_dburi: printferr("Source database and destination database are same: %s", dst_dburi) return 1 env_path = mkdtemp(prefix='convert_db-', dir=os.path.dirname(self.env.path)) try: dst_env = self._create_env(env_path, dst_dburi) src_db = dbm.get_connection() dst_db = DatabaseManager(dst_env).get_connection() self._copy_tables(dst_env, src_db, dst_db, src_dburi, dst_dburi) del src_db del dst_db dst_env.shutdown() dst_env = None schema, params = parse_connection_uri(dst_dburi) if schema == 'sqlite': dbpath = os.path.join(self.env.path, params['path']) dbdir = os.path.dirname(dbpath) if not os.path.isdir(dbdir): os.makedirs(dbdir) shutil.copy(os.path.join(env_path, params['path']), dbpath) finally: shutil.rmtree(env_path) backup_config_file(self.env, '.convert_db-%d' % int(time.time())) self.config.set('trac', 'database', dst_dburi) self.config.save()
def trac_db_transaction(env): """ Context manager to handle database connection and cursor from trac environment's read / write connection. This handles automatic commits, rollbacks and connection closing. Internally, this uses Trac's connection pool via the Trac DatabaseManager class. This is because it would appear that to multiproject uses, Trac's with_transaction() is not sufficient. For examples of use, see db_transaction() :param Environment env: The Trac Environment in use. """ conn = None cursor = None try: dm = DatabaseManager(env) conn = dm.get_connection() except Exception: env.log.exception("Failed to get database connection from trac database manager") raise try: cursor = conn.cursor() yield cursor conn.commit() except Exception: env.log.error("Failed to perform transaction to database") conn.rollback() raise finally: cursor.close() conn.close()
def trac_db_query(env): """ Context manager to handle database connection and cursor from trac environment's read only connection. This does not attempt to roll back or commit, the connection is meant only for accessing the data. For examples on use, see db_query(). Internally, this uses Trac's connection pool via the Trac DatabaseManager class :param Environment env: The Trac environment """ conn = None cursor = None try: dm = DatabaseManager(env) conn = dm.get_connection() except Exception: env.log.exception("Failed to get database connection from trac database manager") raise try: # NOTE: Trac's connection does not support alternative cursor types! cursor = conn.cursor() yield cursor except Exception: env.log.error("Failed to query database") raise finally: cursor.close() conn.close()
def _max_bytes(self, cnx): if cnx is None: connector, args = DatabaseManager(self.env).get_connector() with closing(connector.get_connection(**args)) as cnx: charset = cnx.charset else: charset = cnx.charset return 4 if charset == 'utf8mb4' else 3
def _utf8_size(self, cnx): if cnx is None: connector, args = DatabaseManager(self.env).get_connector() cnx = connector.get_connection(**args) charset = cnx.charset cnx.close() else: charset = cnx.charset return 4 if charset == 'utf8mb4' else 3
def _do_convert_db_in_new_env(self, dst_dburi, env_path): try: os.rmdir(env_path) # remove directory if it's empty except OSError: pass if os.path.exists(env_path) or os.path.lexists(env_path): printferr("Cannot create Trac environment: %s: File exists", env_path) return 1 dst_env = self._create_env(env_path, dst_dburi) dbm = DatabaseManager(self.env) src_dburi = dbm.connection_uri src_db = dbm.get_connection() dst_db = DatabaseManager(dst_env).get_connection() self._copy_tables(dst_env, src_db, dst_db, src_dburi, dst_dburi) self._copy_directories(dst_env)
def trac_db_transaction(env): """ Context manager to handle database connection and cursor from trac environment's read / write connection. This handles automatic commits, rollbacks and connection closing. Internally, this uses Trac's connection pool via the Trac DatabaseManager class. This is because it would appear that to multiproject uses, Trac's with_transaction() is not sufficient. For examples of use, see db_transaction() :param Environment env: The Trac Environment in use. """ conn = None cursor = None try: dm = DatabaseManager(env) conn = dm.get_connection() except Exception: env.log.exception( "Failed to get database connection from trac database manager") raise try: cursor = conn.cursor() yield cursor conn.commit() except Exception: env.log.error("Failed to perform transaction to database") conn.rollback() raise finally: cursor.close() conn.close()