@@ -101,39 +101,59 @@ + (instancetype)queryWithFormat:(NSString *)format arguments:(va_list)args
101101
102102 @try
103103 {
104- NSMutableDictionary *paramIndexToElementCountMap = [NSMutableDictionary dictionary ];
104+ NSMutableDictionary *paramIndexToArrayCountMap = [NSMutableDictionary dictionary ];
105105 for (NSUInteger i = 0 ; i < paramCount; i++)
106106 {
107107 id param = va_arg (args, id );
108108 if ([param isKindOfClass: [NSArray class ]])
109109 {
110- paramIndexToElementCountMap[@(i)] = @([param count ]);
111- [queryParameters addObjectsFromArray: param];
110+ NSUInteger arrayCount = [param count ];
111+ if (arrayCount == 0 )
112+ {
113+ [queryParameters addObject: [NSNull null ]];
114+ }
115+ else
116+ {
117+ paramIndexToArrayCountMap[@(i)] = @([param count ]);
118+ [queryParameters addObjectsFromArray: param];
119+ }
120+
112121 }
113122 else
114123 {
115124 [queryParameters addObject: param];
116125 }
117126 }
118127
119- if (paramIndexToElementCountMap .count > 0 )
128+ if (paramIndexToArrayCountMap .count > 0 )
120129 {
121- NSUInteger unpackingOffset = 0 ;
122- NSString *queryString = [format copy ];
123- NSRange range;
124- for (NSNumber *index in paramIndexToElementCountMap)
130+ NSMutableString *queryString = [format mutableCopy ];
131+
132+ __block NSUInteger unpackingOffset = 0 ;
133+
134+ [paramIndexToArrayCountMap enumerateKeysAndObjectsUsingBlock:
135+ ^(NSNumber *paramIndexNum, NSNumber *arrayCountNum, BOOL *stop)
125136 {
126- NSInteger elementCount = [paramIndexToElementCountMap[index] intValue ];
127- NSMutableArray *unpackedParams = [NSMutableArray array ];
128- for (NSInteger i = 0 ; i < elementCount; i++)
137+ NSUInteger arrayCount = [arrayCountNum unsignedIntegerValue ];
138+
139+ NSMutableString *unpackedParamsStr = [NSMutableString stringWithCapacity: (arrayCount * 2 )];
140+ for (NSUInteger i = 0 ; i < arrayCount; i++)
129141 {
130- [unpackedParams addObject: @" ?" ];
142+ if (i == 0 )
143+ [unpackedParamsStr appendString: @" ?" ];
144+ else
145+ [unpackedParamsStr appendString: @" ,?" ];
131146 }
132- NSString *unpackedParamsStr = [unpackedParams componentsJoinedByString: @" ," ];
133- range = NSMakeRange ([paramLocations[[index intValue ]] intValue ] + unpackingOffset, 1 );
134- queryString = [queryString stringByReplacingCharactersInRange: range
135- withString: unpackedParamsStr];
136- }
147+
148+ NSUInteger paramIndex = [paramIndexNum unsignedIntegerValue ];
149+ NSUInteger paramLocation = [paramLocations[paramIndex] unsignedIntegerValue ];
150+
151+ NSRange range = NSMakeRange (paramLocation + unpackingOffset, 1 );
152+ unpackingOffset += [unpackedParamsStr length ] - 1 ;
153+
154+ [queryString replaceCharactersInRange: range withString: unpackedParamsStr];
155+
156+ }];
137157
138158 format = [queryString copy ];
139159 }
0 commit comments