eschulte / rinari

Rinari Is Not A Rails IDE (it is an Emacs minor mode for Rails)
http://rinari.rubyforge.org
GNU General Public License v3.0
412 stars 68 forks source link

rinari-sql connection fail if defined port in database.yml #89

Closed erw7 closed 9 years ago

erw7 commented 9 years ago

Because psql and mysql does not accept the argument of the host:port form, rinari-sql fail in connection.

> mysql -h 127.0.0.1:3306 -u user database
ERROR 2005 (HY000): Unknown MySQL server host 'localhost:3306' (1)
> psql -h localhost:5432 database user
psql: could not translate host name "127.0.0.1:5432" to address: Name or service not known

I thought about the following solution, but how about?

--- a/rinari.el
+++ b/rinari.el
@@ -402,6 +402,8 @@ Looks up login information from your conf/database.sql file."
          (existing-buffer (get-buffer (concat "*SQL: " environment "*"))))
     (if existing-buffer
         (pop-to-buffer existing-buffer)
+      (unless (featurep 'sql)
+        (require 'sql))
       (let* ((database-yaml (rinari-parse-yaml
                              (expand-file-name
                               "database.yml"
@@ -409,33 +411,35 @@ Looks up login information from your conf/database.sql file."
                                (expand-file-name "config" (rinari-root))))))
              (database-alist (or (cdr (assoc (intern environment) database-yaml))
                                  (error "Couldn't parse database.yml")))
-             (adapter (or (cdr (assoc 'adapter database-alist)) "sqlite"))
-             (server (or (cdr (assoc 'host database-alist)) "localhost"))
-             (port (cdr (assoc 'port database-alist))))
+             (product (let* ((adapter (or (cdr (assoc 'adapter database-alist)) "sqlite")))
+                             (cond
+                              ((string-match "mysql" adapter) "mysql")
+                              ((string-match "sqlite" adapter) "sqlite")
+                              ((string-match "postgresql" adapter) "postgres")
+                              (t adapter))))
+             (port (cdr (assoc 'port database-alist)))
+             (sql-login-params (or (intern-soft (concat "sql-" product "-login-params"))
+                               (error "`%s' is not a known product; use `sql-add-product' to add it first." product))))
         (with-temp-buffer
           (set (make-local-variable 'sql-user) (cdr (assoc 'username database-alist)))
           (set (make-local-variable 'sql-password) (cdr (assoc 'password database-alist)))
           (set (make-local-variable 'sql-database) (or (cdr (assoc 'database database-alist))
-                                                       (when (string-match-p "sqlite" adapter)
+                                                       (when (string-match-p "sqlite" product)
                                                          (expand-file-name (concat "db/" environment ".sqlite3")
                                                                            (rinari-root)))
                                                        (concat (file-name-nondirectory
                                                                 (directory-file-name (rinari-root)))
                                                                "_" environment)))
-          (when (string-match-p "sqlite" adapter)
+          (when (string= "sqlite" product)
             ;; Always expand sqlite DB filename relative to RAILS_ROOT
             (setq sql-database (expand-file-name sql-database (rinari-root))))
-          (set (make-local-variable 'sql-server) (if port (concat server ":" (number-to-string port)) server))
+          (set (make-local-variable 'sql-server) (or (cdr (assoc 'host database-alist)) "localhost"))
+          (when port
+            (set (make-local-variable 'sql-port) port)
+            (set (make-local-variable sql-login-params) (add-to-list sql-login-params 'port t))
+            )
           (funcall
-           (intern (concat "sql-"
-                           (cond
-                            ((string-match "mysql" adapter)
-                             "mysql")
-                            ((string-match "sqlite" adapter)
-                             "sqlite")
-                            ((string-match "postgresql" adapter)
-                             "postgres")
-                            (t adapter))))
+           (intern (concat "sql-" product))
            environment))))
     (rinari-launch)))
            
purcell commented 9 years ago

Thanks. I applied that patch in 81af5c8.

erw7 commented 9 years ago

Thank you for the applying of the patch.