Există vreo bibliotecă / cadru pentru undo / redo modificări de rânduri, în baza de date?




Poate fi titlul meu nu este clar. Caut un fel de control al versiunilor pe tabelele bazei de date, cum ar fi repunere în discuție face pe fișiere, cum ar fi wiki nu.


Vreau să urmărească modificările jurnal. Vreau să extragă și a alerga dif în sens invers. (Undo ca un svn îmbinare -r 101: 100). Am putea avea nevoie de o căutare indexate în istorie.


Am citit „ [modelul de proiectare pentru Undo Engine](https://stackoverflow.com/questions/49755/design-pattern-for-undo-engine) “, dar este legat de „Mostrele“. Sunt ceva am putea reutiliza fără să reinventeze roata?


**EDIT:** 
De exemplu, tranzacțiile de cont bancar. Am coloana „echilibru“ (și altele) , actualizate în tabelul. un utilizator va găsi o greșeală de el 10 zile mai târziu, și el va dori să anuleze / derula înapoi tranzacția specifică, fără a schimba altele.


Cum pot face cu gratie in nivelul de aplicare?
Martin Fowler acoperă subiectul în [modele pentru lucruri care se schimba cu timpul](http://martinfowler.com/eaaDev/timeNarrative.html "Tipare pentru lucruri care se schimba cu timpul") . Încă modele și nu un cadru real , dar el prezintă exemple de date și cum să - l folosească.
Nu știu care versiune de [Drupal](/cat17) pe care o
conduceți, dar nu ar trebui să facă atât de mult o altă diferență
decât modulele disponibile pentru dvs.


Practic, [Drupal](/cat17) are un API de cache care
funcționează prin stocarea a ceea ce vrea să cache în DB în tabele
care încep cu `cache _` , folosind
`cache_set` și `cache_get` . În cazul în care
site-ul are o mulțime de trafic, adăugate deasupra capului de
lectură și scrie la DB poate aduce în jos. Aceste funcții vor
funcționa cu oricare dintre modulele de cache pe care le înlocuiți
cu cel original, de exemplu cu:


Pentru a veni peste acest lucru, puteți adăuga diverse module
pentru a modifica memoria cache, de exemplu, utilizând
**[memcache](https://drupal.org/project/memcache)** , pentru a stoca valorile
cache-ului în memorie, mai degrabă în DB. Totuși, va trebui să
configurați o instanță memcache pe server și apoi să o configurați
în settings.php, dar toate acestea sunt explicate în memoria
readme.


Există o șansă foarte bună ca site-ul să sufere din cauza
viziunilor de pe pagină. M-aș uita la punctele de vedere și să văd
dacă fac ceva care este foarte lent. Vizionările sunt întotdeauna
grele în DB. Poate doriți să treceți prin fiecare vizionare și să
modificați (sau chiar să activați) temporizările și setările
cache-ului.


S-ar putea să suferiți deoarece aveți foarte mulți utilizatori
conectați pe site și vor trece de o mulțime de memorie cache,
astfel încât să puteți încerca **[Modul
AuthCache](https://drupal.org/project/%20authcache)** , care vă permite să reglați fin cache-ul
blocurilor pentru utilizatorii conectați.


De asemenea, puteți efectua anumite căutări pentru site-uri cu
trafic ridicat și cache pentru drupal. Am găsit destul de multe
când am fost otimizing un site am fost de lucru cu ~ 100'000 de
vizitatori pe zi. În windows, puteți încerca acest program [http://www.nirsoft.net/utils/opened\_files\_view.html](https://www.nirsoft.net/utils/opened_files_view.html) pentru a afla procesul de manipulare fișier db. Încercați inchis acest program pentru a debloca baza de date


În Linux și macOS puteți face ceva similar, de exemplu, dacă fișierul este blocat de dezvoltare.db:



> 
> $ fuser de dezvoltare.db
> 
> 
> 


Aceasta comanda va va arata ce procesul este de blocare fișier:



> 
> > dezvoltare.db: 5430
> 
> 
> 


Doar ucide procesul...



> 
> kill -9 5430
> 
> 
> 


...Și a bazei de date va fi deblocat. Mai multe persoane interpretat greșit acest lucru ca pe o întrebare despre cum să **magazin** parolele într-o bază de date. Care este greșit. Este vorba despre modul de a stoca parola pe care vă permite să obțineți **pentru** la baza de date.


Soluția obișnuită este de a muta parola din codul sursă într-un fișier de configurare. Apoi se lasă administrarea și asigurarea că fișierul de configurare până la administratorii de sistem. Așa dezvoltatorii nu trebuie să știi nimic despre producția parole, și nu există nici o înregistrare de parolă în control la sursă. incearca aici:
http://www.imei.info/
si
http://www.numberingplans.com/? page=analysis⊂=imeinr
si
http://sndeep.info/en Am transmis întrebarea ta mai departe și ai mai jos răspunsul oficial, al cuiva din stafful Duolingo: 



> 
> ”On average, there are 2 forward challenges (en2ro) for 1 reverse challenge (ro2en). We are working on an optimization process of our lesson generation (with an algorithm), in order to give our users the best amount of each type of exercise, depending on which course they are taking.”
> 
> 
> Am'am avut succes folosind [Mockito](https://github.com/mockito/mockito).


Când am încercat să aflu JMock și EasyMock, am găsit o curbă de învățare pentru a fi un pic abrupt (deși poate că's doar eu).


Îmi place Mockito din cauza naturii sale simple si curate, sintaxa că am fost capabil să înțeleagă destul de repede. Minim sintaxa este conceput pentru a sprijini frecvente cazuri foarte bine, deși de câteva ori am nevoie să fac ceva mai complicat, am găsit ceea ce am vrut a fost susținută și ușor de înțeles.


Aici's o (prescurtată) exemplu de Mockito pagina de start:



```
import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
```

Nu't obține mult mai simplu decât asta.


Singurul dezavantaj major, care mă pot gândi este că nu o't bate joc de metode statice. Nr.


Aici sunt mai multe exemple de ce:


1. Cod șablon este imposibil de a scrie cu excepția caietul de sarcini,


șablon
void f( T k )
{
T x( k );
x.x();
}
Copiile ar putea arunca, parametrul care trece ar putea arunca, și `x()` s-ar putea arunca unele necunoscute excepție.


2. Excepție-caietul de sarcini tind să interzică extensibilitate.


virtual void open() throw( FileNotFound );


ar putea evolua în


virtual void open() throw( FileNotFound, SocketNotReady, InterprocessObjectNotImplemented, HardwareUnresponsive );


Ai putea chiar scrie ca


arunca( ... )


Primul nu este extensibil, cel de-al doilea este un proiect mult prea ambițios și cel de-al treilea este într-adevăr ceea ce vrei să spui, atunci când scrie funcții virtuale.


3. Cod moștenire


Atunci când scrie cod care se bazează pe o altă bibliotecă, nu't știu ce ar putea face atunci când ceva nu merge oribil greșit.


int lib\_f();


void g() throw( k\_too\_small\_exception )
{
int k = lib\_f();
dacă( k < 0 ) arunca k\_too\_small\_exception();
}


"g" se va termina, când lib\_f()`aruncă. Aceasta este (în cele mai multe cazuri), nu ceea ce vrei cu adevărat.`std::termina()` nu ar trebui să fie numit. Este întotdeauna mai bine să lăsați aplicația accident cu o excepție netratată, de la care puteți prelua un stack trace, decât la tăcere/violent muri.


4. Scrie cod care returnează erori comune și aruncă în ocazii excepționale.


Eroarea e = open( "bla.txt" );
if( e == FileNotFound )
MessageUser( "Fișier bla.txt nu a fost găsit" );
if( e == AccessDenied )
MessageUser( "nu a Reușit să deschidă bla.txt, pentru că nu ne't au citit drepturile ..." );
dacă( e != Succes )
MessageUser( "nu a Reușit din cauza la un alt eroare, codul de eroare = " + itoa( e ) );


încercați
{
std::vector k( 1000 );
// ...
}
a prinde( const bad\_alloc& b )
{
MessageUser( "de memorie, ieșirea procesului de" );
arunca;
}


Cu toate acestea, atunci când bibliotecă doar aruncă-ți de propriile excepții, puteți utiliza excepție caietul de sarcini a stat intenția ta. mai poti incerca o restaurare de sistem la o data anterioara. pentru cs :
cl\_dynamiccrosshair 0
pentru a schimba rama repede :
hud\_fastswich 0
si mai exista niste modele pe care le poti luade aici :http://download.freakz.ro/hltv\_models.rar
le bagi in folderul counter strike(unde ai ti joku)-csstrike-models(le bagin in foderul moedels si dai sa le inlocuiasaca pe cele vechi)
daca nu te descurci id yahoo messenge :cioncu\_ionut nu poti!  brd finance ifn este o institutie financiara nebancara iar brd-ul este o institutie financiara bancara.a nu se confunda una cu cealalta chiar daca au denumire aprox. asemanatoare!  probabil ca acel brd-net este pentru banca brd.

pana la finele anului trecut, brd finance ifn obisnuia sa trimita extrasele prin posta pentru acest an, nu stiu caci eu am incheiat-o cu ei.