Ver Fonte

전역 변수 폐지 후 SQLite in-memory DB로 이전

https://github.com/openNAMU/openNAMU/issues/2179
잉여개발기 (SPDV) há 2 anos atrás
pai
commit
5011252f69
4 ficheiros alterados com 204 adições e 174 exclusões
  1. 1 0
      .gitignore
  2. 8 8
      app.py
  3. 167 153
      route/tool/func.py
  4. 28 13
      route/tool/func_tool.py

+ 1 - 0
.gitignore

@@ -19,6 +19,7 @@ goorm.manifest
 *.db-shm
 *.db-wal
 *.db-journal
+file
 
 robots.txt
 custom.py

+ 8 - 8
app.py

@@ -16,8 +16,6 @@ with open('version.json', encoding = 'utf8') as file_data:
 
 # Init-DB
 data_db_set = class_check_json()
-
-db_data_get(data_db_set['type'])
 do_db_set(data_db_set)
 
 with get_db_connect() as conn:
@@ -62,9 +60,11 @@ with get_db_connect() as conn:
                 except:
                     pass
 
+                field_text = 'longtext' if data_db_set['type'] == 'mysql' else 'text'
+
                 if db_pass == 0:
                     try:
-                        curs.execute(db_change('create table ' + create_table + '(test longtext default (""))'))
+                        curs.execute(db_change('create table ' + create_table + '(test ' + field_text + ' default (""))'))
                         db_pass = 1
                     except Exception as e:
                         # print(e)
@@ -72,7 +72,7 @@ with get_db_connect() as conn:
 
                 if db_pass == 0:
                     try:
-                        curs.execute(db_change('create table ' + create_table + '(test longtext default "")'))
+                        curs.execute(db_change('create table ' + create_table + '(test ' + field_text + ' default "")'))
                         db_pass = 1
                     except Exception as e:
                         # print(e)
@@ -80,7 +80,7 @@ with get_db_connect() as conn:
 
                 if db_pass == 0:
                     try:
-                        curs.execute(db_change('create table ' + create_table + '(test longtext)'))
+                        curs.execute(db_change('create table ' + create_table + '(test ' + field_text + ')'))
                         db_pass = 1
                     except Exception as e:
                         # print(e)
@@ -88,7 +88,7 @@ with get_db_connect() as conn:
 
                 if db_pass == 0:
                     try:
-                        curs.execute(db_change("alter table " + create_table + " add column " + create + " longtext default ('')"))
+                        curs.execute(db_change("alter table " + create_table + " add column " + create + " " + field_text + " default ('')"))
                         db_pass = 1
                     except Exception as e:
                         # print(e)
@@ -96,7 +96,7 @@ with get_db_connect() as conn:
 
                 if db_pass == 0:
                     try:
-                        curs.execute(db_change("alter table " + create_table + " add column " + create + " longtext default ''"))
+                        curs.execute(db_change("alter table " + create_table + " add column " + create + " " + field_text + " default ''"))
                         db_pass = 1
                     except Exception as e:
                         # print(e)
@@ -104,7 +104,7 @@ with get_db_connect() as conn:
 
                 if db_pass == 0:
                     try:
-                        curs.execute(db_change("alter table " + create_table + " add column " + create + " longtext"))
+                        curs.execute(db_change("alter table " + create_table + " add column " + create + " " + field_text))
                         db_pass = 1
                     except Exception as e:
                         # print(e)

+ 167 - 153
route/tool/func.py

@@ -90,23 +90,24 @@ try:
 except:
     import pymysql
 
-import sqlite3
-
 if sys.version_info < (3, 6):
     import sha3
 
-# Init-Global
-global_lang = {}
-global_wiki_set = {}
-
-global_db_set = {}
-
 # Func
 # Func-main
 def do_db_set(db_set):
