Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 01:29 24.04.24 
Компютри и Интернет
   >> Perl
Всички теми Следваща тема *Кратък преглед

Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема DESTROY i DBI.pmнови  
Автор Bruta ()
Публикувано15.09.02 22:00



Znachi plojenieto e slednoto. Pisha obekt za rabota s bazi danni koito izpolzva DBI.pm. kogato se syzdade pyrvi obekt, pravq konekciq s bazata danni. Ako sled tova se syzdade oshte edin obekt, ne pravq otdelna konekciq i za nego, ami izpolzvam syshtata koqto veche imam. vyv funkciqta DESTROY za moite obekti gledam dali obekta koito se unishtojava e posledniq. Ako e posledniq definiran obekt t.e. broqcha na broq na obektite mi e 0, izpylnqvam $dbh->disconnect(), ako ne e - dekrementiram broqcha na broq na obektite si i ne pravq nishto s $dbh. Problemyt e che kogato DBI useti che se namira v DESTROY sam se disconnectva, bez znachenie dali go iskam. Mislih si dali da ne si syzdam otdelna funkciq-destruktor za moite obekti, no ne iskam da pravq taka a da si izpolzvam DESTROY. Kak moga da izbegna tova koeto pravi DBI.pm. 10x



Тема Re: DESTROY i DBI.pmнови [re: Bruta]  
Авторedno momiche (Нерегистриран)
Публикувано16.09.02 03:17



"Note that Perl will automatically destroy database and statement handle objects if all references to them are deleted"



destroy iztriva connection reference handle-a ti($dbh). prestrukturirai si programata i obektite



Тема Re: DESTROY i DBI.pm [re: edno momiche]  
Автор Bruta ()
Публикувано16.09.02 12:06



Da, tova mi e qsno, chel sym dokumentaciqta. Vseki obekt si dyrji referenciq kym tozi dbh. Taka che dokato ne se unishtoji i posledniq moi obekt, vinagi imam pone edna referenciq kym $dbh.



Тема Re: DESTROY i DBI.pmнови [re: edno momiche]  
Автор Bruta ()
Публикувано16.09.02 12:18



edno momiche, izvinqvai:-)
beshe prava, greshkata si e moq. Sled pyrviq obekt drugite prisvoqvaha greshna referenciq i po tozi nachin kym $dbh imashe samo edna nezavisimo ot broq na obektite.



Тема Re: DESTROY i DBI.pmнови [re: edno momiche]  
Автор Bruta ()
Публикувано16.09.02 12:49



hm, pak stana interesno... Znachi napravil sym si da mi izpisva tochno koga se izpylnqva $dbh->disconnect(). Na pryv pogled izglejda dobre, izvyrsshva go tochno kogato trqbva. Obache kato trace-vam, DBI->trace(5), mnogo qsno se vijda che $dbh se disconnectva prinuditelno, izpisvaiki mi " Issuing rollback() fot database handle being DESTROY'd without explicit disconnect() during global destruction ", i to pri unishtojavaneto na pyrviq vlqzyl v DESTROY obekt, a moqt disconnect izobshto ne se izpylnqva.
E, na koe da vqrvam sega? na trace() ili na $dbh->disconnect() and print "Disconnected";



Тема Re: DESTROY i DBI.pmнови [re: Bruta]  
Авторedno momiche (Нерегистриран)
Публикувано17.09.02 06:36



bazata danni supportva li transactions? - ako da, setnat li e autocommit? kakvo praviat obektite ti s $dbh? ako praviat transakcii (da priemem che db-to gi supportva) - commitvash li gi?

mislia che neshto si omazal iako po koda, i ne razbiram kakvo tolkova pravish s destroy. ako pastenesh malko kod moje bi niakoi shte uspee da nameri greshkata

btw, error message-a ti idva ot:
"The database is automatically disconnected by the DESTROY method if still connected when there are no longer any references to the handle. The DESTROY method for each driver should implicitly call rollback to undo any uncommitted changes. This is vital behavior to ensure that incomplete transactions don't get committed simply because Perl calls DESTROY on every object before exiting. Also, do not rely on the order of object destruction during "global destruction", as it is undefined."



Тема Re: DESTROY i DBI.pmнови [re: Bruta]  
Авторedno momiche (Нерегистриран)
Публикувано17.09.02 06:49



prochetoh otnovo posta ti (iavno ne sum mu oburnala mnogo vnimania parvia put)

mislia che neshto ne ti e mnogo iasno/ili na men ne mi e iasno kakvo se opitvash da pravish/ : ne mojesh da slojesh counter i da go decrementvash podred vav destroy metod, i da ochakvash da raboti pravilno i podred. koga tochno destroy na daden obekt se izvikva ne e definirano - i ti prosto ne mojesh da znaesh - poradi koeto tvoite destruktori ne triabva da izvurshvat operacii koito razchitat na niakakav red na izvikvane, ili vreme na izvikvane, ili neshto podobno.

