Nucleus/SQLite

SQLite-4

2006年3月8日

 Nucleus 3.22 en/ja を、SQLite用に自動変換するスクリプト。ほぼできあがったので、ここにメモ。

'***********************************************
'* mysql_xxx() => sqlite_mysql_xxx() converter *
'*                                 for Nucleus *
'*     ver 0.2    Written by Katsumi           *
'***********************************************
'
' The license of this script is GPL

Option Explicit
Dim sfo,fHandle,buff,ret,T,temp,curdir
set sfo=CreateObject("Scripting.FileSystemObject")
curdir=CreateObject("WScript.Shell").CurrentDirectory
if right(curdir,1)<>"\" then curdir=curdir+"\"

'//Avoide 2nd round
if sfo.FileExists("convert-result.txt") then
  msgbox "This conversion has been probably done!",vbCritical
  wscript.quit
end if

'//Check the language used in install.php
Dim jae,jau,lang,probably,encode
set fHandle=sfo.OpenTextFile("install.php")
jae=0
jau=0
Do Until fHandle.AtEndOfStream
  buff=fHandle.ReadLine
  if instr(1,buff,"charset=EUC-JP",1) then jae=jae+1
  if instr(1,buff,"charset=UTF-8",1) then jau=jau+1
Loop
fHandle.close
'//Normally, the score of jae/jau is 4 if japanese is used
if (jae=0) and (jau=0) then
  lang="english"
elseif 2<jae and jau<jae then
  lang="japanese-euc"
elseif 2<jau and jae<jau then
  lang="japanese-utf8"
elseif jau<jae then
  lang="japanese-euc"
  probably=" (not sure)"
elseif jae<jau then
  lang="japanese-utf8"
  probably=" probably (not sure)"
else
  msgbox "Unknown language"
  wscript.quit
end if
'//Set the encoding mode
select case lang
case "japanese-euc"
  encode="euc-jp"
case "japanese-utf8"
  encode="utf-8"
case else
  encode="iso-8859-1"
end select

'//Prompt asking user to start process.
buff="Used language is "+lang+probably+vbcrlf+vbcrlf
buff=buff+"Continue?"+vbcrlf+"This may take a few minutes."
ret=msgbox(buff,vbyesno,"Scores: EUC-JP="+cstr(jae)+", UTF-8="+cstr(jau))
if ret=vbno then wscript.quit

