<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADatabase_report</id>
	<title>Module:Database report - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADatabase_report"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Database_report&amp;action=history"/>
	<updated>2026-06-13T06:31:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Database_report&amp;diff=471485&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Database_report&amp;diff=471485&amp;oldid=prev"/>
		<updated>2021-07-15T21:16:45Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function error(text)&lt;br /&gt;
	return '*' .. require('Module:Error').error{ text, tag = 'p' }&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
local function arr_contains(array, val)&lt;br /&gt;
    for _, value in ipairs(array) do&lt;br /&gt;
        if value == val then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function str_split(inputstr, sep)&lt;br /&gt;
    local t = {}&lt;br /&gt;
    for str in string.gmatch(inputstr, &amp;quot;([^&amp;quot;..sep..&amp;quot;]+)&amp;quot;) do&lt;br /&gt;
		table.insert(t, str)&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_integer(str) &lt;br /&gt;
	if str:match(&amp;quot;%D&amp;quot;) then &lt;br /&gt;
		return false&lt;br /&gt;
	end &lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
   return s:match(&amp;quot;^%s*(.-)%s*$&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Called from {{Database report}}&lt;br /&gt;
function p.check_syntax(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	-- check that required parameters are provided&lt;br /&gt;
	if not args.sql then&lt;br /&gt;
		return error('Invalid config: required parameter &amp;quot;sql&amp;quot; is missing')&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not args.row_template then&lt;br /&gt;
		if args.skip_table then &lt;br /&gt;
			return error('Invalid config: skip_table can only be used with row_template')&lt;br /&gt;
		end &lt;br /&gt;
		if args.header_template then &lt;br /&gt;
			return error('header_template can be used only when row_template is being used')&lt;br /&gt;
		end &lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	-- check for invalid parameters&lt;br /&gt;
	for param, _ in pairs(args) do&lt;br /&gt;
		if not arr_contains({&lt;br /&gt;
			'sql', 'wikilinks', 'excerpts', 'comments', 'widths', 'hide',&lt;br /&gt;
			'table_style', 'remove_underscores', 'autoupdate', 'pagination',&lt;br /&gt;
			'max_pages', 'frequency', 'row_template', 'skip_table', &lt;br /&gt;
			'header_template'&lt;br /&gt;
		}, param) then&lt;br /&gt;
			return error('Unknown parameter &amp;quot;' .. param .. '&amp;quot; used, ignoring')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- check wikilinks config&lt;br /&gt;
	if args.wikilinks then&lt;br /&gt;
		local configs = str_split(args.wikilinks, ',')&lt;br /&gt;
		for _, config in ipairs(configs) do&lt;br /&gt;
			local parts = str_split(trim(config), ':')&lt;br /&gt;
			local srcColNum = parts[1]&lt;br /&gt;
			if not is_integer(srcColNum) then&lt;br /&gt;
				return error('Invalid wikilink config: Non-numeral source column number: '..parts[1]..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
			local ns = parts[2]&lt;br /&gt;
			if ns and ns:match(&amp;quot;^c?%d+$&amp;quot;) == nil then &lt;br /&gt;
				return error('Invalid namespace number &amp;quot;'.. ns..'&amp;quot; in wikilinks parameter: refer to [[WP:NS]] for namespace numbers, or use &amp;quot;cN&amp;quot; to take namespace number from column number N')&lt;br /&gt;
			end &lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check excerpts config&lt;br /&gt;
	if args.excerpts then&lt;br /&gt;
		local configs = str_split(args.excerpts, ',')&lt;br /&gt;
		for _, config in ipairs(configs) do&lt;br /&gt;
			local parts = str_split(trim(config), ':')&lt;br /&gt;
			local srcColNum = parts[1]&lt;br /&gt;
			if not is_integer(srcColNum) then&lt;br /&gt;
				return error('Invalid excerpts config: Non-numeral source column number: '..parts[1]..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
			local dstColNum = parts[2]&lt;br /&gt;
			if dstColNum and not is_integer(dstColNum) then&lt;br /&gt;
				return error('Invalid excerpts config: Non-numeral destination column number: '..parts[2]..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
			local ns = parts[3]&lt;br /&gt;
			if ns and ns:match(&amp;quot;^c?%d+$&amp;quot;) == nil then &lt;br /&gt;
				return error('Invalid namespace number &amp;quot;'.. ns..'&amp;quot; in excerpts parameter: refer to [[WP:NS]] for namespace numbers, or use &amp;quot;cN&amp;quot; to take namespace number from column number N')&lt;br /&gt;
			end &lt;br /&gt;
			local charLimit = parts[4]&lt;br /&gt;
			if charLimit and not is_integer(charLimit) then &lt;br /&gt;
				return error('Invalid excerpts config: Non-numeral in charLimit: '..parts[4]..'. Will be ignored.')&lt;br /&gt;
			end &lt;br /&gt;
			local hardCharLimit = parts[5]&lt;br /&gt;
			if hardCharLimit and not is_integer(hardCharLimit) then &lt;br /&gt;
				return error('Invalid excerpts config: Non-numeral in hardCharLimit: '..parts[5]..'. Will be ignored.')&lt;br /&gt;
			end &lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check column numbers in widths param&lt;br /&gt;
	if args.widths then&lt;br /&gt;
		local configs = str_split(args.widths, ',')&lt;br /&gt;
		for _, config in ipairs(configs) do &lt;br /&gt;
			local parts = str_split(trim(config), ':')&lt;br /&gt;
			local column = parts[1]&lt;br /&gt;
			if not is_integer(column) then&lt;br /&gt;
				return error('Invalid widths config: Non-numeral column number: '..parts[1]..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- check numeric configs&lt;br /&gt;
	if args.comments then&lt;br /&gt;
		local columns = str_split(args.comments, ',')&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			if not is_integer(trim(column)) then&lt;br /&gt;
				return error('Invalid comments parameter: Non-numeral column number: '..column..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.remove_underscores then&lt;br /&gt;
		local columns = str_split(args.remove_underscores, ',')&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			if not is_integer(trim(column)) then&lt;br /&gt;
				return error('Invalid remove_underscores parameter: Non-numeral column number: '..column..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.hide then&lt;br /&gt;
		local columns = str_split(args.hide, ',')&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			if not is_integer(trim(column)) then&lt;br /&gt;
				return error('Invalid hide parameter: Non-numeral column number: '..column..'. Will be ignored.')&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.pagination and not is_integer(args.pagination) then &lt;br /&gt;
		return error('pagination should be an integer. Will be ignored.')&lt;br /&gt;
	end &lt;br /&gt;
	if args.max_pages and not is_integer(args.max_pages) then&lt;br /&gt;
		return error('max_pages should be an integer. Will be ignored.')&lt;br /&gt;
	end &lt;br /&gt;
	if args.frequency and not is_integer(args.frequency) then&lt;br /&gt;
		return error('frequency should be an integer. Will be ignored.')&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Called from {{Database report/footer}} and {{Database report/subpage}} &lt;br /&gt;
function p.navlinks(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	if args.page then&lt;br /&gt;
		local page = tonumber(args.page)&lt;br /&gt;
		local num_pages = tonumber(args.num_pages)&lt;br /&gt;
		&lt;br /&gt;
		local title = mw.title.getCurrentTitle()&lt;br /&gt;
		&lt;br /&gt;
		local nextPage = title.nsText..':'..title.baseText..'/'..(page + 1)&lt;br /&gt;
		local prevPage = title.nsText..':'..title.baseText..'/'..(page - 1)&lt;br /&gt;
		-- page 1 has no subpage name &lt;br /&gt;
		if page == 1 then &lt;br /&gt;
			nextPage = title.nsText..':'..title.text..'/2'&lt;br /&gt;
		elseif page == 2 then&lt;br /&gt;
			prevPage = title.nsText..':'..title.baseText &lt;br /&gt;
		end &lt;br /&gt;
		&lt;br /&gt;
		local prevPageText = '&amp;lt;&amp;lt; Previous page'&lt;br /&gt;
		local nextPageText = 'Next page &amp;gt;&amp;gt;'&lt;br /&gt;
		&lt;br /&gt;
		local prevPageLink = (page == 1 or page &amp;gt; num_pages + 1) and '&amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;'..prevPageText..'&amp;lt;/span&amp;gt;'&lt;br /&gt;
			or '[['..prevPage..'|'..prevPageText..']]'&lt;br /&gt;
		local nextPageLink = page &amp;gt;= num_pages and '&amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;'..nextPageText..'&amp;lt;/span&amp;gt;'&lt;br /&gt;
			or '[['..nextPage..'|'..nextPageText..']]'&lt;br /&gt;
		&lt;br /&gt;
		return prevPageLink..' || '..nextPageLink&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>