Ответ на комментарий от ahamai
ahamai> когда с крупного узла запрашиваешь разом все эхи, он сильно задумываетсяРаз Шаос тут свой монстрокод кидал, могу и я свой кинуть (правда, это ещё не окончательный вариант, а в репе этого файла пока вообще нет и ещё долго не будет) чисто по обработке /u/e со стандартным слайсингом:
e { set erange [lrange $pathparts 3 end] if {[llength $erange] > 0} { set limit 0 set offset 0 set lastel [lindex $erange end] if {[string match *?:?* $lastel]} { # slice detected set sparts [split $lastel :] set offset [expr {int([lindex $sparts 0])}] set limit [expr {int([lindex $sparts 1])}] set erange [lrange $erange 0 end-1] } # validate the rest of the echo list set erange [lmap ename $erange {expr { [validecho $ename] ? $ename : [continue] }}] if {[llength $erange] > 0} { # recheck length after validation repdata $sock $ishttp [indexechos $dbfile $erange 1 $offset $limit] } else { reperror $sock $ishttp "invalid request" } } else { reperror $sock $ishttp "invalid request" } }Но это не самое интересное. Самое интересное — процедурка indexechos:
# echo indexer for /e and /u/e proc indexechos {dbfile echolist includenames offset limit} { set rdata {} set oquery {ORDER BY `id`} if {$limit > 0} { # trigger limiting logic only with positive limit value if {$offset >= 0} { # normal limiting flow append oquery " ASC LIMIT $offset,$limit" } else { set reallimit [expr {-$offset}] set realoffset [expr {$reallimit - $limit}] if {$realoffset >= 0} { append oquery " DESC LIMIT $realoffset,$reallimit" } else { # invalid limit, falling back to full query append oquery " ASC" } } } set query {SELECT CONCAT(`echoname`, ':', GROUP_CONCAT(`msgid`,'|' ORDER BY `id`)) AS `rowcat` FROM (} foreach echo $echolist { append query "SELECT * FROM (SELECT `id`, `msgid`, `echoname` FROM `msg` WHERE `echoname` = '$echo' $oquery) UNION ALL " } append query {SELECT NULL,NULL,NULL) GROUP BY `echoname` ORDER BY `echoname` ASC;} sqlite3 db $dbfile -readonly true db eval $query echorow { if {$echorow(rowcat) ne ""} { set eparts [split $echorow(rowcat) :] set ename [lindex $eparts 0] if {$ename ne ""} { if {$includenames > 0} { append rdata $ename \n } append rdata [join [split [lindex $eparts 1] "|"] \n] \n } } } db close return $rdata }Вот и с чего бы такой обработчик долго задумывался, если он все эхи (после валидации) в один проход запрашивает?
revoltech (2024-11-03 20:19:42)
[Ответить]