[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: query complicata con espressioni regolari



Scusate il top quoting.

Quello che subito non mi piace di questo script è che apri e chiudi troppe volte la 
connessione

Se ti tirassi fuori tutti i record in un CSV con una select unica logicamente simile a

select post_id, post_username, post_text from phpbb_posts

in cui concateni in modo opportuno i valori delle colonne in modo da avere un CSV 
valido, facessi la tua elaborazione creando un file contenente una serie di statement di 
update e alla fine processassi tutti gli statement con una sola invocazione del 
comando mysql, beh penso che con 400.000 record la differenza si dovrebbe sentire 
anche se mysql contatta il server su 127.0.0.0 o Unix pipe.

Poi arricchirei la query per vedere se riesco a trovare i post scritti dall'utente 
Pincopanco contenenti la stringa "[quote]Pincopanco". Le ricerche full text usualmente 
non sono il massimo della forza di un DB - rispetto ad altri tipi di match - ma mi pare 
che abbiano arricchito i DB di funzioni diverse da live fatte proprio per la ricerca di 
pattern nei clob.

Non mi piacciono tantissimo nemmeno i trigger. Io userei awk. Mi sa che te la cavi con 
meno processi.

Se però il testo del post contiene degli <EOL> casca il palco dei CSV che hanno un 
solo record per riga.

In quel caso mi ricupererei il sorgente dello script ad di Kernighan e Pike e vedrei di 
sfruttare quello - e magari le stored procedure di mysql - per fare una connessione al 
DB per leggere i dati ed una per scriverli.

Un ultima cosa. Lo script per cambiare le password, così come è, va bene se è solo se 
è uno shell script via invocato via riga di comando da te. Se lo dai anche in mano 
anche a me io per lo meno ti cancello tutte le password :) :) :) (no, certi atti vandalici 
gratuiti non hanno senso, per me non vale la pena perderci tempo). Dicono che ci 
siano cose chiamate sql injections :) :) :). E non avete idea di cosa può fare il più 
incapace degli script kid col comando sqlmap.

--
Gian Uberto "saint" Lauri
inviata da un tablet

