#!/usr/bin/python
# -*- coding: utf-8 -*-
import svn.fs
import svn.core
import svn.repos
from StringIO import StringIO
class SvnManager(object):
def __init__(self):
self._repository_path = None
self._repository = None
self._fs = None
def set_repository(self, path):
self._repository_path = path
self._repository = svn.repos.open(path)
self._fs = svn.repos.fs(self._repository)
def get_last_revision(self):
return svn.fs.youngest_rev(self._fs)
def dump_repository(self):
dumpstream = StringIO()
feedbackstream = StringIO()
rev = self.get_last_revision()
svn.repos.dump_fs2(self._repository,
dumpstream,
feedbackstream,
0,
rev,
0,
0,
None)
self._dump = dumpstream.getvalue()
self._feedback = feedbackstream.getvalue()
#print self._feedback.count("* Dumped revision " + str(rev))
def save_dump(self, dump_name):
filename = open(dump_name, 'w')
filename.write(self._dump)
filename.flush()
filename.close()
if __name__ == '__main__':
repository = 'repository'
filename = 'filename'
svn_manager = SvnManager()
svn_manager.set_repository(repository)
svn_manager.dump_repository()
svn_manager.save_dump(filename)
mercoledì 22 dicembre 2010
Dump SVN
MySQL e sequenze
Premessa: MySQL non gestisce le sequenze. O meglio, MySQL ha un campo auto_increment, ma è possibile specificarne uno per tabella. Di fatto, MySQL non implementa una struttura di creazione, gestione e cancellazione delle sequenze indipendenti dalla tabella (quello che su altri database si ottiene con CREATE SEQUENCE e affini, per capirci). Per ovviare al problema, bisogna quindi emulare la gestione delle sequenze mediante l'uso di costrutti autodefiniti. Di seguito un esempio di come creare, gestire e cancellare le sequenze:
drop table sequences;
drop function create_seq;
drop function drop_seq;
drop function next_value;
drop function cur_value;
create table sequences(seq_name varchar(30),
seq_value integer,
seq_increment integer
)
engine=MyISAM;
delimiter //
create function create_seq(name varchar(30), inc integer)
returns integer
begin
declare exist integer;
select count(*) into exist from sequences where seq_name = name;
if exist = 0 then
insert into sequences(seq_name, seq_value, seq_increment)
values(name, 0, inc);
return 0;
else
return -1;
end if;
end
//
create function drop_seq(name varchar(30))
returns integer
begin
declare exist integer;
select count(*) into exist from sequences where seq_name = name;
if exist = 0 then
return -1;
else
delete from sequences where seq_name = name;
return 0;
end if;
end
//
create function next_value(name varchar(30))
returns integer
begin
declare exist integer;
declare cur_value integer;
declare new_value integer;
declare inc_value integer;
select count(*) into exist from sequences where seq_name = name;
if exist = 0 then
return -1;
else
select seq_value,
seq_increment
into cur_value,
inc_value
from sequences
where seq_name = name;
set new_value = cur_value + inc_value;
update sequences
set seq_value = new_value
where seq_name = name;
return new_value;
end if;
end
//
create function cur_value(name varchar(30))
returns integer
begin
declare exist integer;
declare cur_value integer;
select count(*) into exist from sequences where seq_name = name;
if exist = 0 then
return -1;
else
select seq_value
into cur_value
from sequences
where seq_name = name;
return cur_value;
end if;
end
//
delimiter ;
Il codice in precedenza, sfruttando il fatto che le transazioni su l'engine MyISAM non sono supportate (e, di conseguenza, tutte le operazioni sono, per usare un gergo tecnico, non atomiche), permette di ottenere un incremento sempre univoco, indipendentemente dalla sessione in cui ci si trova. Di seguito, un esempio di utilizzo:
-- Viene creata la sequenza TEST con un incremento di un valore per volta
select create_seq('test', 1);
-- Viene incrementato e riportato il nuovo valore della sequenza
select next_value('test');
-- Viene mostrato il valore corrente della sequenza
select cur_value('test');
-- Viene cancellata la sequenza
select drop_seq('test');
Manipolazione dati su LDAP
Il seguente script permette di modificare un indirizzo email in un albero LDAP:
#!/usr/bin/python
import ldap
server = "ldap://localhost"
base_dn = "dc=domain,dc=net"
user_admin = ["cn=admin", "xxx"]
search_filter = "objectClass=person"
attributes = ["mail"]
search_scope = ldap.SCOPE_SUBTREE
mod_attribute = ldap.MOD_REPLACE
counter = 0
try:
# Apertura della connessione con server LDAP e successiva
# autenticazione come admin
con = ldap.initialize(server)
con.protocol_version = ldap.VERSION3
con.simple_bind_s(",".join([user_admin[0], base_dn]),
user_admin[1])
# Estrazione dei dati da modificare
result_set = con.search_s(",".join(["ou=Users", base_dn]),
search_scope, search_filter,
attributes)
# Iterazione dei risultati estratti
for item in result_set:
if not item[1] == {}:
# Verifica che il dato estratto sia quello da modificare
if item[1]["mail"][0].endswith("domain.net"):
counter += 1
fields = item[1]["mail"][0].split("@")
# Modifica della email dell'utente
print "Update email for " + item[0]
modify = [(mod_attribute, "mail",
"@".join([fields[0], "dominio.it"])
)]
con.modify_s(item[0], modify)
print "Updated " + str(counter) + " users"
except ldap.LDAPError, e:
print "Error"
print e