From: Charlie Somerville Date: 2013-01-29T12:10:57+09:00 Subject: [ruby-core:51727] Re: [ruby-trunk - Feature #7751][Open] How to encapsulate File.delete and File.rename into one 'transaction'? --51073132_257d63f4_1fb Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline File.rename can overwrite the destination file, so your File.delete is not necessary On Tuesday, 29 January 2013 at 1:15 PM, mghomn (Justin Peal) wrote: > > Issue #7751 has been reported by mghomn (Justin Peal). > > ---------------------------------------- > Feature #7751: How to encapsulate File.delete and File.rename into one 'transaction'? > https://bugs.ruby-lang.org/issues/7751 > > Author: mghomn (Justin Peal) > Status: Open > Priority: Normal > Assignee: > Category: > Target version: > > > Following program has a line: File.delete(sql_file) and File.rename(tmp_file, sql_file) > It is not a 'transaction' which is I need. Has Ruby a feature to encapsulate File.delete and File.rename into one 'transaction'? > ====== > class String > def camelize > self.split('_').map {|w| w.capitalize }.join('_') > end > end > > class Busql > WORD = /\A(\/\*.*?\*\/|'(?:[^']|'')*'|"(?:[^"]|"")*"|--.*?\n|\n|([$_]|\p{L})([$_]|\p{L}|\p{N})*|\p{M}+|\p{Z}+|\p{S}+|\p{N}+|\p{P}|\p{C}+)/m > Oracle_Reserved_Words = /\A(ACCESS|ADD|ALL|ALTER|AND|ANY|ARRAYLEN|AS|ASC|AUDIT)\z/i > Oracle_Keywords = /\A(ADMIN|AFTER|ALLOCATE|ANALYZE|ARCHIVE|ARCHIVELOG|AUTHORIZATION|AVG)\z/i > PL_SQL_Reserved_Words = /\A(ABORT|ACCEPT|ACCESS|ADD|ALL|ALTER|AND|ANY|ARRAY|ARRAYLEN|AS|ASC|ASSERT|ASSIGN|AT|AUTHORIZATION|AVG)\z/i > Data_Types = /\A(VARCHAR2|NVARCHAR2|NUMBER|FLOAT|LONG|DATE|BINARY_FLOAT|BINARY_DOUBLE|TIMESTAMP|INTERVAL|YEAR|DAY|RAW|ROWID|UROWID|CHAR|NCHAR|CLOB|NCLOB|BLOB|BFILE)\z/i > Operators = /\A(PRIOR|CONNECT_BY_ROOT|UNION|ALL|INTERSECT|MINUS|MULTISET)\z/i > Joins = /\A(NATURAL|LEFT|RIGHT|FULL|INNER|OUTER|CROSS|JOIN)\z/i > SQL_Functions = /\A(ABS|ACOS|ADD_MONTHS|APPENDCHILDXML|ASCII|ASCIISTR|ASIN|ATAN|ATAN2|AVG)\z/i > Pseudocolumns = /\A(CONNECT_BY_ISCYCLE|CONNECT_BY_ISLEAF|LEVEL|CURRVAL|NEXTVAL|VERSIONS_STARTSCN|VERSIONS_STARTTIME|VERSIONS_ENDSCN|VERSIONS_ENDTIME|VERSIONS_XID|VERSIONS_OPERATION|COLUMN_VALUE|OBJECT_ID|OBJECT_VALUE|ORA_ROWSCN|ROWID|ROWNUM|XMLDATA)\z/i > NORMAL_WORDS = /\A([$_]|\p{L})/i > > def change_case text > news = [] > shr_text = text.dup > until shr_text.empty? > case word = shr_text[WORD, 1] > when Oracle_Reserved_Words, Oracle_Keywords, PL_SQL_Reserved_Words, Data_Types, Operators, Joins then word.upcase!() > when SQL_Functions, Pseudocolumns then word = word.camelize() > when NORMAL_WORDS then word.downcase!() if word.ascii_only? > end > news << word > shr_text.slice!(0, word.size) > end > news.join > end > > def change_sql sql_file > text = File.read(sql_file, :mode => 'r:utf-8') > new_text = change_case(text) > if changed = (new_text != text) > File.write(tmp_file = sql_file + '.t~m~p', new_text, :mode => 'wb') > File.delete(sql_file) and File.rename(tmp_file, sql_file) > end > yield changed, text.size, new_text.size if block_given? > end > > def beautify argv > argv.each do |arg| > Dir.glob(arg) do |sql_file| > sql_file = sql_file.force_encoding(Encoding::GB18030).encode(Encoding::UTF_8) > change_sql(sql_file) do |changed, old_len, new_len| > yield sql_file, changed, old_len, new_len if block_given? > end > end > end > end > end > > if $0 == __FILE__ > Busql.new.beautify(ARGV) do |sql_file, changed, old_len, new_len| > str = changed ? " #{old_len} ==> #{new_len}" : '' > print "#{sql_file}#{str}\n" > end > end > > > > -- > http://bugs.ruby-lang.org/ > > --51073132_257d63f4_1fb Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline
=46ile.rename can overwrite the destination file, so = your =46ile.delete is not necessary
=20

On Tuesday, 29 January= 2013 at 1:15 PM, mghomn (Justin Peal) wrote:


Issue =237751 has= been reported by mghomn (Justin Peal).

--------= --------------------------------
=46eature =237751: How to enca= psulate =46ile.delete and =46ile.rename into one 'transaction'=3F
https://bugs.ru= by-lang.org/issues/7751

Author: mghomn (Just= in Peal)
Status: Open
Priority: Normal
Assi= gnee:
Category:
Target version:


=46ollowing program has a line: =46ile.delete(sql=5F= file) and =46ile.rename(tmp=5Ffile, sql=5Ffile)
It is not a 'tr= ansaction' which is I need. Has Ruby a feature to encapsulate =46ile.dele= te and =46ile.rename into one 'transaction'=3F
=3D=3D=3D=3D=3D=3D=
class String
def camelize
self.split= ('=5F').map =7B=7Cw=7C w.capitalize =7D.join('=5F')
end
=
end

class Busql
WORD =3D /=5CA(= =5C/=5C*.*=3F=5C*=5C/=7C'(=3F:=5B=5E'=5D=7C'')*'=7C=22(=3F:=5B=5E=22=5D=7C= =22=22)*=22=7C--.*=3F=5Cn=7C=5Cn=7C(=5B=24=5F=5D=7C=5Cp=7BL=7D)(=5B=24=5F= =5D=7C=5Cp=7BL=7D=7C=5Cp=7BN=7D)*=7C=5Cp=7BM=7D+=7C=5Cp=7BZ=7D+=7C=5Cp=7B= S=7D+=7C=5Cp=7BN=7D+=7C=5Cp=7BP=7D=7C=5Cp=7BC=7D+)/m
Oracle=5F= Reserved=5FWords =3D /=5CA(ACCESS=7CADD=7CALL=7CALTER=7CAND=7CANY=7CARRAY= LEN=7CAS=7CASC=7CAUDIT)=5Cz/i
Oracle=5FKeywords =3D /=5CA(ADM= IN=7CA=46TER=7CALLOCATE=7CANALYZE=7CARCHIVE=7CARCHIVELOG=7CAUTHORIZATION=7C= AVG)=5Cz/i
PL=5FSQL=5FReserved=5FWords =3D /=5CA(ABORT=7CACCE= PT=7CACCESS=7CADD=7CALL=7CALTER=7CAND=7CANY=7CARRAY=7CARRAYLEN=7CAS=7CASC= =7CASSERT=7CASSIGN=7CAT=7CAUTHORIZATION=7CAVG)=5Cz/i
Data=5FT= ypes =3D /=5CA(VARCHAR2=7CNVARCHAR2=7CNUMBER=7C=46LOAT=7CLONG=7CDATE=7CBI= NARY=5F=46LOAT=7CBINARY=5FDOUBLE=7CTIMESTAMP=7CINTERVAL=7CYEAR=7CDAY=7CRA= W=7CROWID=7CUROWID=7CCHAR=7CNCHAR=7CCLOB=7CNCLOB=7CBLOB=7CB=46ILE)=5Cz/i<= /div>
Operators =3D /=5CA(PRIOR=7CCONNECT=5FBY=5FROOT=7CUNION=7CALL= =7CINTERSECT=7CMINUS=7CMULTISET)=5Cz/i
Joins =3D /=5CA(NATURA= L=7CLE=46T=7CRIGHT=7C=46ULL=7CINNER=7COUTER=7CCROSS=7CJOIN)=5Cz/i
SQL=5F=46unctions =3D /=5CA(ABS=7CACOS=7CADD=5FMONTHS=7CAPPENDCHILDX= ML=7CASCII=7CASCIISTR=7CASIN=7CATAN=7CATAN2=7CAVG)=5Cz/i
Pseu= docolumns =3D /=5CA(CONNECT=5FBY=5FISCYCLE=7CCONNECT=5FBY=5FISLEA=46=7CLE= VEL=7CCURRVAL=7CNEXTVAL=7CVERSIONS=5FSTARTSCN=7CVERSIONS=5FSTARTTIME=7CVE= RSIONS=5FENDSCN=7CVERSIONS=5FENDTIME=7CVERSIONS=5FXID=7CVERSIONS=5FOPERAT= ION=7CCOLUMN=5FVALUE=7COBJECT=5FID=7COBJECT=5FVALUE=7CORA=5FROWSCN=7CROWI= D=7CROWNUM=7CXMLDATA)=5Cz/i
NORMAL=5FWORDS =3D /=5CA(=5B=24=5F= =5D=7C=5Cp=7BL=7D)/i

def change=5Fcase text
news =3D =5B=5D
shr=5Ftext =3D text.dup
until shr=5Ftext.empty=3F
case word =3D shr=5Ftext= =5BWORD, 1=5D
when Oracle=5FReserved=5FWords, Oracle=5F= Keywords, PL=5FSQL=5FReserved=5FWords, Data=5FTypes, Operators, Joins the= n word.upcase=21()
when SQL=5F=46unctions, Pseudocolu= mns then word =3D word.camelize()
when NORMAL=5FWORDS= then word.downcase=21() if word.ascii=5Fonly=3F
end
news << word
shr=5Ftext.slice=21(0, wor= d.size)
end
news.join
end

def change=5Fsql sql=5Ffile
text =3D =46= ile.read(sql=5Ffile, :mode =3D> 'r:utf-8')
new=5Ftext =3D= change=5Fcase(text)
if changed =3D (new=5Ftext =21=3D text= )
=46ile.write(tmp=5Ffile =3D sql=5Ffile + '.t=7Em=7Ep', = new=5Ftext, :mode =3D> 'wb')
=46ile.delete(sql=5Ffile)= and =46ile.rename(tmp=5Ffile, sql=5Ffile)
end
= yield changed, text.size, new=5Ftext.size if block=5Fgiven=3F
end

def beautify argv
argv.ea= ch do =7Carg=7C
Dir.glob(arg) do =7Csql=5Ffile=7C
sql=5Ffile =3D sql=5Ffile.force=5Fencoding(Encoding::GB18030).= encode(Encoding::UT=46=5F8)
change=5Fsql(sql=5Ffile) do= =7Cchanged, old=5Flen, new=5Flen=7C
yield sql=5Ffile= , changed, old=5Flen, new=5Flen if block=5Fgiven=3F
end=
end
end
end
end

if =240 =3D=3D =5F=5F=46ILE=5F=5F
Busql.= new.beautify(ARGV) do =7Csql=5Ffile, changed, old=5Flen, new=5Flen=7C
str =3D changed =3F =22 =23=7Bold=5Flen=7D =3D=3D> =23=7Bne= w=5Flen=7D=22 : ''
print =22=23=7Bsql=5Ffile=7D=23=7Bstr=7D= =5Cn=22
end
end


=

--
=20 =20 =20 =20
=20

--51073132_257d63f4_1fb--