PDA

Pogčedajte punu verziju : recycle bin za CMS


ivanhoe
04. 07. 2007., 10:30
nesto se igram i hocu da dodam recycle bin u jedan moj CMS, odnosno da napravim foru da se sve sto se brise, ne obrise zaista, vec se samo prebaci negde, i da moze po potrebi da se uradi undelete... ovo se odnosi i na fajlove i na bazu..

Jeste radili nekad nesto slicno?

Imam neke nedoumice oko toga kako da implementiram celu stvar, recimo za fajlove da li :
a) "obrisane" fajlove pomeriti u specijalni direktorijum tako da relativna putanja u tom diru bude ista kao originalna u odnosu na web-root (npr. fajl /home/pera/www/foo/bar.jpg se nakon brisanja smesta u /home/pera/obrisano/foo/bar.jpg)

b) preimenovati "obrisane" fajlove u neko genericko ime u nekom dir-u, a u bazi pamtiti gde je taj fajl ranije bio (ovo je mocnije resenje jer postoji mogucnost da se sacuva vise fajlova istog imena i putanje..)

c) integrisati se u neki CVS

Takodje za recorde iz baze, da li da cuvam obrisane recorde u zasebnoj tabeli ili samo da ih markiram kao obrisane ?

Sta mislite?

Ilija Studen
04. 07. 2007., 10:47
Ne znam za fajlove (nisam baš mnogo razmišljao o tome).

No, novi activeCollab ima Trash. Sve se svodi na STATE flag. ENUM sa tri moguće vrednosti STATE_SPAM, STATE_DELETED i STATE_VISIBLE.

Kada se prikazuje Trash izlače samo objekte sa DELETED stanjem. Znači, ne pomeram objekte u drugu tabelu već sve držim u jednoj. Nisam se još bavio performansama ovog rešenja, ali ne vidim zašto bi pravio probleme ako nije u pitanju velika količina podataka...

zira
04. 07. 2007., 11:09
Ne znam kakva je interna organizacija tog CMS-a...
Sto se tice tabela, radim isto kao i Ilija, samo flegujem zapis kao obrisan, tj. da je u recycle bin-u.
Za fajlove, ako ih vec sve imas u bazi, mozes isto tako samo da ih flegujes u samoj bazi kao obrisane, nema potrebe da ih fizicki premjestas.
Fizicko brisanje zapisa i fajlova radis u trenutku kada neko odluci da ih obrise iz recycle bin-a.

ivanhoe
04. 07. 2007., 12:03
Za fajlove, ako ih vec sve imas u bazi, mozes isto tako samo da ih flegujes u samoj bazi kao obrisane, nema potrebe da ih fizicki premjestas.

moracu da ih pomeram, jer kad neko "obrise" fajl ocekuje da tom fajlu vise nece moci da se pristupi, a posto fajlove drzim na disku i pristupa im se direktno, onda moram da ih nekako sakrijem...

mozda samo uradim rename fajla..

Ilija Studen
04. 07. 2007., 12:06
Samo da vidim da li mi je logika ispravna - ako je u pitanju *nix dodavanje tačke na početak imena fajla će ga automatski označiti kao hidden i neće mu se više moći pristupiti preko web servera (direktnim kucanjem URL-a u address bar)?

Ivan
04. 07. 2007., 12:16
moracu da ih pomeram, jer kad neko "obrise" fajl ocekuje da tom fajlu vise nece moci da se pristupi, a posto fajlove drzim na disku i pristupa im se direktno, onda moram da ih nekako sakrijem...

mozda samo uradim rename fajla..

Mozes da radis rename, ali u slucaju da imas neki file manager onda ces morati da mu napravis logiku da ne cita fajlove sa tim i tim tagom (deo koji npr dodajes u postupku menjanja imena ili sl.). I/Ili mozda da radis neki .htaccess trik ali u slucaju gde ima mnogo fajlova moze se desiti do uzaludnog trosenja resursa ... !?

Dušan Dželebdžić
04. 07. 2007., 12:25
Možeš i da iskopiraš logiku koja se koristi u desktop OSovima, i koja već funkcioniše na milionima računara bez (puno) problema :)

Windows: Skriveni folder "Recycled", u njemu svi fajlovi koji su brisani, bez očuvanja strukture foldera i sa random karakterima umesto naziva fajla. U bazi se čuvaju originalni nazivi i lokacije fajlova

