Google App Engineのdata storeのデータをリストアする(java + json)

English

GAEではtempファイルすら書き込めず、sqliteもまたメモリー上に構築してもファイル以外には書き出せずストリーム出力できないため、jsonを使ってバックアップ、リストアする方法をここでは紹介します

JSON
Blob Base64 String
Text String

jsonでは以上の形式で書き出しを行い、リストアはまたこの逆となります

必要になってくるjarライブラリ

  1. commons-codec-1.5.jar
  2. commons-io-1.0.jar
  3. json_simple-1.1.jar
  4. cos.jar

バックアップ

running codes

Tidder export ExportTidders.java
File export ExportAttachments.java
手順
  1. JSONArrayの作成
  2. PMF.select(Foo.class)でレコードを選択
  3. すべての各レコードをJSONArrayに書き込む
    1. Blob から Byte に commons-codec Blob64.toBase64String()を利用して必要であれば変換する
  4. JSONArray.write(HttpResponse.PrintWriter)でレスポンスに書き出す
コード
    @Override
    public void doGet(final HttpServletRequest req, final HttpServletResponse res)
    {
        final String page = req.getParameter("p");
        final int p = (page == null) ? 0 : (!page.matches("[0-9]+")) ? 0 : Integer.parseInt(page);
        final PersistenceManager pm = PMF.get().getPersistenceManager();
        final javax.jdo.Query que = pm.newQuery("SELECT FROM " + com.tidspr.tsr.entity.File.class.getName());
        que.setRange(0 + (1000 * p), 999 + (1000 * p)); // export?p=1 -> record 1000~1999
        System.out.println(que.toString());
        final List<com.tidspr.tsr.entity.File> list = (List<com.tidspr.tsr.entity.File>) que.execute();
        try
        {
            res.setContentType("application/json");
            res.setCharacterEncoding("UTF-8");
            final PrintWriter out = res.getWriter();
            final JSONArray rs = new JSONArray();
            for (final com.tidspr.tsr.entity.File f : list)
            {
                final JSONObject obj = new JSONObject();
                obj.put("name", f.name());
                obj.put("key", f.key().getName());
                obj.put("data", new String(new Base64().encodeBase64(f.blob().getBytes())));//Blob
                obj.put("type", f.type());//String
                obj.put("wiki", f.wiki());
                obj.put("raw", t.raw().getValue());//Text
                rs.add(obj);
            }
            rs.writeJSONString(out);
        }
        catch (final IOException e)
        {
            e.printStackTrace();
        }
    }

リストア

running codes

Tidder import ImportTidders.java
File import ImportAttachments.java
手順
  1. Postを受ける
  2. MultipartParserをcos.jarから作りファイルを受けとる
  3. commons-io IOUtils.toString(Post-FilePart.getInputStream())を利用してファイル入力を一気にテキストに変換
  4. List<Foo.Class>とかしてレコードのリストを作成
  5. JSONValue.parse(String)でjsonテキストをパースしてJSONArrayに乗せる
  6. JSONArrayの各jsonで反復
    1. JSONからFoo.classレコードを作成
      1. Blob へ commons-codec Blob64.decodeBase64String(Base64String) を使いByteを経由して必要であれば変換
    2. List.add(Foo.class)リストに加える
  7. PMF.makePersistentAll(List);一気にリストを永続化
  8. PMF.flush();
code
    @Override
    public void doPost(final HttpServletRequest req, final HttpServletResponse res)
    {
        try
        {
            final MultipartParser p = new MultipartParser(req, 50000000, false, false, "UTF-8");// < 50Mb
            Part pa;
            while ((pa = p.readNextPart()) != null)
            {
                if (pa.isFile())
                {
                    final FilePart fp = ((FilePart) pa);
                    final List<com.tidspr.tsr.entity.File> ls = new LinkedList<com.tidspr.tsr.entity.File>();
                    final Object obj = JSONValue.parse(IOUtils.toString(fp.getInputStream(),"UTF-8"));
                    final JSONArray array = (JSONArray) obj;
                    final Iterator<Object> i = array.iterator();
                    while (i.hasNext())
                    {
                        final JSONObject jo = (JSONObject) i.next();
                        final File f = new com.tidspr.tsr.entity.File((String) jo.get("name"), new Blob(new Base64().decodeBase64((String) jo.get("data"))), (String) jo.get("type"), (String) jo.get("wiki"));//new Text((String) jo.get("raw").getValue()) for google.Text
                        final Key k = KeyFactory.createKey(com.tidspr.tsr.entity.File.class.getSimpleName(), (String) jo.get("key"));
                        f.key(k);
                        ls.add(f);
                    }
                    final PersistenceManager pm = PMF.get().getPersistenceManager();
                    pm.makePersistentAll(ls);
                    pm.flush();
                    pm.close();
                }
            }

        }
        catch (final IOException e1)
        {
            e1.printStackTrace();
        }
    }

実際にjsonバックアップ、リストアを行っているURL

/ts.export.json Tidder Export
/fs.export.json File Export
/ts.import.json Tidder Restore (Owner Authorization Needed)
/fs.import.json File Restore (Owner Authorization Needed)
関連 Export & Restore
    last modified: 19 July 2011 [ View wiki source Close ]
     
SEARCH DIFFERENCE ATTACHMENT RECENT POST