-    global global_db_set
+    with class_in_memory_db() as m_conn:
+        m_curs = m_conn.cursor()
+
+        m_curs.execute('drop table if exists temp')
+        m_curs.execute('create table if not exists temp(name text, data text)')
+
+        m_curs.execute('insert into temp (name, data) values ("db_set", ?)', [json.dumps(db_set)])
+        m_curs.execute('insert into temp (name, data) values ("db_set_type", ?)', [db_set['type']])
 
-    global_db_set = db_set
+        m_curs.execute('select data from temp where name = "db_set"')
+        db_data = m_curs.fetchall()
+        print(db_data)
     
 # Func-init
 def get_init_set_list(need = 'all'):
@@ -141,14 +142,14 @@ def get_init_set_list(need = 'all'):
         return init_set_list
     else:
         return init_set_list[need]
-
 class get_db_connect:
-    def __init__(self, db_type = ''):
-        global global_db_set
-        
-        self.db_set = global_db_set
-        if db_type != '':
-           self.db_set['type'] = db_type 
+    def __init__(self):
+        with class_in_memory_db() as m_conn:
+            m_curs = m_conn.cursor()
+
+            m_curs.execute('select data from temp where name = "db_set"')
+            db_data = m_curs.fetchall()
+            self.db_set = json.loads(db_data[0][0]) if db_data else {}
         
     def __enter__(self):
         if self.db_set['type'] == 'sqlite':
@@ -179,7 +180,6 @@ class get_db_connect:
         self.conn.close()
 
 # class get_whoosh_connect:
-    
 
 class class_check_json:
     def do_check_set_json(self):
@@ -641,38 +641,38 @@ def update(conn, ver_num, set_data):
     print('Update completed')
 
 def set_init_always(conn, ver_num):
-    global global_wiki_set
+    with class_in_memory_db() as m_conn:
+        m_curs = m_conn.cursor()
+        curs = conn.cursor()
 
-    curs = conn.cursor()
-
-    curs.execute(db_change('delete from other where name = "ver"'))
-    curs.execute(db_change('insert into other (name, data, coverage) values ("ver", ?, "")'), [ver_num])
-    
-    curs.execute(db_change('delete from alist where name = "owner"'))
-    curs.execute(db_change('insert into alist (name, acl) values ("owner", "owner")'))
+        curs.execute(db_change('delete from other where name = "ver"'))
+        curs.execute(db_change('insert into other (name, data, coverage) values ("ver", ?, "")'), [ver_num])
+        
+        curs.execute(db_change('delete from alist where name = "owner"'))
+        curs.execute(db_change('insert into alist (name, acl) values ("owner", "owner")'))
 
-    if not os.path.exists(load_image_url(conn)):
-        os.makedirs(load_image_url(conn))
+        if not os.path.exists(load_image_url(conn)):
+            os.makedirs(load_image_url(conn))
 
-    curs.execute(db_change('select data from other where name = "key"'))
-    if not curs.fetchall():
-        curs.execute(db_change('insert into other (name, data, coverage) values ("key", ?, "")'), [load_random_key()])
-        
-    curs.execute(db_change('select data from other where name = "salt_key"'))
-    if not curs.fetchall():
-        curs.execute(db_change('insert into other (name, data, coverage) values ("salt_key", ?, "")'), [load_random_key(4)])
+        curs.execute(db_change('select data from other where name = "key"'))
+        if not curs.fetchall():
+            curs.execute(db_change('insert into other (name, data, coverage) values ("key", ?, "")'), [load_random_key()])
+            
+        curs.execute(db_change('select data from other where name = "salt_key"'))
+        if not curs.fetchall():
+            curs.execute(db_change('insert into other (name, data, coverage) values ("salt_key", ?, "")'), [load_random_key(4)])
 