napravi si pool obekt koito da 'durji' state-a na tvoiata konekcia i izpolzvai nego vmesto global counter decrementvan ot destruktorite na obektitet ti. i ne zabraviai za commit-a

.edno momiche



Тема Re: DESTROY i DBI.pmнови [re: edno momiche]  
Автор Bruta ()
Публикувано17.09.02 13:27



Taka...
znachi v paketa imam nqkolko globalni za nego promenlivi. $population - tq broi kolko obekta imam syzdadeni. @objects - vseki element na masiva e referenciq kym nqkoi moi obekt po reda na syzdavaneto im.
Opciite s koito se svyrzvam kym bazara danni (MySQL) sa:

my $opt = { 'AutoCommit' => 1,
'PrintError' => 1,
'RaiseError' => 0 };

Ne izpolzvam tranzakcii.

Eto go i konstruktora:

sub new
{
my($pkg, $db, $user, $pass) = @_;
my($object);

if(!@objects) #ako nqma definirani drugi obekti
{
@_ == 4 or die 'Usage: db->new(database, user, password);';
my $dsn = 'dbi:mysql:'.$db.';mysql_socket=/tmp/mysql/mysql.sock';
($dbh = DBI->connect($dsn, $user, $pass, $opt)) or die $DBI::errstr;

$object->{dbh} = $dbh;
$object->{user} = $user;
$object->{pass} = $pass;
$object->{db} = $db;
$object->{id} = 0;

$population = 1; #inicializirame broqcha na obektite

push @objects, $object; #pyrviqt element na masiva sochi kym pyrviq obekt
}
else
{
$object->{dbh} = $dbh; #vzema syshtata referenciq kato pyrviq obekt
$object->{user} = $objects[0]->{user}; #i usera e syshtiq
$object->{pass} = $objects[0]->{pass};
$object->{db} = ($db or $objects[0]->{db}); #ako e podadena baza danni

push @objects, $object; #vzemame referenciqta kym obekta, i pri drugite

$object->{id} = $#objects; #id-to na tozi obekt e posledniq element na masiva
$population++; #incrementirame broq na obektite
}

return bless $object, $pkg;
}

nadqvam se che koda se razbira. shte dam malko dopylnitelni svedeniq za atributite.

$object{dbh} - stoinosta na tova e ravna na tazi na $dbh. crez nego izpylnqvam do(), fetch(), ...
{user} - usera s koito sym se svyrzal s bazata
{pass} - parolata
{db} - bazata danni v koqto shte raboti obekta
{id} - s tova znam tozi obekt koi pored mi e, i taka znam kyde v @objects se namira toi

samo pri syzdavaneto na pyrviq obekt iziskvam user i pass. Pri sledvashtite ne sa mi nujni tyi kato izpolzvam syshtata konekciq. Za vseki obekt moje da se zadade v koq baza danni da operira, predpolagam che usera ima prava za tova. Ako ne e zadadena, izpolzvam tazi na pyrviq obekt.

sega eto q i DESTROY:

sub DESTROY
{
# print "\nDESTROY\n";
my($self) = $_[0];

$population--; #dekrementiram broq na obektite
$objects[$self->{id}] = undef; #referenciq kym tozi obekt ne mi e nujna veche

# print "POPULATION: $population\n";
$dbh->disconnect() and print "\n\nDISCONNECT\n\n" if $population == 0; #i ako tova e posledniq mi obekt, disconnect
}

reshih da izpolzvam metoda s broene na obektite, poneje go vidqh v edna kniga...:-)

Tova koeto iskam e da znam che vryzkata mi s bazata danni shte se prekysne kogato veche nqmam aktivni moi obekti, a po kakyv nachin tochno shte e...

10x.

P.S. izvinqvam se za podredbata na koda, obache se premahvat intervalite...



Тема Re: DESTROY i DBI.pmнови [re: Bruta]  
Авторedno momiche (Нерегистриран)
Публикувано17.09.02 15:24



vzemi sloji skobi okolo
$dbh->disconnect() and print "\n\nDISCONNECT\n\n" if $population == 0
po princip kakto e napisano s 'and' bi triabvalo da se eval-va otliavo nadiasno no znae li chovek..

az lichno podobni izrazi gi pisha taka
($population == 0) && ($dbh->disconnect(), print "\n\nDISCONNECT\n\n" );

(niamat znachenie intervalite, no ako te drazni polzvai pre tagove - klubovete gi podurjat \[pre\] \[/pre\])

shte go probvam kato mi ostane malko vreme

sorry che ne pomognah mnogo
.edno momiche



Тема Re: DESTROY i DBI.pmнови [re: edno momiche]  
Автор Bruta ()
Публикувано17.09.02 16:35



Blagodarq.
($population == 0) && ($dbh->disconnect(), print "\n\nDISCONNECT\n\n" ); - neobichaen i interesen stil na pisane, ne sym sresthal takyv dosega




Страници по тази тема: 1 | 2 | >> (покажи всички)
Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.