aboutsummaryrefslogblamecommitdiff
path: root/emacs/.emacs.d/lisp/my/my-mariadb.el
blob: d6c2463783b7c3cd25b3466b8959b058f6baca1e (plain) (tree)



























                                                                                            
              



                                                     

                                      

                       




                                                    
                               


                                                                 
                                                  
                             


                                                    
                  
         
                               


                                                                   
                                                                      


















                                                                         






























                                                                                





































                                                                                                   





























                                                                        




                                                                           
                      
                                         






















































                                                                                

                                                                













                                                             

















                                                                       





















                                                                             



                                                            
 
                           
;;; my-mariadb.el -- Customization for mariadb development-branch -*- lexical-binding: t -*-

;; Copyright (C) 2023 Free Software Foundation.

;; Author: Yuchen Pei <id@ypei.org>
;; Package-Requires: ((emacs "28.2"))

;; This file is part of dotted.

;; dotted is free software: you can redistribute it and/or modify it under
;; the terms of the GNU Affero General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; dotted is distributed in the hope that it will be useful, but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
;; Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with dotted.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; Customization for mariadb development-branch.

;;; Code:

(require 'my-prog)
(require 'sql)

(defun my-sql-maybe-mtrr ()
  (interactive)
  (if (equal (file-name-extension (buffer-file-name))
             "test")
      (progn
        (my-mtr-set-compile-command)
        (call-interactively 'compile))
    (sql-send-buffer)))

(defun my-gdb-maria ()
  (interactive)
  (when (and (buffer-live-p gud-comint-buffer)
             (get-buffer-process gud-comint-buffer))
    (my-gdb-quit))
  (sleep-for 1)
  (my-gdb
   (format "rr replay %s -d %s"
           (expand-file-name
            (replace-regexp-in-string
             "/src"
             "/build/mysql-test/var/log/mysqld.1.rr/latest-trace"
             (project-root (project-current t))))
           (expand-file-name "~/bin/gdb-mi.sh"))))

(defun my-gdb-maria-spider ()
  (interactive)
  (when (and (buffer-live-p gud-comint-buffer)
             (get-buffer-process gud-comint-buffer))
    (my-gdb-quit))
  ;; (sleep-for 1)
  (my-gdb
   (format "rr replay %s -d %s"
           (expand-file-name
            (replace-regexp-in-string
             "/src"
             "/build/mysql-test/var/log/mysqld.1.1.rr/latest-trace"
             ;; "/build/mysql-test/var/log/mysqld.2.2.rr/latest-trace"
             (project-root (project-current t))))
           (expand-file-name "~/bin/gdb-mi.sh"))))

(defvar my-c-style-maria-spider
  '("maria-spider"
    (c-basic-offset . 2)
    (c-offsets-alist
     . (;; no indentation when opening an brace
        (substatement-open . 0)
        ;; no extra space when aligning continued lines of block comments
        (c . +)
        (arglist-intro . +)
        (arglist-close . 0)
        (arglist-cont-nonempty c-lineup-gcc-asm-reg c-lineup-arglist)
        (arglist-cont . 0)
        (statement-block-intro . +)
        ))
    ;; empty comment start on block comment continuation refill
    (c-block-comment-prefix . "")
    ))

(defun my-mdev-22979 (beg end)
  (interactive "r")
  (save-excursion
    (goto-char end)
    (insert "  )},
")
    (goto-char beg)
    (insert "  {C_STRING_WITH_LEN(
")))

(defun my-gdb-mysql-parse-frame ()
  (interactive)
  (let ((old-frame) (level))
    (with-current-buffer (gdb-stack-buffer-name)
      (save-excursion
        (beginning-of-buffer)
        (setq old-frame (point))
        (text-property-search-forward
         'gdb-frame
         "mysql_parse"
         (lambda (val prop) (equal (alist-get 'func prop) val)))
        (beginning-of-line)
        (setq level (alist-get 'level (get-text-property (point) 'gdb-frame)))))
    (with-current-buffer gud-comint-buffer
      (insert "f " level)
      (comint-send-input))
    (with-current-buffer (gdb-stack-buffer-name)
      (save-excursion
        (goto-char old-frame)
        (gdb-select-frame)))))

(defun my-mdev-29502-seek-next ()
  (save-excursion
    (while (re-search-forward "\\(\\ *\\)SPIDER_CLEAR_FILE_POS(&\\(.*\\)->mta_conn_mutex_file_pos);
\\ *pthread_mutex_unlock(&\\2->mta_conn_mutex);" nil t)
      (replace-match "\\1spider_conn_mutex_unlock(\\2);")))
  (save-excursion
    (while (re-search-forward "\\(\\ *\\)DBUG_ASSERT(!\\(.*\\)->mta_conn_mutex_lock_already);
\\ *DBUG_ASSERT(!\\2->mta_conn_mutex_unlock_later);
\\ *\\2->mta_conn_mutex_lock_already = TRUE;
\\ *\\2->mta_conn_mutex_unlock_later = TRUE;" nil t)
      (replace-match "\\1spider_conn_mutex_locked(\\2);")))
  (save-excursion
    (while (re-search-forward "\\(\\ *\\)DBUG_ASSERT(\\(.*\\)->mta_conn_mutex_lock_already);
\\ *DBUG_ASSERT(\\2->mta_conn_mutex_unlock_later);
\\ *\\2->mta_conn_mutex_lock_already = FALSE;
\\ *\\2->mta_conn_mutex_unlock_later = FALSE;" nil t)
      (replace-match "\\1spider_conn_mutex_unlocking(\\2);")))
  (save-excursion
    (while (re-search-forward "\\(\\ *\\)pthread_mutex_lock(&\\(.*\\)->mta_conn_mutex);
\\ *SPIDER_SET_FILE_POS(&\\2->mta_conn_mutex_file_pos);" nil t)
      (replace-match "\\1spider_conn_mutex_lock(\\2);")))
  )

(defun my-mdev-29502-need-lock ()
  (save-excursion
    (while (re-search-forward "\\(\\ *\\)if ([^!].*need_lock_before_set_sql_for_exec(.*" nil t)
      (beginning-of-line)
      (kill-sexp 3)
      (kill-line)))
  (save-excursion
    (while (re-search-forward "\\(\\ *\\)if (!.*need_lock_before_set_sql_for_exec(.*" nil t)
      (beginning-of-line)
      (kill-sexp 2)
      (kill-line 2)
      (c-indent-line-or-region)
      (beginning-of-line 3)
      (kill-line 1)
      )))

(defvar my-mdev-32524-ids nil "List of ids used.")

(defun my-mdev-32524-make-id ()
  "Return an id on the current position."
  (let* ((base
          (replace-regexp-in-string
           "::" "_"
           (replace-regexp-in-string
            "^\\(SPIDER_\\)?" "SPD_MID_"
            (upcase (which-function)))))
         (last-id (car my-mdev-32524-ids))
         (counter (cdr last-id))
         (result))
    (if (equal (car last-id) base)
        (progn
          (setq result (format "%s_%d" base (1+ counter)))
          (push (cons base (1+ counter)) my-mdev-32524-ids))
      (setq result (format "%s_1" base))
      (push (cons base 1) my-mdev-32524-ids))
    result))

(defun my-mdev-32524-replace-ids ()
  "Replace magic id numbers with enum symbols."
  (setq my-mdev-32524-ids nil)
  (dolist (file (directory-files "./storage/spider" t ".\\(cc\\|h\\)$"))
    ;; Don't do this with spd_malloc.{cc,h}
    (unless (string-match "spd_malloc" file)
      (with-current-buffer (find-file-noselect file)
        (goto-char (point-min))
        (while (re-search-forward
                (concat
                 "\\(spider_alloc_calc_mem_init(.*?, \\|init_calc_mem(\\|"
                 "spider_malloc(.*?, \\|"
                 "spider_bulk_alloc_mem(.*?, \\|spider_bulk_malloc.*?, \\)"
                 "\\([0-9]+\\)"
                 ;; "\\(([^0-9)]*\\)\\([0-9]+\\)"
                 )
                nil t)
          (let ((beg (match-beginning 2))
                (end (match-end 2)))
            (replace-region-contents beg end #'my-mdev-32524-make-id)))
        (save-buffer)))))

(defun my-mdev-32524-insert-enum-def ()
  "Insert enum def at point according to `my-mdev-32524-ids'."
  (with-current-buffer (find-file-noselect "./storage/spider/spd_include.h")
    (goto-char (point-min))
    (re-search-forward "#define.* SPIDER_CONN_META_BUF_LEN")
    (beginning-of-line 2)
    (let ((pre
           "
/*
  IDs for spider mem alloc functions, including
  - spider_alloc_calc_mem_init()
  - spider_string::init_calc_mem()
  - spider_malloc()
  - spider_bulk_alloc_mem()
  - spider_bulk_malloc()
  In the format of
  SPD_MID_<CALLSITE_FUNC_NAME_SANS_SPIDER_PREFIX>_<NO>
*/
enum spider_malloc_id {
  ")
          (middle (string-join
                   (sort
                    (mapcar
                     (lambda (pair)
                       (format "%s_%d" (car pair) (cdr pair)))
                     my-mdev-32524-ids)
                    #'string<)
                   ",
  "))
          (post "
};
"))
      (insert (concat pre middle post))
      (save-buffer))))

(defun my-mdev-32524 ()
  "Make changes for MDEV-32524. Assuming we are at the source root."
  (interactive)
  (my-mdev-32524-replace-ids)
  (my-mdev-32524-insert-enum-def))

(defun my-mdev-28861-ps ()
  "Wrap the current line between --disable_ps_protocol and --enable_ps_protocol"
  (interactive)
  (save-excursion
    (beginning-of-line)
    (push-mark
     (save-excursion
       (beginning-of-line 2)
       (point))
     nil t)
    (tempel-insert 'ps)))

(defun my-mariadb-kb-url-p (url)
  (string-match-p "https://mariadb.com/kb/en/\\([^/]+\\)/" url))

(defun my-wiki-mariadb-extract-kb-source ()
  "Extract the kb source from the current buffer.

Used for wiki mode as a post-processor."
  (let ((source
         (dom-text
          (dom-by-id
           (libxml-parse-html-region (point-min) (point-max))
           "answer_source"))))
    (erase-buffer)
    (insert source))
  (goto-char (point-min))
  (save-buffer)
  )

(defun my-mariadb-fetch-kb-source (url)
  "Fetches the source to an maridb kb entry at URL.

The source is saved in a .wiki file under the /tmp dir, and it
switches to the buffer."
  (interactive "sURL: ")
  (let* ((term
          (progn
            (string-match "https://mariadb.com/kb/en/\\([^/]+\\)/" url)
            (match-string 1 url)))
         (source
          (dom-text
           (dom-by-id
            (my-url-fetch-dom
             (format "https://mariadb.com/kb/en/%s/+source/" term))
            "answer_source")))
         (file-name (format "/tmp/%s.wiki" term)))
    (my-save-text-and-switch-to-buffer source file-name)))

(defvar my-mtr-compilation-error-re
  '(mtr "^mysqltest: At line \\([0-9]+\\)" nil 1))

;; (defun my-mtr-find-test-file (test-name &optional dir)
;;   (unless dir (setq dir default-directory))
;;   ())

(defun my-mtr-set-compile-command ()
  (when (and buffer-file-name
             (equal "test" (file-name-extension buffer-file-name)))
    (when-let*
        ((source-dir (expand-file-name (project-root (project-current))))
         (build-dir (replace-regexp-in-string "/src/$" "/build/" source-dir))
         (test-name
          (progn
            (when (string-match
                   "^.*/mysql-test/\\(.+?\\)/\\(t/\\)?\\([^/]+\\)\\.test$"
                   buffer-file-name)
              (format "%s.%s"
                      (match-string 1 buffer-file-name)
                      (match-string 3 buffer-file-name))))))
      (setq-local
       compile-command
       (format "%s %s %s %s"
               "taskset -c 0-3"
               (file-name-concat build-dir "mysql-test/mtr")
               test-name
               "--rr")))))

(provide 'my-mariadb)
;;; my-mariadb.el ends here