-    curs.execute(db_change('select data from other where name = "count_all_title"'))
-    if not curs.fetchall():
-        curs.execute(db_change('insert into other (name, data, coverage) values ("count_all_title", "0", "")'))
-        
-    curs.execute(db_change('select data from other where name = "wiki_access_password_need"'))
-    db_data = curs.fetchall()
-    if db_data and db_data[0][0] != '':
-        curs.execute(db_change('select data from other where name = "wiki_access_password"'))
+        curs.execute(db_change('select data from other where name = "count_all_title"'))
+        if not curs.fetchall():
+            curs.execute(db_change('insert into other (name, data, coverage) values ("count_all_title", "0", "")'))
+            
+        curs.execute(db_change('select data from other where name = "wiki_access_password_need"'))
         db_data = curs.fetchall()
-        if db_data:
-            global_wiki_set['wiki_access_password'] = db_data[0][0]
+        if db_data and db_data[0][0] != '':
+            curs.execute(db_change('select data from other where name = "wiki_access_password"'))
+            db_data = curs.fetchall()
+            if db_data:
+                m_curs.execute('insert into temp (name, data) values ("wiki_access_password", ?)', [db_data[0][0]])
     
 def set_init(conn):
     curs = conn.cursor()
@@ -979,62 +979,70 @@ def pw_check(conn, data, data2, type_d = 'no', id_d = ''):
 # Func-skin
 def easy_minify(conn, data, tool = None):
     # without_DB
-    if 'wiki_access_password' in global_wiki_set:
-        access_password = global_wiki_set['wiki_access_password']
-        input_password = flask.request.cookies.get('opennamu_wiki_access', ' ')
-        if url_pas(access_password) == input_password:
+    with class_in_memory_db() as m_conn:
+        m_curs = m_conn.cursor()
+        
+        m_curs.execute('select data from temp where name = "wiki_access_password"')
+        db_data = m_curs.fetchall()
+        if db_data:
+            access_password = db_data[0][0]
+            input_password = flask.request.cookies.get('opennamu_wiki_access', ' ')
+            if url_pas(access_password) == input_password:
+                return data
+                
+            return '''
+                <script defer src="/views/main_css/js/route/wiki_access_password.js''' + cache_v() + '''"></script>
+                <h2>''' + get_lang(conn, 'error_password_require_for_wiki_access') + '''</h2>
+                <input type="password" id="wiki_access">
+                <input type="submit" onclick="opennamu_do_wiki_access();">
+            '''
+        else:
             return data
-            
-        return '''
-            <script defer src="/views/main_css/js/route/wiki_access_password.js''' + cache_v() + '''"></script>
-            <h2>''' + get_lang(conn, 'error_password_require_for_wiki_access') + '''</h2>
-            <input type="password" id="wiki_access">
-            <input type="submit" onclick="opennamu_do_wiki_access();">
-        '''
-    else:
-        return data
 
 def get_lang(conn, data, safe = 0):
-    global global_lang
-
-    curs = conn.cursor()
+    with class_in_memory_db() as m_conn:
+        m_curs = m_conn.cursor()
+        curs = conn.cursor()
 
-    ip = ip_check()
-    if ip_or_user(ip) == 0:
-        curs.execute(db_change('select data from user_set where name = "lang" and id = ?'), [ip])
-        rep_data = curs.fetchall()                    
-    elif 'lang' in flask.session:
-        rep_data = [[flask.session['lang']]]
-    else:
-        curs.execute(db_change("select data from other where name = 'language'"))
-        rep_data = curs.fetchall()
+        ip = ip_check()
+        if ip_or_user(ip) == 0:
+            curs.execute(db_change('select data from user_set where name = "lang" and id = ?'), [ip])
+            rep_data = curs.fetchall()                    
+        elif 'lang' in flask.session:
+            rep_data = [[flask.session['lang']]]
+        else:
+            curs.execute(db_change("select data from other where name = 'language'"))
+            rep_data = curs.fetchall()
 
-    if not rep_data or rep_data[0][0] in ('', 'default'):
-        curs.execute(db_change("select data from other where name = 'language'"))
-        rep_data = curs.fetchall()
+        if not rep_data or rep_data[0][0] in ('', 'default'):
+            curs.execute(db_change("select data from other where name = 'language'"))
+            rep_data = curs.fetchall()
 