KDE/Gnome: Direktorijum .Trash (tačkica na početku označava skriveni dir). U principu isto kao na Windowsu, samo bez šifrovanja imena fajlova.

@Ilija: Tačka sakriva fajl, u zavisnosti od konfiguracije servera može da se desi da se ne prikaže u dir listingu, ali može da mu se pristupi direktno -- http://www.impetusdesign.com/.ilija.html

Ivan
04. 07. 2007., 13:02
I jedno i drugo resenje nije lose (mislim na premestanje ili rename), rename je po meni bolje u slucajevima kada nema ftp pristupa usera jer se skracuje postupak (ne mora se puno petljati po bazi, dovoljno je cuvanje samo putanje 'obrisanih' fajlova, ne mora da se premestaju fajlovi, itd ...).

degojs
05. 07. 2007., 06:25
Moraš da radiš rename u svakom slučaju i to tako da bude jedinstveno ime, ako hoćeš da čuvaš nekoliko različitih fajlova sa istim imenom.

1. imaš fajl sa imenom "abc.txt"
2. fajl se obriše (i možda premesti u neki RecylceBin folder)
3. imaš novi fajl sa istim imenom (na istom mestu gde je bio prethodni): "abc.txt"
4. fajl se obriše. Ako ga pomeriš u RecycleBin, a bez novog jedinstvenog imena, prepisaćeš onaj prvi "abc.txt" koji je već tamo.

Itd.

salebab
05. 07. 2007., 10:33
^ pa on svakako u bazi mora da cuva originalno ime fajla zbog restore. Znaci samo kada upisuje novi fajl proveri dal se u bazi nalazi takvo ime fajla.
Moj predlog je samo rename, recimo neki prefix fajlu npr "rb_" :)

Ilija Studen
05. 07. 2007., 10:35
Naravoučenije - ako trash nije a must - zaobiđi :)

Ivan
05. 07. 2007., 10:51
Btw, ako se odluci za rename onda moze cak i da ne koristi bazu uopste i to u slucaju da se svi fajlovi nalaze u jednom (ili par) foldera, tako sto ce ih razlikovati po nekom prefiksu ili sl ...

bojan_bozovic
05. 07. 2007., 12:11
Ivanhoe, premesti ih u dir koji nije dostupan (order deny,allow deny from all allow from example.com). Tako si olaksavas jer i celu stazu do fajla pamtis, ne moras pisati to u bazu.

@Ilija

Pa nije tesko - pitanje je samo da li stvarno treba (a u 99% slucajeva ne treba).

degojs
05. 07. 2007., 15:07
^ pa on svakako u bazi mora da cuva originalno ime fajla zbog restore. Znaci samo kada upisuje novi fajl proveri dal se u bazi nalazi takvo ime fajla.
Moj predlog je samo rename, recimo neki prefix fajlu npr "rb_" :)

Kako to rešava problem koji sam opisao?

Ne možeš da samo dodaš neki prefix npr. "rb_" i da to reši stvar. Šta ako obišeš fajl sa imenom "abc.txt" (postaje "rb_abc.txt") pa onda imaš novi fajl sa istim imenon "abc.txt" koji takođe obrišeš, itd.

U tom slučaju ti bi u "recycle bin" folderu dobio dva fajla sa istim imenom, oba "rb_abc.txt" što baš i nije moguće.

Mislim da je najjednostavnije rešenje:
1. sačuvati original ime fajla u bazi
2. fajl pomeriti u "recycle bin" folder i
3. promeniti mu ime da bude jednako vrednosti autoincrement polja iz 1.

Ivan
05. 07. 2007., 15:32
A jel moze npr da prefix bude 'rb' + timestamp ...

bojan_bozovic
05. 07. 2007., 15:34
ako fajlove ne cuva u bazi ne mora dirati bazu uopste. naravno, ne dodaje onda prefiks na ime fajla, vec samo prebacuje fajl u recycle bin uz puni path. npr. /slike/slika1.jpg postaje /trash/slike/slika1.jpg.

Zasto komplikujete?

degojs
05. 07. 2007., 16:10
Pa šta će se desiti kada, u tom tvom primeru, imaš novi fajl:

/slike/slika1.jpg

i fajl se briše. Pazi, u svom recycle binu već imaš /trash/slika/slika1.jpg.

Kako ćeš da imaš 2 ista fajla na istom mestu(/trash/slika/slika1.jpg)?

