from BackupItemBase import *

class BackupItemDbPgsql(BackupItemBase):
	
	def __init__(self, backupBaseDirPath, archiveName):
		"""
		Can pass it either a set of arguments as shown above or an array (which is then taken to be the arguments in array form).
		Allow for arrays so that can easily parse from config files. Also allow dbType to be given either as enum from this class or as string such as 'pg', 'mysql'
		"""
		self._backupBaseDirPath = backupBaseDirPath
		self._archiveName = archiveName
		# do in reverse order to set default values first
		self._dbName = "__all__"
		self._username = ""
	
	def setDbName(self, dbName):
		self._dbName = dbName
	
	def setUserName(self, userName):
		self._username = userName
	
	def doBackup(self):
		"""
		May be a single or multiple db.
		"""
		backupCmd = "pg_dump"
		if self._dbName == "__all__":
			backupCmd = "pg_dumpall"
		else:
			backupCmd += " " + self._dbName
		
		if self._username != "":
			# assume using ident auth and have to work using that
			# backupCmd += " --user " + self._userName
			backupCmd = "sudo -u " + self._username + " " + backupCmd
		backupCmd += " --inserts"
		
		# add compression
		backupCmd += " | gzip "
		
		destArchivePath = os.path.join(self._backupBaseDirPath, self._archiveName + ".sql.gz")
		backupCmd += " > " +  destArchivePath
		# run command using base class wrapper
		self.runCommand(backupCmd)


class BackupItemDbMysql(BackupItemBase):
	
	def __init__(self, backupBaseDirPath, archiveName):
		"""
		Can pass it either a set of arguments as shown above or an array (which is then taken to be the arguments in array form).
		Allow for arrays so that can easily parse from config files. Also allow dbType to be given either as enum from this class or as string such as 'pg', 'mysql'
		"""
		self._backupBaseDirPath = backupBaseDirPath
		self._archiveName = archiveName
		# do in reverse order to set default values first
		self._dbName = "__all__"
		self._username = ""
		self._password = ""
	
	def setDbName(self, dbName):
		self._dbName = dbName
	
	def setUserName(self, userName):
		self._username = userName
	
	def setPassword(self, password):
		self._password = password
	
	def doBackup(self):
		"""
		May be a single or multiple db.
		"""
		backupCmd = "mysqldump"
		if self._username != "":
			backupCmd += " --user " + self._username
		if self._password != "":
			backupCmd += " --password=" + self._password
		if self._dbName == "__all__":
			backupCmd += " --all-databases"
		else:
			backupCmd += " " + self._dbName
		
		backupCmd += " | gzip "
		destArchivePath = os.path.join(self._backupBaseDirPath, self._archiveName + ".sql.gz")
		backupCmd += " > " +  destArchivePath
		
		# run command using base class wrapper
		self.runCommand(backupCmd)