-    if rep_data:
-        lang_name = rep_data[0][0]
-    else:
-        lang_name = 'en-US'
-        
-    if lang_name in global_lang:
-        lang = global_lang[lang_name]
-    else:
-        lang_list = os.listdir('lang')
-        if (lang_name + '.json') in lang_list:
-            lang = json.loads(open(os.path.join('lang', lang_name + '.json'), encoding = 'utf8').read())
-            global_lang[lang_name] = lang
+        if rep_data:
+            lang_name = rep_data[0][0]
         else:
-            lang = {}
-
-    if data in lang:
-        if safe == 1:
-            return lang[data] 
+            lang_name = 'en-US'
+            
+        m_curs.execute('select data from temp where name = ?', ['lang_' + lang_name])
+        db_data = m_curs.fetchall()
+        if db_data:
+            lang = json.loads(db_data[0][0])
         else:
-            return html.escape(lang[data])
+            lang_list = os.listdir('lang')
+            if (lang_name + '.json') in lang_list:
+                lang = json.loads(open(os.path.join('lang', lang_name + '.json'), encoding = 'utf8').read())
+                
+                m_curs.execute('insert into temp (name, data) values (?, ?)', ['lang_' + lang_name, json.dumps(lang)])
+            else:
+                lang = {}
+
+        if data in lang:
+            if safe == 1:
+                return lang[data] 
+            else:
+                return html.escape(lang[data])
 
-    return html.escape(data + ' (' + lang_name + ')')
+        return html.escape(data + ' (' + lang_name + ')')
 
 # 하위 호환용
 def load_lang(data, safe = 0):
@@ -1079,66 +1087,71 @@ def cache_v():
     return '.cache_v258'
 
 def wiki_css(data):
-    global global_wiki_set
+    with class_in_memory_db() as m_conn:
+        m_curs = m_conn.cursor()
 
-    # without_DB
-    data += ['' for _ in range(0, 4 - len(data))]
-    
-    data_css = ''
-    data_css_dark = ''
+        # without_DB
+        data += ['' for _ in range(0, 4 - len(data))]
+        
+        data_css = ''
+        data_css_dark = ''
 
-    data_css_ver = cache_v()
+        data_css_ver = cache_v()
 
-    if 'main_css' in global_wiki_set:
-        data_css = global_wiki_set['main_css']
-    else:
-        data_css += '<meta http-equiv="Cache-Control" content="max-age=3600">'
+        m_curs.execute('select data from temp where name = "main_css"')
+        db_data = m_curs.fetchall()
+        if db_data:
+            data_css = db_data[0][0]
+        else:
+            data_css += '<meta http-equiv="Cache-Control" content="max-age=3600">'
 
-        # External JS
-        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js" integrity="sha512-LQNxIMR5rXv7o+b1l8+N1EZMfhG7iFZ9HhnbJkTp4zjNr5Wvst75AqUeFDxeRUa7l5vEDyUiAip//r+EFLLCyA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
-        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js" integrity="sha512-rdhY3cbXURo13l/WU9VlaRyaIYeJ/KBakckXIvJNAQde8DgpOmE+eZf7ha4vdqVjTtwQt69bD2wH2LXob/LB7Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
-        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/x86asm.min.js" integrity="sha512-HeAchnWb+wLjUb2njWKqEXNTDlcd1QcyOVxb+Mc9X0bWY0U5yNHiY5hTRUt/0twG8NEZn60P3jttqBvla/i2gA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
-        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.48.0/min/vs/loader.min.js" integrity="sha512-ZG31AN9z/CQD1YDDAK4RUAvogwbJHv6bHrumrnMLzdCrVu4HeAqrUX7Jsal/cbUwXGfaMUNmQU04tQ8XXl5Znw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
-        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>'
+            # External JS
+            data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js" integrity="sha512-LQNxIMR5rXv7o+b1l8+N1EZMfhG7iFZ9HhnbJkTp4zjNr5Wvst75AqUeFDxeRUa7l5vEDyUiAip//r+EFLLCyA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
+            data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js" integrity="sha512-rdhY3cbXURo13l/WU9VlaRyaIYeJ/KBakckXIvJNAQde8DgpOmE+eZf7ha4vdqVjTtwQt69bD2wH2LXob/LB7Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
+            data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/x86asm.min.js" integrity="sha512-HeAchnWb+wLjUb2njWKqEXNTDlcd1QcyOVxb+Mc9X0bWY0U5yNHiY5hTRUt/0twG8NEZn60P3jttqBvla/i2gA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
+            data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.48.0/min/vs/loader.min.js" integrity="sha512-ZG31AN9z/CQD1YDDAK4RUAvogwbJHv6bHrumrnMLzdCrVu4HeAqrUX7Jsal/cbUwXGfaMUNmQU04tQ8XXl5Znw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
+            data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>'
 