'//Modify install.php
Dim firstLine,mySQLSettings(3),value,log
if encode<>"iso-8859-1" then call convertCode("install.php",encode,"shift_jis")
T=""
log=curdir+"install.php"+vbcrlf
mySQLSettings(0)="mySQL_host"
mySQLSettings(1)="mySQL_user"
mySQLSettings(2)="mySQL_password"
mySQLSettings(3)="mySQL_database"
firstLine=true
set fHandle=sfo.OpenTextFile("install.php")
Do Until fHandle.AtEndOfStream
  buff=fHandle.ReadLine+vbcrlf
  if firstLine then
    firstLine=false
    temp="include('nucleus/sqlite/sqlite.php');"+vbcrlf
    buff=buff+temp
    log=log+temp
  end if
  if 0<instr(1,buff,"<input name=") then
    for each value in mySQLSettings
      if 0<instr(1,buff,value) then
        buff=ereg_replace("<input name="""+value+"""[\s\S]*?/>", _
          "<input name="""+value+""" type=""hidden"" value=""dummy"" />",buff)
        log=log+buff
      end if
    next
  end if
  if 0<instr(1,buff,"globalfunctions.php") and 0<instr(1,buff,"include") then
    temp=ereg_replace("include[\s]*?\([\s]*?([\\]?)\$DIR_[\s\S]*?globalfunctions.php[^;]*?;", _
      "include($1$DIR_NUCLEUS.'sqlite/sqlite.php');",buff)
    if temp<>buff then 
      buff=temp+buff
      log=log+temp
    end if
  end if
  buff=ereg_replace("mysql_query","sqlite_mysql_query",buff)
  T=T+buff
Loop
fHandle.close
set fHandle=sfo.OpenTextFile("install.php",2,true)
fHandle.Write T
fHandle.close

'//modify config.php
T=""
log=log+curdir+"config.php"+vbcrlf
set fHandle=sfo.OpenTextFile("config.php")
Do Until fHandle.AtEndOfStream
  buff=fHandle.ReadLine+vbcrlf
  if 0<instr(1,buff,"globalfunctions.php") and 0<instr(1,buff,"include") then
    temp=ereg_replace("include[\s]*?\([\s]*?([\\]?)\$DIR_[\s\S]*?globalfunctions.php[^;]*?;", _
      "include($1$DIR_NUCLEUS.'sqlite/sqlite.php');",buff)
    if temp<>buff then 
      buff=temp+buff
      log=log+temp
    end if
  end if
  T=T+buff
Loop
fHandle.close
set fHandle=sfo.OpenTextFile("config.php",2,true)
fHandle.Write T
fHandle.close

set fHandle=sfo.OpenTextFile("convert-result.txt",8,True) 'Append
fHandle.Write log
fHandle.close

'//Check all PHP file for changing from mysql_xxx() to sqlite_mysql-xxx()
do
  T=""
  call SearchFolder(curdir)
  set fHandle=sfo.OpenTextFile("convert-result.txt",8,True) 'Append
  fHandle.Write T
  fHandle.close
loop until T=""

'//Return to original encode of install.php
if encode<>"iso-8859-1" then call convertCode("install.php","shift_jis",encode)

MsgBox("Done.  You may see the convert-result.txt file.")
WScript.quit

sub searchFolder(fpath)
  Dim f1
  if right(fpath,1)<>"\" then fpath=fpath+"\"
  call checkPhpFiles(fpath)
  For Each f1 in sfo.GetFolder(fpath).SubFolders
    if f1.name<>"language" and f1.name<>"sqlite" then call searchFolder(fpath+f1.name)
  Next
end sub

sub checkPhpFiles(fpath)
  Dim f1
  For Each f1 in sfo.GetFolder(fpath).Files
    if lcase(right(f1.name,4))=".php" then call replaceFunctions(fpath+f1.name)
  Next
end sub

sub replaceFunctions(fpath)
  Dim phpfile,fHandle,temp
  phpfile=""
  set fHandle=sfo.OpenTextFile(fpath)
  Do Until fHandle.AtEndOfStream
    phpfile=phpfile+fHandle.ReadLine+vbcrlf
  Loop
  fHandle.close
  Dim regEx, Match, Matches, RepText
  Set regEx = New RegExp
  regEx.Pattern = "([^_])mysql_([_a-z]*?)([\s]*?)\("
  RepText="$1sqlite_mysql_$2("
  regEx.IgnoreCase = False
  regEx.Global = True
  if regEx.Test(phpfile) then
    T=T+fpath+vbcrlf
    Set Matches = regEx.Execute(phpfile)
    For Each Match in Matches
      T=T&"  "&Match.Value&")"&vbcrlf
    Next
    set fHandle=sfo.OpenTextFile(fpath,2,true)
    fHandle.Write regEx.replace(phpfile,RepText)
    fHandle.close
  end if
end sub

sub convertCode(fName,enc1,enc2)
  Dim Stream,Stream2
  Set Stream=CreateObject("ADODB.Stream")
  Set Stream2=CreateObject("ADODB.Stream")
  Stream.Open
  Stream.Type = 2
  Stream.Charset = enc1
  Stream.LoadFromFile fName
  Stream2.Open
  Stream2.Charset = enc2
  Stream.CopyTo Stream2
  Stream2.SaveToFile fName, 2
  Stream2.Close
  Stream.Close
end sub

function ereg_replace_sub(pattern,replacement,T,IgnoreCase)
  with (New RegExp)
    .Pattern = pattern
    .IgnoreCase = IgnoreCase
    .Global = True
    ereg_replace_sub=.replace(T,replacement)
  end with
end function
function ereg_replace(pattern,replacement,T)
  ereg_replace=ereg_replace_sub(pattern,replacement,T,false)
end function
function eregi_replace(pattern,replacement,T)
  eregi_replace=ereg_replace_sub(pattern,replacement,T,true)
end function

コメント

コメントはありません

コメント送信