That seems like Catch-22. I can't be a beta tester because all my big apps use gui (grid, gl2, forms) and wd: so does that mean that migration of users like me is not worth the effort?
I have 100,000 lines of J6 code and I am wondering how I will ever make the move to J7. You mention non-gui packages. What about forms, gl2 graphics, and grid? Henry Rich On 11/28/2010 9:27 PM, bill lam wrote: > AFAIK missing non-gui packages can be relocated in addons. It also depends > on beta testers' feedback to decide which of these packages worth the > effort. > > Вск, 28 Ноя 2010, Henry Rich писал(а): >> What?? What good reason is there to retire something simple that works? >> I use jfiles all over. >> >> Is there a doc somewhere that discusses migration from J6 to J7? I rely >> on wd, forms, grid, jfiles, sockets, winAPI. >> >> Henry Rich >> >> On 11/28/2010 7:40 PM, John Baker wrote: >>> With the recent J 7.01 betas there have been rumbles that jfiles will be >>> retired in the not to distant future. There are many good reasons for this >>> so I started exploring jfiles alternatives and I think that sqlite may be >>> viable. >>> >>> Here's the good news: >>> >>> 1) sqlite is very stable, fast and produces binary compatible databases >>> across all the OSs jsoftware supports. You can copy a sqlite database from >>> a mac to linux or windows machine and access it without a single tweak. >>> sqlite is even available on android and the iphone and is embedded in major >>> software products like Adobe Lightroom. >>> >>> 2) data stored in sqlite format can be easily manipulated outside of J. A >>> huge plus for many. >>> >>> 3) The relaxed implied typing in sqlite, (it ignores limits on literals and >>> binary types), is well suited to J. >>> >>> 4) It's small and meant to be embedded. >>> >>> With so much going for it I spent sometime this weekend hacking around in >>> J/C# . >>> >>> The following C# test program uses the ADO.NET sqlite provider at: >>> http://sqlite.phxsoftware.com/ >>> >>> Oleg's J sqlite addon: http://www.jsoftware.com/jwiki/Addons/data/sqlite >>> >>> and a C#/J com interface I put together see: >>> http://bakerjd99.wordpress.com/2010/05/28/a-c-net-class-for-calling-j/ >>> >>> It looks like you can easily stuff and fetch J binary data from all these >>> environments without a big fuss: >>> >>> using System; >>> using System.Collections.Generic; >>> using System.IO; >>> using System.Text; >>> using System.Data; >>> using System.Data.Common; >>> using JServerClass; >>> using LescasseConsulting.AplServer; >>> using System.Data.SQLite; >>> >>> namespace SqliteTest00 >>> { >>> class Program >>> { >>> >>> // test sqlite database >>> private const string testdb = @"c:\temp\test.sqlite"; >>> >>> // test apl workspace >>> private const string apltestws = @"C:\pd\apl\aplwin\utf8"; >>> >>> private static JServer StartJServer(JServer.JScriptType st, string >>> inputscript) >>> { >>> // start a new J server and load root script >>> JServer js = new JServer(st, inputscript); >>> js.jShowServer = true; >>> return js; >>> } >>> >>> private static AplServer StartAPLServer(string ws) >>> { >>> AplServer apl = new AplServer(ws); >>> apl.Visible = 1; >>> return apl; >>> } >>> >>> static void Main(string[] args) >>> { >>> >>> // clear any old database >>> if (File.Exists(testdb)) File.Delete(testdb); >>> >>> // start J >>> JServer js = StartJServer(JServer.JScriptType.OnlyProfile, >>> ""); >>> >>> // load up JOD databases - fetch words >>> js.jDo("require 'general/jod'"); >>> js.jDo("od ;:'play utils'"); >>> js.jDo("'rc wordtable'=: 0 10 get }.dnl''"); >>> >>> // split up wordtable for JServer casting interface >>> js.jDo("jwords=: 0 {" + '"' + "1 wordtable"); >>> js.jDo("jdefinitions=: 2 {" + '"' + "1 wordtable"); >>> js.jDo("jclasses=: ; 1 {" + '"' + "1 wordtable"); >>> >>> // set JOD nouns (stored as binaries) as byte strings >>> js.jDo("nmask=: 0 = jclasses"); >>> js.jDo("(nmask # 0 {" + '"' + "1 wordtable) =: nmask # 2 {" + >>> '"' + "1 wordtable"); >>> >>> // load J sqlite interface - uses different dll than >>> // the one used by the C# library but so far I haven't >>> // seen any data compatibility issues. >>> js.jDo("load 'data/sqlite'"); >>> >>> // tell J where the test database is >>> js.jSet("testdb", testdb); >>> >>> // create J sqlite object for test database >>> js.jDo("]db=: testdb conew 'psqlite'"); >>> //js.jDo("blobsize__db 100000"); >>> >>> //// start APL and load test workspace >>> //AplServer apl = StartAPLServer(apltestws); >>> >>> // we use these three SQLite objects >>> SQLiteConnection sqlite_conn; >>> SQLiteCommand sqlite_cmd; >>> SQLiteDataReader sqlite_datareader; >>> >>> // create new database connection >>> sqlite_conn = new SQLiteConnection("Data Source=" + testdb + >>> ";Version=3;New=True;Compress=True;"); >>> >>> // open connection >>> sqlite_conn.Open(); >>> >>> // create a new SQL command >>> sqlite_cmd = sqlite_conn.CreateCommand(); >>> >>> // create table >>> sqlite_cmd.CommandText = "CREATE TABLE test (word text primary >>> key, nameclass integer, definition text, nounvalue blob);"; >>> sqlite_cmd.ExecuteNonQuery(); >>> >>> string[] jwords; >>> js.jGet("jwords", out jwords); >>> >>> string[] jdefinitions; >>> js.jGet("jdefinitions", out jdefinitions); >>> >>> int[] jnameclasses; >>> js.jGet("jclasses", out jnameclasses); >>> >>> if ((jwords.Length != jdefinitions.Length) || (jwords.Length >>> != >>> jnameclasses.Length)) >>> { >>> // list lengths match coming out of JOD if they >>> // do not here the interface has punked my data >>> return; >>> } >>> >>> using (SQLiteTransaction mytransaction = >>> sqlite_conn.BeginTransaction()) >>> { >>> using (SQLiteCommand mycommand = new >>> SQLiteCommand(sqlite_conn)) >>> { >>> SQLiteParameter myparam1 = new SQLiteParameter(); >>> SQLiteParameter myparam2 = new SQLiteParameter(); >>> SQLiteParameter myparam3 = new SQLiteParameter(); >>> SQLiteParameter myparam4 = new >>> SQLiteParameter(DbType.Binary); >>> >>> mycommand.CommandText = "INSERT INTO test (word, >>> nameclass, definition, nounvalue) VALUES(?,?,?,?)"; >>> mycommand.Parameters.Add(myparam1); >>> mycommand.Parameters.Add(myparam2); >>> mycommand.Parameters.Add(myparam3); >>> mycommand.Parameters.Add(myparam4); >>> >>> for (int i = 0; i< jwords.Length; i++) >>> { >>> string wname = jwords[i]; >>> int wclass = jnameclasses[i]; >>> >>> myparam1.Value = wname; >>> myparam2.Value = wclass; >>> >>> // JOD stores nouns as binaries all other words >>> are >>> text >>> if (0< wclass) >>> myparam3.Value = (string)jdefinitions[i]; >>> else >>> { >>> // fetch JOD binary >>> byte[] nounvalue; >>> js.jGet(wname, out nounvalue); >>> myparam4.Value = nounvalue; >>> } >>> >>> mycommand.ExecuteNonQuery(); >>> } >>> } >>> mytransaction.Commit(); >>> } >>> >>> // close C# sqlite connection >>> sqlite_conn.Close(); >>> >>> // fetch words name from sqlite table and compare with >>> originals >>> js.jDo("sqlwords=: strtbl__db 'select word from test'"); >>> js.jDo("jwords -: , }. sqlwords"); >>> >>> // fetch all noun binaries and compare with orginals >>> js.jDo("sbinaries=: }. strquery__db 'select word,nounvalue >>> from >>> test where nameclass=0'"); >>> js.jDo("sbinaries -: (0 {" + '"' + "1 sbinaries) ,. " + '"' + >>> ".&.> 0 {" + '"' + "1 sbinaries"); >>> >>> // fetch all literals and compare with orginals >>> js.jDo("sliterals=: }. strquery__db 'select word,definition >>> from >>> test where nameclass>0'"); >>> js.jDo("sliterals -: (-.nmask) # 0 2 {" + '"' +"1 wordtable"); >>> >>> //// apl does not automatically shutdown >>> //apl.CloseAPL(); >>> } >>> >>> } >>> >>> } >>> >>> >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