-        # Func JS
-        data_css += '<script defer src="/views/main_css/js/func/func.js' + data_css_ver + '"></script>'
-        
-        data_css += '<script defer src="/views/main_css/js/func/insert_version.js' + data_css_ver + '"></script>'
-        data_css += '<script defer src="/views/main_css/js/func/insert_user_info.js' + data_css_ver + '"></script>'
-        data_css += '<script defer src="/views/main_css/js/func/insert_version_skin.js' + data_css_ver + '"></script>'
-        data_css += '<script defer src="/views/main_css/js/func/insert_http_warning_text.js' + data_css_ver + '"></script>'
-        
-        data_css += '<script defer src="/views/main_css/js/func/ie_end_of_life.js' + data_css_ver + '"></script>'
-        data_css += '<script defer src="/views/main_css/js/func/shortcut.js' + data_css_ver + '"></script>'
-        data_css += '<script defer src="/views/main_css/js/func/editor.js' + data_css_ver + '"></script>'
-        data_css += '<script defer src="/views/main_css/js/func/render.js' + data_css_ver + '"></script>'
-        
-        # Main CSS
-        data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="/views/main_css/css/main.css' + data_css_ver + '">'
+            # Func JS
+            data_css += '<script defer src="/views/main_css/js/func/func.js' + data_css_ver + '"></script>'
+            
+            data_css += '<script defer src="/views/main_css/js/func/insert_version.js' + data_css_ver + '"></script>'
+            data_css += '<script defer src="/views/main_css/js/func/insert_user_info.js' + data_css_ver + '"></script>'
+            data_css += '<script defer src="/views/main_css/js/func/insert_version_skin.js' + data_css_ver + '"></script>'
+            data_css += '<script defer src="/views/main_css/js/func/insert_http_warning_text.js' + data_css_ver + '"></script>'
+            
+            data_css += '<script defer src="/views/main_css/js/func/ie_end_of_life.js' + data_css_ver + '"></script>'
+            data_css += '<script defer src="/views/main_css/js/func/shortcut.js' + data_css_ver + '"></script>'
+            data_css += '<script defer src="/views/main_css/js/func/editor.js' + data_css_ver + '"></script>'
+            data_css += '<script defer src="/views/main_css/js/func/render.js' + data_css_ver + '"></script>'
+            
+            # Main CSS
+            data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="/views/main_css/css/main.css' + data_css_ver + '">'
 