> On 14 Feb 2015, at 02:30, MaX <maxlinux2000@gmail.com> wrote:
> 
> ok, mi riposnto da solo... ecco lo scrit funzionante... non ho ancora
> fatto le prove di carico... ma ad occhio 癡 rapido, per lo meno nei
> test
> 
> ----------------------
> 
> #!/bin/bash
> #exit
> source config.conf
> 
> max_post_id=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT MAX(post_id) AS post_id FROM
> phpbb_posts;"
> )
> #"
> max_post_id=$(echo $max_post_id | sed 's|^post_id ||')
> echo max_post_id=$max_post_id # numero da usare per il ciclo for o while
> 
> # solo per test test
> #max_post_id=$1
> 
> while [ $max_post_id -gt 0 ]; do  # ciclo while ecluso per test
>    post_username=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
> post_id= $max_post_id;")
>    post_username=$(echo $post_username | sed 's|^post_username ||')
>    echo "#######################################################################"
>    echo max_post_id=$max_post_id
>    echo post_username=$post_username
> 
>    post_text=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
> post_id
> = $max_post_id;")
>    post_text=$(echo $post_text | sed 's|^post_text ||')
> 
> #    echo $post_text
> 
>    Trigger=$(echo $post_text | sed 's|<br>|\n|g' | sed
> "s|\[quote\]$post_username&#44;\([0-9/]*\)&#44; \([0-9:]*\)\]|AA#AA|"
> | grep AA#AA)
> #    echo Trigger1=$Trigger
> 
>    if [ -z $Trigger ]; then
>        Trigger=$(echo $post_text | sed "s|Data originale: \([0-9-]*\)
> \([0-9:]*\),<br><br>\[quote:\([a-zA-Z0-9]*\)\]$post_username&#44;\([0-9/]*\)&#44;
> \([0-9:]*\)\]|AA#AA|I" | sed 's|<br>|\n|g'  | grep AA#AA )
> #        echo Trigger2=$Trigger
>    fi
>    if [ -z $Trigger ]; then
>        Trigger=$(echo $post_text | sed "s|Data originale: \([0-9-]*\)
> \([0-9:]*\),<br><br>\[quote\]$post_username&#44;\([0-9/]*\)&#44;
> \([0-9:]*\)\]|AA#AA|" | sed 's|<br>|\n|g' | grep AA#AA | uniq)
> #        echo Trigger3=$Trigger
>    fi
>    if [ $Trigger = "AA#AA" ] 2>/dev/null ; then
>        new_post_text=$(echo $post_text  | sed
> "s|\[quote:\([a-zA-Z0-9]*\)\]$post_username&#44;\([0-9/]*\)&#44;
> \([0-9:]*\)\]<br>||I" | sed 's|\"|\\"|g')
>        new_post_text=$(echo $new_post_text  | sed "s|Data originale:
> \([0-9-]*\) \([0-9:]*\),<br><br>\[quote\]$post_username&#44;\([0-9/]*\)&#44;
> \([0-9:]*\)\]<br>|Data Originale: \1 \2<br><br>|I" | sed 's|\"|\\"|g'
> )
>        new_post_text=$(echo $new_post_text  | sed "s|Data originale:
> \([0-9-]*\) \([0-9:]*\),<br><br>\[quote:\([a-zA-Z0-9]*\)\]$post_username&#44;\([0-9/]*\)&#44;
> \([0-9:]*\)\]|Data Originale: \1 \2<br>|I")
>        new_post_text=$(echo $new_post_text | sed
> 's|\[url-local:\([a-zA-Z0-9]*\)\]attachment/\([a-zA-Z0-9_#&%.;]*\)\[/url-local:\([a-zA-Z0-9]*\)\]||')
> #        echo $new_post_text
>       mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
> \"$max_post_id\""
>    else
>        echo "####################################
>        lascio inalterato"
>    fi
>    let max_post_id=max_post_id-1
> done
> 
> exit
> 
> ----------------------
> 
> ciao
> MaX
> 
> 2015-02-13 21:08 GMT+01:00, MaX <maxlinux2000@gmail.com>:
>> mmmm ho fatto alcune correzzioni a questa bozza.
>> Quello che mi scoccia 癡 che lavorando cos穩 va a aggiornare tutti i
>> post del database, sia che siano da modificare o meno.
>> Bisognerebbe trovare il modo per detectare che il post 癡 da moficicare
>> e poi mettere una condizione if
>> 
>> -----------------------
>> 
>> #!/bin/bash
>> source config.conf
>> 
>> max_post_id=$(mysql --database="$MYDB" --user=$USER
>> --password="$PASSWD" -e "SELECT MAX(post_id) AS post_id FROM
>> phpbb_posts;")
>> #"
>> max_post_id=$(echo $max_post_id | sed 's|^post_id ||')
>> echo max_post_id=$max_post_id # numero da usare per il ciclo for o while
>> 
>> # solo per test test
>> #post_id=100000
>> 
>> while [ $max_post_id = 0 ]; do  # ciclo while ecluso per test
>>    post_username=$(mysql --database="$MYDB" --user=$USER
>> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
>> post_id= $max_post_id;")
>>    post_username=$(echo $post_username | sed 's|^post_username ||')
>>    echo post_username=$post_username
>> 
>>    post_text=$(mysql --database="$MYDB" --user=$USER
>> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
>> post_id= $max_post_id;")
>>    post_text=$(echo $post_text | sed 's|^post_text ||')
>> 
>>    new_post_text=$(echo $post_text | sed
>> "s|\[quote:\([a-zA-Z0-9]*\)\]$post_username&#44;\([0-9/]*\)&#44;
>> \([0-9:]*\)\]<br>||I")
>>    echo $new_post_text
>>    mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
>> \"$max_post_id\""
>> 
>>    let max_post_id=max_post_id-1
>> done
>> 
>> exit
>> 
>> 
>> 
>> 
>> -----------------------
>> 
>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>> opss  rileggento ho visto un errore:
>>> 
>>> while [ $post_id = 0 ]; do  -->  while [ $max_post_id = 0 ]; do
>>> 
>>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>>> pensavo di fare una cosa del genere, ma si tratta di 400.000 post, e
>>>> non si se 癡 abbastanza veloce
>>>> 
>>>> --------------------------------------
>>>> source config.conf
>>>> 
>>>> post_id=$(mysql --database="$MYDB" --user=$USER --password="$PASSWD"
>>>> -e "SELECT MAX(post_id) AS post_id FROM phpbb_posts;")
>>>> 
>>>> max_post_id=$(echo $post_id | sed 's|^post_id ||')
>>>> #echo max_post_id=$max_post_id # numero da usare per il ciclo for o
>>>> while
>>>> 
>>>> while [ $post_id = 0 ]; do
>>>> 
>>>>    post_username=$(mysql --database="$MYDB" --user=$USER
>>>> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
>>>> post_id= $post_id;")
>>>>    post_username=$(echo $post_username | sed 's|^post_username ||')
>>>> #    echo post_username=$post_username
>>>> 
>>>>    post_text=$(mysql --database="$MYDB" --user=$USER
>>>> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
>>>> post_id= $post_id;")
>>>>    post_text=$(echo $post_text | sed 's|^post_text ||')
>>>> 
>>>>    new_post_text=$(echo $post_text | sed
>>>> "s|\[quote:3pjjad9s\]$post_username&#44;\([0-9/]*\)&#44;
>>>> \([0-9:]*\)\]<br>||I")
>>>> #    echo $new_post_text
>>>>    mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>>>> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
>>>> \"$post_id\""
>>>> 
>>>>    let post_id=post_id-1
>>>> done
>>>> --------------------------------------------
>>>> 
>>>> ...che ne dite?
>>>> MaX
>>>> 
>>>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>>>> ciao a tutti
>>>>> 
>>>>> avrei un problema con le espessioni regolari dentro ad una query mysql
>>>>> inglobata a sua volta in uno script  :)
>>>>> 
>>>>> chpass() {
>>>>> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>>>>> "UPDATE phpbb_users
>>>>> SET user_password = \"$HPPASS\" WHERE username = \"$PHPBB_USER\""
>>>>> }
>>>>> 
>>>>> questo sopra 癡 un esempio che uso per modificare via script la passwd
>>>>> di un utente in phpbb.
>>>>> 
>>>>> Ora per籀 vorrei cancellare una parte di testo dal campo "
>>>>> phpbb_posts/post_text" ma solo se dentro a questo testo appare:
>>>>> [quote]nome utente,20/7/2012, 19:54] e il nome utente coicide con il
>>>>> relativo campo " phpbb_posts/post_username"
>>>>> 
>>>>> Praticamente c' 癡 da cancellare la linea "[quote]Alfredo,20/7/2012,
>>>>> 19:54]" solo se nel campo  "post_username" il nome coincide con
>>>>> "Alfredo".
>>>>> 
>>>>> A complicare le cose... la data di fianco 癡 variabile, e il
>>>>> "[quote]Alfredo,20/7/2012, 19:54]"
>>>>> 癡 sempre nella seconda linea
>>>>> 
>>>>> Come se non bastasse, se nel messsaggio compare un
>>>>> "[quote]Alfredo,20/7/2012, 19:54]", ma nel "post_username" il nome 癡
>>>>> differente da "Alfredo", allora bisogna lasciarlo.
>>>>> 
>>>>> ..e naturalmente il resto del messaggio deve rimanere inalterato.
>>>>> 
>>>>> qualche idea?
>>>>> 
>>>>> io stavo pensando di estrarre il post_id,post_text,post_text con una
>>>>> query, fare le comparazioni con gli strumenti della shell linux,
>>>>> togliere eventualemente il testo e poi reimmettere il testo modificato
>>>>> usando come riferimento il post_id
>>>>> 
>>>>> o ci sono soluzioni migliori... e pi羅 rapide... interne a mysql?
>>>>> 
>>>>> ciao
>>>>> MaX
>>>> 
>>>> 
>>>> --
>>>> ciao,
>>>> MaX
>>> 
>>> 
>>> --
>>> ciao,
>>> MaX
>> 
>> 
>> --
>> ciao,
>> MaX
> 
> 
> -- 
> ciao,
> MaX
> 
> 
> -- 
> Per REVOCARE l'iscrizione alla lista, inviare un email a 
> debian-italian-REQUEST@lists.debian.org con oggetto "unsubscribe". Per
> problemi inviare un email in INGLESE a listmaster@lists.debian.org
> 
> To UNSUBSCRIBE, email to debian-italian-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> Archive: https://lists.debian.org/CAEyAVmth-AV+O9x0eBdZzRqv0ekuohx4S6rwsdfeyTAupg@mail.gmail.com
> 
> 


Reply to: