package com.robonobo.test;
import java.io.*;
import java.sql.*;
import java.util.*;
public class MidasDataLoader {
static final int NUM_USERS = 100;
static final int PLAYLISTS_PER_USER = 10;
static final int STREAMS_PER_PLAYLIST = 10;
static final String USER_SQL = "insert into users (userid, email, friendlyname, password, verified, updated, invitesleft, imgurl) values(?, ?, ?, ?, ?, ?, ?, ?)";
static final String PLAYLIST_SQL = "insert into playlists (playlistid, title, description, updated, visibility) values (?, ?, ?, ?, ?)";
static final String UP_SQL = "insert into playlistIdsInUser (userid, playlistid) values (?, ?)";
static final String PU_SQL = "insert into ownerIdsInPlaylist (playlistid, ownerid) values (?, ?)";
static final String STREAM_SQL = "insert into streamIdsInPlaylist (playlistid, streamid, listindex) values (?, ?, ?)";
String dbUrl;
String dbUser;
String dbPwd;
List<String> sids;
Random rand = new Random();
private static void printUsage() {
System.err.println("Usage: MidasDataLoader <db driver class> <db url> <db user> <db pwd> <sid file>");
}
public static void main(String[] args) throws Exception {
// First, share a bunch of tracks from a robonobo node to have midas read them into a db. Save the stream ids
// from these tracks into a file, one per line
if (args.length < 5) {
printUsage();
return;
}
String dbDriver = args[0];
String dbUrl = args[1];
String dbUser = args[2];
String dbPwd = args[3];
File sidFile = new File(args[4]);
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(sidFile)));
List<String> sids = new ArrayList<String>();
String line;
while ((line = in.readLine()) != null) {
sids.add(line);
}
in.close();
MidasDataLoader mdl = new MidasDataLoader(dbDriver, dbUrl, dbUser, dbPwd, sids);
mdl.run();
}
public MidasDataLoader(String dbDriver, String dbUrl, String dbUser, String dbPwd, List<String> sids)
throws Exception {
this.dbUrl = dbUrl;
this.dbUser = dbUser;
this.dbPwd = dbPwd;
this.sids = sids;
Class.forName(dbDriver);
}
public void run() throws SQLException {
Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
try {
for (int userNum = 0; userNum < NUM_USERS; userNum++) {
PreparedStatement userSt = conn.prepareStatement(USER_SQL);
int userId = 1000000 + userNum;
userSt.setLong(1, userId);
userSt.setString(2, "testuser-" + userNum + "@robonobo.com");
userSt.setString(3, "test user " + userNum);
userSt.setString(4, "password");
userSt.setBoolean(5, true);
userSt.setTimestamp(6, new Timestamp(System.currentTimeMillis()));
userSt.setInt(7, 100);
userSt.setString(8, "http://robonobo.com");
userSt.executeUpdate();
userSt.close();
for (int plNum = 0; plNum < PLAYLISTS_PER_USER; plNum++) {
PreparedStatement plSt = conn.prepareStatement(PLAYLIST_SQL);
long plId = 1000000 + (userId * 1000) + plNum;
plSt.setLong(1, plId);
plSt.setString(2, "Test Playlist " + plNum);
plSt.setString(3, "flarp");
plSt.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
plSt.setString(5, "all");
plSt.executeUpdate();
plSt.close();
PreparedStatement upSt = conn.prepareStatement(UP_SQL);
upSt.setLong(1, userId);
upSt.setLong(2, plId);
upSt.executeUpdate();
upSt.close();
PreparedStatement puSt = conn.prepareStatement(PU_SQL);
puSt.setLong(1, plId);
puSt.setLong(2, userId);
puSt.executeUpdate();
puSt.close();
Set<String> playlistSids = new HashSet<String>();
while (playlistSids.size() < STREAMS_PER_PLAYLIST) {
playlistSids.add(sids.get(rand.nextInt(sids.size())));
}
int trackNum = 0;
for (String sid : playlistSids) {
PreparedStatement trSt = conn.prepareStatement(STREAM_SQL);
trSt.setLong(1, plId);
trSt.setString(2, sid);
trSt.setInt(3, trackNum++);
trSt.executeUpdate();
trSt.close();
}
}
}
} catch (Exception e) {
conn.rollback();
throw new RuntimeException(e);
}
conn.close();
System.out.println("Done.");
}
}