pgloader/src/sources/mysql/mysql-csv.lisp
Dimitri Fontaine 2369a142a7 Refactor source code organisation.
In passing, fix a bug in the previous commit where left-over code would
cancel the whole new parsing code for advanced source fields options.
2014-10-01 23:20:24 +02:00

83 lines
2.7 KiB
Common Lisp

;;;
;;; Tools to handle MySQL data fetching: old code, untested, kept for reference.
;;;
(in-package :pgloader.mysql)
;;;
;;; MySQL bulk export to file, in PostgreSQL COPY TEXT format
;;;
(defun export-database (dbname &key only-tables)
"Export MySQL tables into as many TEXT files, in the PostgreSQL COPY format"
(let ((all-columns (list-all-columns :dbname dbname)))
(setf *state* (pgloader.utils:make-pgstate))
(report-header)
(loop
for (table-name . cols) in all-columns
for filename = (pgloader.csv:get-pathname dbname table-name)
when (or (null only-tables)
(member table-name only-tables :test #'equal))
do
(pgstate-add-table *state* dbname table-name)
(report-table-name table-name)
(multiple-value-bind (rows secs)
(timing
;; load data
(let ((source
(make-instance 'copy-mysql
:source-db dbname
:source table-name
:fields cols)))
(copy-to source filename)))
;; update and report stats
(pgstate-incf *state* table-name :read rows :secs secs)
(report-pgtable-stats *state* table-name))
finally
(report-pgstate-stats *state* "Total export time"))))
;;;
;;; Copy data from a target database into files in the PostgreSQL COPY TEXT
;;; format, then load those files. Useful mainly to compare timing with the
;;; direct streaming method. If you need to pre-process the files, use
;;; export-database, do the extra processing, then use
;;; pgloader.pgsql:copy-from-file on each file.
;;;
(defun export-import-database (dbname
&key
(pg-dbname dbname)
(truncate t)
only-tables)
"Export MySQL data and Import it into PostgreSQL"
;; get the list of tables and have at it
(let ((all-columns (list-all-columns :dbname dbname)))
(setf *state* (pgloader.utils:make-pgstate))
(report-header)
(loop
for (table-name . cols) in all-columns
when (or (null only-tables)
(member table-name only-tables :test #'equal))
do
(pgstate-add-table *state* dbname table-name)
(report-table-name table-name)
(multiple-value-bind (res secs)
(timing
(let* ((filename (pgloader.csv:get-pathname dbname table-name)))
;; export from MySQL to file
(let ((source
(make-instance 'copy-mysql
:source-db dbname
:source table-name
:fields cols)))
(copy-to source filename))
;; import the file to PostgreSQL
(pgloader.pgsql:copy-from-file pg-dbname
table-name
filename
:truncate truncate)))
(declare (ignore res))
(pgstate-incf *state* table-name :secs secs)
(report-pgtable-stats *state* table-name))
finally
(report-pgstate-stats *state* "Total export+import time"))))