\n <\/td>\n | #!<\/span>/bin/sh<\/span><\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | #<\/span> Converts a mysqldump file into a Sqlite 3 compatible file. It also extracts the MySQL \`KEY xxxxx\` from the<\/span><\/td>\n <\/tr>\n \n <\/td>\n | #<\/span> CREATE block and create them in separate commands _after_ all the INSERTs.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | #<\/span> Awk is choosen because it's fast and portable. You can use gawk, original awk or even the lightning fast mawk.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | #<\/span> The mysqldump file is traversed only once.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | #<\/span> Usage: \$ ./mysql2sqlite mysqldump-opts db-name | sqlite3 database.sqlite<\/span><\/td>\n <\/tr>\n \n <\/td>\n | #<\/span> Example: \$ ./mysql2sqlite --no-data -u root -pMySecretPassWord myDbase | sqlite3 database.sqlite<\/span><\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | #<\/span> Thanks to and @artemyk and @gkuenning for their nice tweaks.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | mysqldump --compatible=ansi --skip-extended-insert --compact "<\/span>\$@<\/span>"<\/span><\/span> |<\/span> \\<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | awk '<\/span><\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | BEGIN {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | FS=",\$"<\/span><\/td>\n <\/tr>\n \n <\/td>\n | print "PRAGMA synchronous = OFF;"<\/span><\/td>\n <\/tr>\n \n <\/td>\n | print "PRAGMA journal_mode = MEMORY;"<\/span><\/td>\n <\/tr>\n \n <\/td>\n | print "BEGIN TRANSACTION;"<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # CREATE TRIGGER statements have funny commenting. Remember we are in trigger.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /^\\/\\*.*CREATE.*TRIGGER/ {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /^.*TRIGGER/, "CREATE TRIGGER" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | print<\/span><\/td>\n <\/tr>\n \n <\/td>\n | inTrigger = 1<\/span><\/td>\n <\/tr>\n \n <\/td>\n | next<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # The end of CREATE TRIGGER has a stray comment terminator<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /END \\*\\/;;/ { gsub( /\\*\\//, "" ); print; inTrigger = 0; next }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # The rest of triggers just get passed through<\/span><\/td>\n <\/tr>\n \n <\/td>\n | inTrigger != 0 { print; next }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # Skip other comments<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /^\\/\\*/ { next }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # Print all \`INSERT\` lines. The single quotes are protected by another single quote.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /INSERT/ {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /\\\\\\047/, "\\047\\047" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/\\\\n/, "\\n")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/\\\\r/, "\\r")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/\\\\"/, "\\"")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/\\\\\\\\/, "\\\\")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/\\\\\\032/, "\\032")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | print<\/span><\/td>\n <\/tr>\n \n <\/td>\n | next<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # Print the \`CREATE\` line as is and capture the table name.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /^CREATE/ {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | print<\/span><\/td>\n <\/tr>\n \n <\/td>\n | if ( match( \$0, /\\"[^\\"]+/ ) ) tableName = substr( \$0, RSTART+1, RLENGTH-1 ) <\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # Replace \`FULLTEXT KEY\` or any other \`XXXXX KEY\` except PRIMARY by \`KEY\`<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /^ [^"]+KEY/ && !/^ PRIMARY KEY/ { gsub( /.+KEY/, " KEY" ) }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # Get rid of field lengths in KEY lines<\/span><\/td>\n <\/tr>\n \n <\/td>\n | / KEY/ { gsub(/\\([0-9]+\\)/, "") }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # Print all fields definition lines except the \`KEY\` lines.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | /^ / && !/^( KEY|\\);)/ {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /int\\([0-9]+\\) NOT NULL AUTO_INCREMENT/, "integer" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /AUTO_INCREMENT|auto_increment/, "" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /(CHARACTER SET|character set) [^ ]+ /, "" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP|default current_timestamp on update current_timestamp/, "" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub( /(COLLATE|collate) [^ ]+ /, "" )<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/(ENUM|enum)[^)]+\\)/, "text ")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/(SET|set)\\([^)]+\\)/, "text ")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | gsub(/UNSIGNED|unsigned/, "")<\/span><\/td>\n <\/tr>\n \n <\/td>\n | if (prev) print prev ","<\/span><\/td>\n <\/tr>\n \n <\/td>\n | prev = \$1<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | <\/span><\/td>\n <\/tr>\n \n <\/td>\n | # \`KEY\` lines are extracted from the \`CREATE\` block and stored in array for later print <\/span><\/td>\n <\/tr>\n | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |