303f18307b9eadf231f188f80c22755017dbd153
[debian/openrocket] / android / src / net / sf / openrocket / android / db / MotorDao.java
1 package net.sf.openrocket.android.db;\r
2 \r
3 import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
4 import net.sf.openrocket.motor.Manufacturer;\r
5 import net.sf.openrocket.motor.Motor;\r
6 import net.sf.openrocket.motor.ThrustCurveMotor;\r
7 import net.sf.openrocket.util.Coordinate;\r
8 import android.content.ContentValues;\r
9 import android.database.Cursor;\r
10 import android.database.SQLException;\r
11 import android.database.sqlite.SQLiteDatabase;\r
12 import android.util.Log;\r
13 \r
14 public class MotorDao {\r
15 \r
16         private static final String TAG = "MotorDao";\r
17 \r
18         private SQLiteDatabase mDb;\r
19 \r
20         private final static String DATABASE_TABLE = "motor";\r
21         private final static String DROP_TABLE = "DROP TABLE IF EXISTS " + DATABASE_TABLE;\r
22         private final static String CREATE_TABLE =\r
23                         "create table "+ DATABASE_TABLE + " ( " +\r
24                                         "_id integer primary key, "+\r
25                                         "unique_name text unique, "+\r
26                                         "designation text, "+\r
27                                         "delays blob, "+\r
28                                         "diameter number, "+\r
29                                         "tot_impulse_ns number, "+\r
30                                         "avg_thrust_n number, "+\r
31                                         "max_thrust_n number, "+\r
32                                         "burn_time_s number, "+\r
33                                         "length number," +\r
34                                         "prop_mass_g number,"+\r
35                                         "tot_mass_g number,"+\r
36                                         "case_info text,"+\r
37                                         "manufacturer text," +\r
38                                         "type text," +\r
39                                         "impulse_class text," +\r
40                                         "thrust_data blob,"+\r
41                                         "time_data blob," +\r
42                                         "cg_data blob"+\r
43                                         ");";\r
44 \r
45         MotorDao( SQLiteDatabase mDb ) {\r
46                 this.mDb = mDb;\r
47         }\r
48 \r
49         static String[] create() { return new String[] {CREATE_TABLE}; }\r
50 \r
51         static String[] update( int oldVer, int newVer ) {\r
52                 return new String[] { DROP_TABLE, CREATE_TABLE };\r
53         }\r
54 \r
55         public final static String ID = "_id";\r
56         public final static String UNIQUE_NAME = "unique_name";\r
57         public final static String DESIGNATION = "designation";\r
58         public final static String DELAYS = "delays";\r
59         public final static String DIAMETER = "diameter";\r
60         public final static String TOTAL_IMPULSE = "tot_impulse_ns"; \r
61         public final static String AVG_THRUST = "avg_thrust_n";\r
62         public final static String MAX_THRUST = "max_thrust_n";\r
63         public final static String BURN_TIME = "burn_time_s";\r
64         public final static String LENGTH = "length";\r
65         public final static String CASE_INFO = "case_info";\r
66         public final static String MANUFACTURER = "manufacturer";\r
67         public final static String TYPE = "type";\r
68         public final static String IMPULSE_CLASS = "impulse_class";\r
69         public final static String THRUST_DATA = "thrust_data";\r
70         public final static String TIME_DATA = "time_data";\r
71         public final static String CG_DATA = "cg_data";\r
72 \r
73         private final static String[] ALL_COLS = new String[] {\r
74                 ID,\r
75                 DESIGNATION ,\r
76                 DELAYS ,\r
77                 DIAMETER ,\r
78                 TOTAL_IMPULSE ,\r
79                 AVG_THRUST ,\r
80                 MAX_THRUST ,\r
81                 BURN_TIME ,\r
82                 LENGTH,\r
83                 CASE_INFO,\r
84                 TYPE,\r
85                 IMPULSE_CLASS,\r
86                 MANUFACTURER,\r
87                 THRUST_DATA,\r
88                 TIME_DATA,\r
89                 CG_DATA\r
90         };\r
91 \r
92         public long insertOrUpdateMotor(ExtendedThrustCurveMotor mi) throws Exception {\r
93                 ContentValues initialValues = new ContentValues();\r
94                 final ThrustCurveMotor tcm = mi.getThrustCurveMotor();\r
95                 initialValues.put(ID, mi.getId());\r
96                 initialValues.put(UNIQUE_NAME, tcm.getManufacturer()+tcm.getDesignation());\r
97                 initialValues.put(DESIGNATION, tcm.getDesignation());\r
98                 initialValues.put(DELAYS, ConversionUtils.serializeArrayOfDouble(tcm.getStandardDelays()));\r
99                 initialValues.put(DIAMETER,tcm.getDiameter());\r
100                 initialValues.put(TOTAL_IMPULSE,tcm.getTotalImpulseEstimate());\r
101                 initialValues.put(AVG_THRUST,tcm.getAverageThrustEstimate());\r
102                 initialValues.put(MAX_THRUST,tcm.getMaxThrustEstimate());\r
103                 initialValues.put(BURN_TIME,tcm.getBurnTimeEstimate());\r
104                 initialValues.put(LENGTH, tcm.getLength());\r
105                 initialValues.put(CASE_INFO, mi.getCaseInfo());\r
106                 initialValues.put(TYPE, tcm.getMotorType().getName());\r
107                 initialValues.put(IMPULSE_CLASS,mi.getImpulseClass());\r
108                 initialValues.put(MANUFACTURER,tcm.getManufacturer().getSimpleName());\r
109                 initialValues.put(THRUST_DATA, ConversionUtils.serializeArrayOfDouble(tcm.getThrustPoints()));\r
110                 initialValues.put(TIME_DATA,ConversionUtils.serializeArrayOfDouble(tcm.getTimePoints()));\r
111                 initialValues.put(CG_DATA,ConversionUtils.serializeArrayOfCoordinate(tcm.getCGPoints()));\r
112 \r
113                 Log.d(TAG,"insertOrUpdate Motor");\r
114                 long rv = mDb.insertWithOnConflict(DATABASE_TABLE, null, initialValues,SQLiteDatabase.CONFLICT_REPLACE);\r
115                 return rv;\r
116         }\r
117 \r
118         /**\r
119          * Delete the motor and burn data with the given rowId\r
120          * \r
121          * @param name name of motor to delete\r
122          * @return true if deleted, false otherwise\r
123          */\r
124         public boolean deleteMotor(Long id) {\r
125 \r
126                 boolean rv =  mDb.delete(DATABASE_TABLE, ID + "=" + id, null) > 0;\r
127                 return rv;\r
128         }\r
129 \r
130         /**\r
131          * \r
132          * @param groupCol\r
133          * @param groupVal\r
134          * @return\r
135          */\r
136         public Cursor fetchAllInGroups( String groupCol, String groupVal ) {\r
137                 return mDb.query(DATABASE_TABLE, \r
138                                 /* columns */ ALL_COLS,\r
139                                 /* selection */groupCol + "=?",\r
140                                 /* selection args*/new String[] {groupVal},\r
141                                 /* groupby */null,\r
142                                 /* having*/null,\r
143                                 /* orderby*/ DESIGNATION );\r
144 \r
145         }\r
146 \r
147         /**\r
148          * Fetch the groups based on groupCol\r
149          * @param groupCol\r
150          * @return\r
151          */\r
152         public Cursor fetchGroups( String groupCol ) {\r
153                 return mDb.query(true, DATABASE_TABLE, \r
154                                 /* columns */new String[] {\r
155                                 groupCol\r
156                 },\r
157                 /* selection */null,\r
158                 /* selection args*/null,\r
159                 /* groupby */null,\r
160                 /* having*/null,\r
161                 /* orderby*/null,\r
162                 /* limit*/ null);\r
163 \r
164         }\r
165 \r
166         /**\r
167          * Return a Cursor over the list of all motors\r
168          * \r
169          * @return Cursor over all notes\r
170          */\r
171         public Cursor fetchAllMotors() {\r
172 \r
173                 return mDb.query(DATABASE_TABLE,\r
174                                 /* columns */ ALL_COLS,\r
175                                 /* selection */null,\r
176                                 /* selection args*/null,\r
177                                 /* groupby */null,\r
178                                 /* having*/null,\r
179                                 /* orderby*/null);\r
180         }\r
181 \r
182         private ExtendedThrustCurveMotor hydrateMotor( Cursor mCursor ) throws Exception {\r
183                 ExtendedThrustCurveMotor mi = new ExtendedThrustCurveMotor();\r
184 \r
185                 mi.setId(mCursor.getLong(mCursor.getColumnIndex(ID)));\r
186                 mi.setCaseInfo(mCursor.getString(mCursor.getColumnIndex(CASE_INFO)));\r
187                 mi.setImpulseClass(mCursor.getString(mCursor.getColumnIndex(IMPULSE_CLASS)));\r
188 \r
189                 {\r
190                         String designation = mCursor.getString(mCursor.getColumnIndex(DESIGNATION));\r
191                         double[] delays = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(DELAYS)));\r
192                         double diameter = mCursor.getDouble(mCursor.getColumnIndex(DIAMETER));\r
193                         double totImpulse = mCursor.getDouble(mCursor.getColumnIndex(TOTAL_IMPULSE));\r
194                         double avgImpulse = mCursor.getDouble(mCursor.getColumnIndex(AVG_THRUST));\r
195                         double maxThrust = mCursor.getDouble(mCursor.getColumnIndex(MAX_THRUST));\r
196                         double length = mCursor.getDouble(mCursor.getColumnIndex(LENGTH));\r
197                         Motor.Type type = Motor.Type.fromName( mCursor.getString(mCursor.getColumnIndex(TYPE)));\r
198                         Manufacturer manufacturer = Manufacturer.getManufacturer( mCursor.getString( mCursor.getColumnIndex(MANUFACTURER)));\r
199                         double[] thrustData = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(THRUST_DATA)));\r
200                         double[] timeData = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(TIME_DATA)));\r
201                         Coordinate[] cgData = ConversionUtils.deserializeArrayOfCoordinate( mCursor.getBlob(mCursor.getColumnIndex(CG_DATA)));\r
202 \r
203                         ThrustCurveMotor tcm = new ThrustCurveMotor(manufacturer,\r
204                                         designation,\r
205                                         "",\r
206                                         type,\r
207                                         delays,\r
208                                         diameter,\r
209                                         length,\r
210                                         timeData,\r
211                                         thrustData,\r
212                                         cgData\r
213                                         );\r
214                         mi.setThrustCurveMotor(tcm);\r
215                 }\r
216                 return mi;\r
217 \r
218         }\r
219 \r
220         public ExtendedThrustCurveMotor fetchMotor(Long id ) throws Exception {\r
221                 Cursor mCursor = mDb.query(DATABASE_TABLE, \r
222                                 /* columns */ ALL_COLS,\r
223                                 /* selection */ID + "="+id,\r
224                                 /* selection args*/null,\r
225                                 /* groupby */null,\r
226                                 /* having*/null,\r
227                                 /* orderby*/null);\r
228                 if ( mCursor == null ) {\r
229                         return null;\r
230                 }\r
231                 try {\r
232                         if (mCursor.getCount() == 0) {\r
233                                 return null;\r
234                         }\r
235                         mCursor.moveToFirst();\r
236                         return hydrateMotor(mCursor);\r
237                 }\r
238                 finally {\r
239                         mCursor.close();\r
240                 }\r
241 \r
242         }\r
243 \r
244         public ExtendedThrustCurveMotor fetchMotor(String manufacturerShortName, String designation ) throws Exception {\r
245                 Cursor mCursor = mDb.query(DATABASE_TABLE, \r
246                                 /* columns */ ALL_COLS,\r
247                                 /* selection */MANUFACTURER + "='"+manufacturerShortName + "' and "+DESIGNATION+"='"+designation+"'",\r
248                                 /* selection args*/null,\r
249                                 /* groupby */null,\r
250                                 /* having*/null,\r
251                                 /* orderby*/null);\r
252                 if ( mCursor == null ) {\r
253                         return null;\r
254                 }\r
255                 try {\r
256                         if (mCursor.getCount() == 0) {\r
257                                 return null;\r
258                         }\r
259                         mCursor.moveToFirst();\r
260                         return hydrateMotor(mCursor);\r
261                 }\r
262                 finally {\r
263                         mCursor.close();\r
264                 }\r
265 \r
266         }\r
267         \r
268         public static String extractPrettyDelayString( Cursor c ) {\r
269                 byte[] blob = c.getBlob(c.getColumnIndex(MotorDao.DELAYS));\r
270                 String s = "";\r
271                 try {\r
272                         double[] delayarry = ConversionUtils.deserializeArrayOfDouble(blob);\r
273                         boolean first = true;\r
274                         for( double d:delayarry ) {\r
275                                 if (!first) {\r
276                                         s += ",";\r
277                                 } else {\r
278                                         first = false;\r
279                                 }\r
280                                 if ( d == Motor.PLUGGED ) {\r
281                                         s+= "P";\r
282                                 } else {\r
283                                         s += Math.round(d);\r
284                                 }\r
285                         }\r
286                 } catch ( Exception ex ) {\r
287                 }\r
288                 return s;\r
289         }\r
290         \r
291 }\r