Импортировать 150 картинок в базу данных за 3 минуты

Недавно я писал про базу данных с картинками. Может показаться, что занесение в ее графическое поле изображений — утомительный ручной процесс. Однако на самом деле всё сделано за считанные минуты небольшим groovy-скриптом.

Напомню, что координаты объектов на Google-картах были известны. Используя сервис статических карт нужно было оснастить записи картинками. Вот как это сделано:

db = Sql.newInstance('jdbc:hsqldb:file:/path/to/db', 'SA', '', 'org.hsqldb.jdbc.JDBCDriver')

query = 'update name_descr_latlon set "mapimg"=? where "id"=?'

db.eachRow('select "id", "latlon" from name_descr_latlon where not ("latlon" is null) and "mapimg" is null'){ row ->
 println row.id
 url = new URL("http://maps.google.com/staticmap?markers=${row.latlon}&zoom=14&size=420x340")
 baos = new ByteArrayOutputStream()
 stream2stream(url.openStream(), baos)
 ba = baos.toByteArray()
 db.execute(query, [ba, row.id])
}


Задействованный здесь метод stream2stream() я уже публиковал на Мтааламу, но, чтобы далеко не лазить, приведу еще раз:

import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

import groovy.sql.Sql

def stream2stream = {is, os ->
 src  = Channels.newChannel(is);
 dest = Channels.newChannel(os);
 buffer = ByteBuffer.allocateDirect(16 * 1024);
 while (src.read(buffer) != -1) {
  buffer.flip();
  dest.write(buffer);
  buffer.compact();
 }
 buffer.flip();
 while (buffer.hasRemaining())dest.write(buffer);
}


Во избежание злоупотреблений, Google выдает за определенный небольшой промежуток времени не более 50 карт, так что скрипт пришлось запускать 3 раза с небольшими (пара минут) интервалами.
  • +12
  • 15 марта 2011, 10:45
  • yababay

Комментарии (4)

RSS свернуть / развернуть
+
0
Обалдеть !
avatar

Markony

  • 15 марта 2011, 16:13
+
0
а если еще добавить обработку http ошибок?
avatar

Sergei_T

  • 15 марта 2011, 16:46
+
+2
Можно, но это одноразовая программа, ее легче 3 раза перезапустить, чем дорабатывать. На то он и скриптовой язык — для решения сиюминутных задач. Quick, но отнюдь не Dirty, а очень даже культурно. Само написание заняло, кстати, минут 10-15.
avatar

yababay

  • 15 марта 2011, 22:04
+
0
Хороший скриптег ;)
avatar

Sergei_T

  • 15 марта 2011, 22:36

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.