-        # External CSS
-        data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css" integrity="sha512-fHwaWebuwA7NSF5Qg/af4UeDx9XqUpYpOGgubo3yWu+b2IQR4UeQwbb42Ti7gVAjNtVoI/I9TEoYeu9omwcC6g==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
-        data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css" integrity="sha512-hasIneQUHlh06VNBe7f6ZcHmeRTLIaQWFd43YriJ0UND19bvYRauxthDg8E4eVNPm9bRUhr5JGeqH7FRFXQu5g==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
-        data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.41.0/min/vs/editor/editor.main.min.css" integrity="sha512-MFDhxgOYIqLdcYTXw7en/n5BshKoduTitYmX8TkQ+iJOGjrWusRi8+KmfZOrgaDrCjZSotH2d1U1e/Z1KT6nWw==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
+            # External CSS
+            data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css" integrity="sha512-fHwaWebuwA7NSF5Qg/af4UeDx9XqUpYpOGgubo3yWu+b2IQR4UeQwbb42Ti7gVAjNtVoI/I9TEoYeu9omwcC6g==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
+            data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css" integrity="sha512-hasIneQUHlh06VNBe7f6ZcHmeRTLIaQWFd43YriJ0UND19bvYRauxthDg8E4eVNPm9bRUhr5JGeqH7FRFXQu5g==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
+            data_css += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.41.0/min/vs/editor/editor.main.min.css" integrity="sha512-MFDhxgOYIqLdcYTXw7en/n5BshKoduTitYmX8TkQ+iJOGjrWusRi8+KmfZOrgaDrCjZSotH2d1U1e/Z1KT6nWw==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
 
-        global_wiki_set['main_css'] = data_css
+            m_curs.execute('insert into temp (name, data) values ("main_css", ?)', [data_css])
 
-    # Darkmode
-    if 'dark_main_css' in global_wiki_set:
-        data_css_dark = global_wiki_set['dark_main_css']
-    else:
-        # Main CSS
-        data_css_dark += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="/views/main_css/css/sub/dark.css' + data_css_ver + '">'
+        # Darkmode
+        m_curs.execute('select data from temp where name = "dark_main_css"')
+        db_data = m_curs.fetchall()
+        if db_data:
+            data_css_dark = db_data[0][0]
+        else:
+            # Main CSS
+            data_css_dark += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="/views/main_css/css/sub/dark.css' + data_css_ver + '">'
 
-        # External CSS
-        data_css_dark += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/dark.min.css" integrity="sha512-bfLTSZK4qMP/TWeS1XJAR/VDX0Uhe84nN5YmpKk5x8lMkV0D+LwbuxaJMYTPIV13FzEv4CUOhHoc+xZBDgG9QA==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
+            # External CSS
+            data_css_dark += '<link rel="preload" as="style" onload="this.onload=null;this.rel=\'stylesheet\'" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/dark.min.css" integrity="sha512-bfLTSZK4qMP/TWeS1XJAR/VDX0Uhe84nN5YmpKk5x8lMkV0D+LwbuxaJMYTPIV13FzEv4CUOhHoc+xZBDgG9QA==" crossorigin="anonymous" referrerpolicy="no-referrer" />'
 
-        global_wiki_set['dark_main_css'] = data_css_dark
+            m_curs.execute('insert into temp (name, data) values ("dark_main_css", ?)', [data_css_dark])
 
-    data = data[0:2] + ['', data_css] + data[2:3] + [data_css_dark] + data[3:]
+        data = data[0:2] + ['', data_css] + data[2:3] + [data_css_dark] + data[3:]
 
-    return data
+        return data
 
 def cut_100(data):
     return ''
@@ -1310,10 +1323,8 @@ def load_skin(conn, data = '', set_n = 0, default = 0):
     # default == 0 -> 디폴트 미포함
     # default == 1 -> 디폴트 포함
 
-    if set_n == 0:
-        skin_return_data = ''
-    else:
-        skin_return_data = []
+    skin_return_data = []
+    skin_return_data_str = ''
 
     skin_list_get = os.listdir('views')
     if default == 1:
@@ -1328,13 +1339,13 @@ def load_skin(conn, data = '', set_n = 0, default = 0):
         if skin_data != 'main_css':
             if set_n == 0:
                 if skin_data == data:
-                    skin_return_data = '' + \
+                    skin_return_data_str = '' + \
                         '<option value="' + skin_data + '">' + \
                             see_data + \
                         '</option>' + \
-                    '' + skin_return_data
+                    '' + skin_return_data_str
                 else:
-                    skin_return_data += '' + \
+                    skin_return_data_str += '' + \
                         '<option value="' + skin_data + '">' + \
                             see_data + \
                         '</option>' + \