bojan_bozovic
05. 07. 2007., 16:14
A do toga moze doci i ako se koristi tvoj pristup jer je korisnik uploadovao drugi fajl sa istim imenom na istu lokaciju, zar ne?

U bazi, npr. imas fajl pod ID 3 koji pokazuje na /trash/3.deleted koji je nemoguce vratiti na /slike/slika1.jpg jer taj fajl postoji. A ako isti bude obrisan opet ces morati da korisnika upozoris da recycle bin vec sadrzi taj fajl, samo treba i petljanje sa bazom.

degojs
05. 07. 2007., 16:16
A jel moze npr da prefix bude 'rb' + timestamp ...

Pa, to ti je onda otprilike generisanje jedinstvenog imena, što sam odmah i napisao..

Nisam siguran da je timestamp dobro rešenje, morao bi čovek malo da vidi može li doći do konfliktne situacije - siguran sam da (bar teoretski) može, itd. Mislim da je bolje za ime koristiti nešto iz baze, neki brojač, za koji garantovano znaš da je jedinstven (ili ako OS ima funkciju da generiše unique ime, pa onda tako nešto..)

A može u bazi da samo drži brojač, pa da ga koristi kao prefix imena.. Mada, zašto ne staviti i original ime u bazu? Upite nad fajlovima u recycle binu onda može da radi nad tabelom.. itd.

degojs
05. 07. 2007., 16:18
A do toga moze doci i ako se koristi tvoj pristup jer je korisnik uploadovao drugi fajl sa istim imenom na istu lokaciju, zar ne?


Pa sad, da li ćeš da ih upozoravaš kada brišu ili kada vraćaju, da može doći do prepisivanja? Mislim da je logičnije da se upozorenje pojavljuje samo kod "restore" operacije..?

(A ivanhoe je verovatno već završio posao ovako ili onako :D)

bojan_bozovic
05. 07. 2007., 16:25
pri restore operaciji mozes onda imati dva ili vise fajlova koji su obrisani sa iste lokacije i imaju isto ime. A i pri prebacivanju u recycle bin slika1.jpg moze biti preimenovana u slika1-1.jpg i sl. ako taj fajl postoji u recycle binu kad se baza ne koristi. U tom slucaju korisnik moze npr. imati opciju da odabere sta ce biti vraceno iz recycle bina kad se koristi baza, a opet ne mozes koristiti originalno ime za sve.

Sada razmisljam, najbolje je resenje versioning onako kako je napravljen pod VMS/OpenVMS.

Fajl dobija timestamp/version sufiks, poput slika1-v1-15-06-2007.jpg

Ilija Studen
05. 07. 2007., 16:36
a u 99% slucajeva ne treba

To je kompletna poenta mog prethodnog posta. Ako ne treba (a uglavnom ne treba) zaobiđi i napravi nešto korisnije.

Ivan
05. 07. 2007., 16:58
Nisam siguran da je timestamp dobro rešenje, morao bi čovek malo da vidi može li doći do konfliktne situacije - siguran sam da (bar teoretski) može, itd. Mislim da je bolje za ime koristiti nešto iz baze, neki brojač, za koji garantovano znaš da je jedinstven (ili ako OS ima funkciju da generiše unique ime, pa onda tako nešto..)

Da, to se zove "race condition" ;) Nego to sam dao cisto kao primer ...

A može u bazi da samo drži brojač, pa da ga koristi kao prefix imena.. Mada, zašto ne staviti i original ime u bazu? Upite nad fajlovima u recycle binu onda može da radi nad tabelom.. itd.

Uvideli smo da postoji vise resenja, samo smo posle nastavili da razradjujemo ono bez koriscenja baze i eventualnog premestanja fajlova ...

ivanhoe
05. 07. 2007., 22:58
To je kompletna poenta mog prethodnog posta. Ako ne treba (a uglavnom ne treba) zaobiđi i napravi nešto korisnije.

undelete je opcija koja istina retko treba, ali jednom kad ti zatreba onda moze da bude zlata vredna...

Ilija Studen
05. 07. 2007., 23:10
Kao i pancir, ali ne vidim da je baš u modi ;) Ne napadam, samo hoću da kažem da je u NEKIM situacijama znatno pametnija odluka preskočiti neki feature i svoje vreme uložiti u nešto korisnije, nego ga dodati. Skroz teorijska priča pošto ne znam ništa o konkretnom slučaju na kom radiš...