@@ -1345,7 +1356,10 @@ def load_skin(conn, data = '', set_n = 0, default = 0):
                 else:
                     skin_return_data += [skin_data]                    
 
-    return skin_return_data
+    if set_n == 0:
+        return skin_return_data_str
+    else:
+        return skin_return_data
 
 # Func-markup
 def render_set(conn, doc_name = '', doc_data = '', data_type = 'view', markup = ''):
@@ -1592,9 +1606,9 @@ def captcha_get(conn):
 
     data = ''
     
-    if acl_check(conn, None, 'recaptcha_five_pass') == 0 and 'recapcha_pass' in flask.session and flask.session['recapcha_pass'] > 0:
+    if acl_check(conn, '', 'recaptcha_five_pass') == 0 and 'recapcha_pass' in flask.session and flask.session['recapcha_pass'] > 0:
         pass
-    elif acl_check(conn, None, 'recaptcha') == 1:
+    elif acl_check(conn, '', 'recaptcha') == 1:
         curs.execute(db_change('select data from other where name = "recaptcha"'))
         recaptcha = curs.fetchall()
         
@@ -1643,9 +1657,9 @@ def captcha_post(conn, re_data, num = 1):
 
     if num != 1:
         pass
-    elif acl_check(conn, None, 'recaptcha_five_pass') == 0 and 'recapcha_pass' in flask.session and flask.session['recapcha_pass'] > 0:
+    elif acl_check(conn, '', 'recaptcha_five_pass') == 0 and 'recapcha_pass' in flask.session and flask.session['recapcha_pass'] > 0:
         pass
-    elif acl_check(conn, None, 'recaptcha') == 1:
+    elif acl_check(conn, '', 'recaptcha') == 1:
         curs.execute(db_change('select data from other where name = "sec_re"'))
         sec_re = curs.fetchall()
         
@@ -2338,7 +2352,7 @@ def do_edit_slow_check(conn, do_type = 'edit'):
     
     slow_edit = curs.fetchall()
     if slow_edit and slow_edit[0][0] != '':
-        if acl_check(conn, None, 'slow_edit') == 1:
+        if acl_check(conn, '', 'slow_edit') == 1:
             slow_edit = int(number_check(slow_edit[0][0]))
 
             if do_type == 'edit':

+ 28 - 13
route/tool/func_tool.py

@@ -7,28 +7,43 @@ import re
 
 import os
 import html
+import sqlite3
 import time
 import json
 import threading
 
-set_data = ''
-
 def get_time():
     return str(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S"))
 
-def db_data_get(data):
-    global set_data
-    
-    set_data = data
+class class_in_memory_db:
+    def __enter__(self):
+        self.conn = sqlite3.connect(
+            'file:cachedb?mode=memory&cache=shared',
+            check_same_thread = False,
+            isolation_level = None
+        )
 
-def db_change(data):
-    if set_data == 'mysql':
-        data = data.replace('random()', 'rand()')
-        data = data.replace('%', '%%')
-        data = data.replace('?', '%s')
-        data = data.replace('collate nocase', 'collate utf8mb4_general_ci')
+        return self.conn
 
-    return data
+    def __exit__(self, exc_type, exc_value, traceback):
+        self.conn.commit()
+        self.conn.close()
+
+def db_change(data):
+    with class_in_memory_db() as m_conn:
+        m_curs = m_conn.cursor()
+        
+        m_curs.execute('select data from temp where name = "db_set_type"')
+        db_data = m_curs.fetchall()
+        set_data = db_data[0][0] if db_data else 'sqlite'
+
+        if set_data == 'mysql':
+            data = data.replace('random()', 'rand()')
+            data = data.replace('%', '%%')
+            data = data.replace('?', '%s')
+            data = data.replace('collate nocase', 'collate utf8mb4_general_ci')
+
+        return data
 
 def ip_check(d_type = 0):
     ip = ''